/* * Copyright (c) 2023 Proton AG * * This file is part of ProtonVPN. * * ProtonVPN is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ProtonVPN is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ProtonVPN. If not, see . */ using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; using NSubstitute; using ProtonVPN.Client.Logic.Connection.Contracts; using ProtonVPN.Client.Settings.Contracts; using ProtonVPN.Configurations.Contracts; using ProtonVPN.Configurations.Contracts.Entities; namespace ProtonVPN.Api.Tests; [TestClass] public class ApiHostProviderTest { private const string API_HOST = "api.protonvpn.ch"; private const string API_URL = "https://" + API_HOST; private const string PROXY_HOST = "alternative.api.url"; private IConfiguration _config; private ISettings _settings; private IConnectionManager _connectionManager; [TestInitialize] public void Initialize() { _config = CreateConfiguration(); _settings = Substitute.For(); _connectionManager = Substitute.For(); } private IConfiguration CreateConfiguration() { IUrlsConfiguration urlsConfig = Substitute.For(); urlsConfig.ApiUrl.Returns(API_URL); IConfiguration config = Substitute.For(); config.Urls.Returns(urlsConfig); return config; } [TestCleanup] public void Cleanup() { _config = null; _settings = null; } [TestMethod] public void ItShouldReturnAlternativeApiHostWhenProxyIsActivated() { // Arrange _settings.IsAlternativeRoutingEnabled.Returns(true); _settings.ActiveAlternativeApiBaseUrl.Returns(PROXY_HOST); _connectionManager.IsDisconnected.Returns(true); ApiHostProvider sut = new(_settings, _config, _connectionManager); // Assert sut.IsProxyActive().Should().BeTrue(); } [TestMethod] public void ProxyShouldBeDisabledWhenConnectedToVpn() { // Arrange _settings.IsAlternativeRoutingEnabled.Returns(true); _settings.ActiveAlternativeApiBaseUrl.Returns(PROXY_HOST); _connectionManager.IsDisconnected.Returns(false); ApiHostProvider sut = new(_settings, _config, _connectionManager); // Assert sut.IsProxyActive().Should().BeFalse(); } [TestMethod] public void ProxyShouldBeDisabledWhenAlternativeHostIsEmpty() { // Arrange _settings.IsAlternativeRoutingEnabled.Returns(true); _settings.ActiveAlternativeApiBaseUrl.Returns(string.Empty); _connectionManager.IsDisconnected.Returns(true); ApiHostProvider sut = new(_settings, _config, _connectionManager); // Assert sut.IsProxyActive().Should().BeFalse(); } [TestMethod] public void ItShouldReturnAlternativeHostWhenProxyIsActive() { // Arrange _config.Urls.ApiUrl.Returns(API_URL); _settings.ActiveAlternativeApiBaseUrl.Returns(PROXY_HOST); _settings.IsAlternativeRoutingEnabled.Returns(true); _connectionManager.IsDisconnected.Returns(true); ApiHostProvider sut = new(_settings, _config, _connectionManager); // Assert sut.GetBaseUri().Should().Be($"https://{PROXY_HOST}/"); } [TestMethod] public void ItShouldReturnApiHostWhenProxyIsDisabled() { // Arrange _config.Urls.ApiUrl.Returns(API_URL); _settings.ActiveAlternativeApiBaseUrl.Returns(PROXY_HOST); _settings.IsAlternativeRoutingEnabled.Returns(false); ApiHostProvider sut = new(_settings, _config, _connectionManager); // Assert sut.GetBaseUri().Should().Be($"https://{API_HOST}/"); } }