diff --git a/CHANGELOG.md b/CHANGELOG.md index df3f26ad11..c9d49b5249 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file. - [GUI] Show recommendations of installed modules in GUI (#2577 by HebaruSan; reviewed: politas) - [GUI] Remove newline from Done progress message (#2580 by HebaruSan; reviewed: politas) - [GUI] Set window properties on X11 (#2586 by: HebaruSan; reviewed: politas) +- [Build] Add tests for recent changes (#2583 by: HebaruSan; reviewed: politas) ### Bugfixes diff --git a/Netkan/Transformers/AvcKrefTransformer.cs b/Netkan/Transformers/AvcKrefTransformer.cs index 4db2249d21..f98d8feeb4 100644 --- a/Netkan/Transformers/AvcKrefTransformer.cs +++ b/Netkan/Transformers/AvcKrefTransformer.cs @@ -2,6 +2,7 @@ using CKAN.NetKAN.Extensions; using CKAN.NetKAN.Model; using CKAN.NetKAN.Sources.Avc; +using CKAN.NetKAN.Services; using log4net; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -16,8 +17,12 @@ internal sealed class AvcKrefTransformer : ITransformer private static readonly ILog Log = LogManager.GetLogger(typeof(AvcKrefTransformer)); public string Name { get { return "avc-kref"; } } + private IHttpService httpSvc; - public AvcKrefTransformer() { } + public AvcKrefTransformer(IHttpService http) + { + httpSvc = http; + } public Metadata Transform(Metadata metadata) { @@ -29,7 +34,7 @@ public Metadata Transform(Metadata metadata) Log.DebugFormat("Input metadata:{0}{1}", Environment.NewLine, json); AvcVersion remoteAvc = JsonConvert.DeserializeObject( - Net.DownloadText(new Uri(metadata.Kref.Id)) + httpSvc.DownloadText(new Uri(metadata.Kref.Id)) ); json.SafeAdd("name", remoteAvc.Name); diff --git a/Netkan/Transformers/NetkanTransformer.cs b/Netkan/Transformers/NetkanTransformer.cs index e7a22f35a6..7f18e4296b 100644 --- a/Netkan/Transformers/NetkanTransformer.cs +++ b/Netkan/Transformers/NetkanTransformer.cs @@ -33,7 +33,7 @@ bool prerelease new GithubTransformer(new GithubApi(githubToken), prerelease), new HttpTransformer(), new JenkinsTransformer(http), - new AvcKrefTransformer(), + new AvcKrefTransformer(http), new InternalCkanTransformer(http, moduleService), new AvcTransformer(http, moduleService), new VersionEditTransformer(), diff --git a/Tests/Core/Cache.cs b/Tests/Core/Cache.cs index 944a787501..6c0f5b7bfe 100644 --- a/Tests/Core/Cache.cs +++ b/Tests/Core/Cache.cs @@ -175,5 +175,54 @@ public void ZipValidation() Assert.IsTrue(cache.IsCached(url)); Assert.IsTrue(cache.IsCachedZip(url)); } + + [Test] + public void ZipValid_ContainsFilenameWithBadChars_NoException() + { + bool valid = false; + string reason = ""; + Assert.DoesNotThrow(() => + valid = NetFileCache.ZipValid(TestData.ZipWithBadChars, out reason)); + + // The file is considered valid on Linux; + // only check the reason if found invalid + if (!valid) + { + Assert.AreEqual(reason, "Illegal characters in path."); + } + } + + [Test] + public void EnforceSizeLimit_UnderLimit_FileRetained() + { + // Arrange + CKAN.Registry registry = CKAN.Registry.Empty(); + long fileSize = new FileInfo(TestData.DogeCoinFlagZip()).Length; + + // Act + Uri url = new Uri("http://kitte.nz/"); + cache.Store(url, TestData.DogeCoinFlagZip()); + cache.EnforceSizeLimit(fileSize + 100, registry); + + // Assert + Assert.IsTrue(cache.IsCached(url)); + } + + [Test] + public void EnforceSizeLimit_OverLimit_FileRemoved() + { + // Arrange + CKAN.Registry registry = CKAN.Registry.Empty(); + long fileSize = new FileInfo(TestData.DogeCoinFlagZip()).Length; + + // Act + Uri url = new Uri("http://kitte.nz/"); + cache.Store(url, TestData.DogeCoinFlagZip()); + cache.EnforceSizeLimit(fileSize - 100, registry); + + // Assert + Assert.IsFalse(cache.IsCached(url)); + } + } } diff --git a/Tests/Data/TestData.cs b/Tests/Data/TestData.cs index eb53e6247f..dc6c659e8e 100644 --- a/Tests/Data/TestData.cs +++ b/Tests/Data/TestData.cs @@ -110,14 +110,19 @@ public static string DogeCoinFlag_101_LZMA() "; } - public static CkanModule DogeCoinFlag_101_LZMA_module = CkanModule.FromJson( + public static readonly CkanModule DogeCoinFlag_101_LZMA_module = CkanModule.FromJson( DogeCoinFlag_101_LZMA() ); /// /// Test case for LZMA-format ZIPs /// - public static string DogeCoinFlagZipLZMA = Path.Combine(DataDir(), "DogeCoinFlag-1.01-LZMA.zip"); + public static readonly string DogeCoinFlagZipLZMA = DataDir("DogeCoinFlag-1.01-LZMA.zip"); + + /// + /// Contains files with names that include characters that aren't allowed on Windows + /// + public static readonly string ZipWithBadChars = DataDir("ZipWithBadChars.zip"); /// /// DogeCoinFlag 1.01 info. This contains a bug where the diff --git a/Tests/Data/ZipWithBadChars.zip b/Tests/Data/ZipWithBadChars.zip new file mode 100644 index 0000000000..79319bb166 Binary files /dev/null and b/Tests/Data/ZipWithBadChars.zip differ diff --git a/Tests/NetKAN/AVC.cs b/Tests/NetKAN/AVC.cs index 0b4833b443..c62eac2896 100644 --- a/Tests/NetKAN/AVC.cs +++ b/Tests/NetKAN/AVC.cs @@ -56,6 +56,7 @@ public void WildcardMinor_VersionOnlyHasMajor() var result = (KspVersion) converter.ReadJson(reader, null, null, null); Assert.That(result, Is.EqualTo(KspVersion.Parse("1"))); } + [Test] public void WildcardPatch_VersionOnlyHasMajorMinor() { @@ -65,5 +66,36 @@ public void WildcardPatch_VersionOnlyHasMajorMinor() var result = (KspVersion)converter.ReadJson(reader, null, null, null); Assert.That(result, Is.EqualTo(KspVersion.Parse("1.5"))); } + + [Test] + public void MissingMajor_OutputsAnyVersion() + { + var converter = new JsonAvcToKspVersion(); + string json = @"{}"; + var reader = new JsonTextReader(new StringReader(json)); + var result = (KspVersion) converter.ReadJson(reader, null, null, null); + Assert.That(!result.IsMajorDefined); + } + + [Test] + public void MissingMinor_VersionOnlyHasMajor() + { + var converter = new JsonAvcToKspVersion(); + string json = @"{""MAJOR"":1}"; + var reader = new JsonTextReader(new StringReader(json)); + var result = (KspVersion) converter.ReadJson(reader, null, null, null); + Assert.That(result, Is.EqualTo(KspVersion.Parse("1"))); + } + + [Test] + public void MissingPatch_VersionOnlyHasMajorMinor() + { + var converter = new JsonAvcToKspVersion(); + string json = @"{""MAJOR"":1, ""MINOR"":5}"; + var reader = new JsonTextReader(new StringReader(json)); + var result = (KspVersion)converter.ReadJson(reader, null, null, null); + Assert.That(result, Is.EqualTo(KspVersion.Parse("1.5"))); + } + } -} \ No newline at end of file +} diff --git a/Tests/NetKAN/Transformers/AvcKrefTransformerTests.cs b/Tests/NetKAN/Transformers/AvcKrefTransformerTests.cs new file mode 100644 index 0000000000..fced73dcb5 --- /dev/null +++ b/Tests/NetKAN/Transformers/AvcKrefTransformerTests.cs @@ -0,0 +1,72 @@ +using System; +using NUnit.Framework; +using Newtonsoft.Json.Linq; +using Moq; +using CKAN.NetKAN.Services; +using CKAN.NetKAN.Model; +using CKAN.NetKAN.Transformers; + +namespace Tests.NetKAN.Transformers +{ + [TestFixture] + public sealed class AvcKrefTransformerTests + { + [Test, + TestCase( + "https://mysite.org/AwesomeMod.version", + "1.0.0", + "1.4.1", + "https://mysite.org/AwesomeMod.zip", + @"{ + ""NAME"": ""AwesomeMod"", + ""URL"": ""https://mysite.org/AwesomeMod.version"", + ""DOWNLOAD"": ""https://mysite.org/AwesomeMod.zip"", + ""VERSION"": { + ""MAJOR"": 1, + ""MINOR"": 0, + ""PATCH"": 0 + }, + ""KSP_VERSION"": { + ""MAJOR"": 1, + ""MINOR"": 4, + ""PATCH"": 1 + } + }" + ) + ] + public void Transform_SimpleVersionFile_PropertiesSet(string remoteUrl, string version, string kspVersion, string download, string remoteAvc) + { + // Arrange + var mHttp = new Mock(); + mHttp.Setup(i => i.DownloadText(It.IsAny())) + .Returns(remoteAvc); + + // Act + Metadata m = null; + Assert.DoesNotThrow(() => m = TryKref(mHttp.Object, $"#/ckan/ksp-avc/{remoteUrl}")); + + // Assert + var json = m.Json(); + Assert.AreEqual((string)json["version"], version); + Assert.AreEqual((string)json["ksp_version"], kspVersion); + Assert.AreEqual((string)json["download"], download); + } + + private Metadata TryKref(IHttpService http, string kref) + { + // Arrange + var json = new JObject(); + json["spec_version"] = 1; + json["identifier"] = "AwesomeMod"; + if (kref != null) + { + json["$kref"] = kref; + } + + // Act + var tran = new AvcKrefTransformer(http); + return tran.Transform(new Metadata(json)); + } + + } +} diff --git a/Tests/NetKAN/Transformers/AvcTransformerTests.cs b/Tests/NetKAN/Transformers/AvcTransformerTests.cs index 8279435a60..c35d69eeae 100644 --- a/Tests/NetKAN/Transformers/AvcTransformerTests.cs +++ b/Tests/NetKAN/Transformers/AvcTransformerTests.cs @@ -151,6 +151,21 @@ public void PreferentiallyAddsRangedKspVersionInfo() "1.0.2", "1.0.3", "1.0.4", null, "1.0.0", "1.0.4" )] + [TestCase( + null, null, null, + "1.5.1", "1.5.1", null, + null, "1.5.1", null + )] + [TestCase( + null, null, null, + "1.5.1", null, "1.5.1", + null, null, "1.5.1" + )] + [TestCase( + "any", null, null, + null, null, null, + "any", null, null + )] public void CorrectlyCalculatesKspVersionInfo( string existingKsp, string existingKspMin, string existingKspMax, string avcKsp, string avcKspMin, string avcKspMax, diff --git a/Tests/NetKAN/Validators/KrefValidatorTests.cs b/Tests/NetKAN/Validators/KrefValidatorTests.cs new file mode 100644 index 0000000000..595b4921ff --- /dev/null +++ b/Tests/NetKAN/Validators/KrefValidatorTests.cs @@ -0,0 +1,52 @@ +using NUnit.Framework; +using Newtonsoft.Json.Linq; +using CKAN.NetKAN.Model; +using CKAN.NetKAN.Validators; + +namespace Tests.NetKAN.Validators +{ + [TestFixture] + public sealed class KrefValidatorTests + { + [Test, + TestCase(null), + TestCase("#/ckan/curse/12345"), + TestCase("#/ckan/github/AGoodModder/AGoodMod"), + TestCase("#/ckan/http/https://mysite.org/AGoodMod.zip"), + TestCase("#/ckan/ksp-avc/https://mysite.org/AGoodMod.version"), + TestCase("#/ckan/netkan/https://mysite.org/AGoodMod.netkan"), + TestCase("#/ckan/jenkins/https://mysite.org/AGoodMod/"), + TestCase("#/ckan/spacedock/12345") + ] + public void Validate_KnownKref_Valid(string kref) + { + Assert.DoesNotThrow(() => TryKref(kref)); + } + + [Test, + TestCase("#/ckan/techman/iscool"), + TestCase("#/ckan/spaceport/305") + ] + public void Validate_TechManIsCool_Invalid(string kref) + { + Assert.Throws(() => TryKref(kref)); + } + + private void TryKref(string kref) + { + // Arrange + var json = new JObject(); + json["spec_version"] = 1; + json["identifier"] = "AwesomeMod"; + if (kref != null) + { + json["$kref"] = kref; + } + + // Act + var val = new KrefValidator(); + val.Validate(new Metadata(json)); + } + + } +} diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index 725f10ed76..81c22dd441 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -113,6 +113,7 @@ + @@ -130,6 +131,7 @@ + @@ -211,4 +213,4 @@ - \ No newline at end of file +