/* * 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 Microsoft.VisualStudio.TestTools.UnitTesting; using NSubstitute; using ProtonVPN.Serialization.Contracts; using ProtonVPN.Serialization.Contracts.Json; using ProtonVPN.Serialization.Json; using ProtonVPN.Serialization.Tests.Mocks; namespace ProtonVPN.Serialization.Tests; [TestClass] public class ContractDeserializationJsonConverterTest { [TestMethod] public void CanConvert() { // Arrange List interfaceImplementations1 = new() { InterfaceImplementation.Create(), InterfaceImplementation.Create(), }; IJsonContractDeserializer jsonContractDeserializer1 = Substitute.For(); jsonContractDeserializer1.Get().Returns(interfaceImplementations1); List interfaceImplementations2 = new() { InterfaceImplementation.Create(), InterfaceImplementation.Create(), }; IJsonContractDeserializer jsonContractDeserializer2 = Substitute.For(); jsonContractDeserializer2.Get().Returns(interfaceImplementations2); List jsonContractDeserializers = new() { jsonContractDeserializer1, jsonContractDeserializer2, }; ContractDeserializationJsonConverter jsonConverter = new(jsonContractDeserializers); // Act and Assert for each Assert.IsTrue(jsonConverter.CanConvert(typeof(ISubscription))); Assert.IsTrue(jsonConverter.CanConvert(typeof(IUser))); Assert.IsTrue(jsonConverter.CanConvert(typeof(IMachine))); Assert.IsTrue(jsonConverter.CanConvert(typeof(ICacheFile))); Assert.IsFalse(jsonConverter.CanConvert(typeof(IDevice))); } [TestMethod] public void CanConvert_FailsWithDuplicateContractsFromDifferentJsonContractDeserializers() { // Arrange List interfaceImplementations1 = new() { InterfaceImplementation.Create(), InterfaceImplementation.Create(), InterfaceImplementation.Create(), }; IJsonContractDeserializer jsonContractDeserializer1 = Substitute.For(); jsonContractDeserializer1.Get().Returns(interfaceImplementations1); List interfaceImplementations2 = new() { InterfaceImplementation.Create(), InterfaceImplementation.Create(), InterfaceImplementation.Create(), }; IJsonContractDeserializer jsonContractDeserializer2 = Substitute.For(); jsonContractDeserializer2.Get().Returns(interfaceImplementations2); List jsonContractDeserializers = new() { jsonContractDeserializer1, jsonContractDeserializer2, }; // Act Exception exception = Assert.Throws(() => new ContractDeserializationJsonConverter(jsonContractDeserializers)); Assert.IsTrue(exception.Message.Equals($"There is more than a single JSON deserialization implementation" + $"for the contract {typeof(ISubscription).FullName}.")); } [TestMethod] public void CanConvert_FailsWithDuplicateContractsFromSameJsonContractDeserializer() { // Arrange List interfaceImplementations = new() { InterfaceImplementation.Create(), InterfaceImplementation.Create(), InterfaceImplementation.Create(), InterfaceImplementation.Create(), InterfaceImplementation.Create(), }; IJsonContractDeserializer jsonContractDeserializer = Substitute.For(); jsonContractDeserializer.Get().Returns(interfaceImplementations); List jsonContractDeserializers = new() { jsonContractDeserializer, }; // Act Exception exception = Assert.Throws(() => new ContractDeserializationJsonConverter(jsonContractDeserializers)); Assert.IsTrue(exception.Message.Equals($"There is more than a single JSON deserialization implementation" + $"for the contract {typeof(IDevice).FullName}.")); } }