From ae38cfc93f1f5e7fde667451a33109fa908ecf03 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Tue, 12 Nov 2024 14:15:55 +0700 Subject: [PATCH 01/12] Validate WritingSystemIds on creation Special ID "default" is allowed, all other writing system IDs must be considered valid by the SIL.WritingSystems validation logic. --- backend/FwLite/MiniLcm/MiniLcm.csproj | 1 + .../FwLite/MiniLcm/Models/WritingSystemId.cs | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/backend/FwLite/MiniLcm/MiniLcm.csproj b/backend/FwLite/MiniLcm/MiniLcm.csproj index dbdbf9ad8..8f4dc0c48 100644 --- a/backend/FwLite/MiniLcm/MiniLcm.csproj +++ b/backend/FwLite/MiniLcm/MiniLcm.csproj @@ -9,6 +9,7 @@ </PropertyGroup> <ItemGroup> + <PackageReference Include="SIL.WritingSystems" Version="14.2.0-beta*" /> <PackageReference Include="System.Text.Json" Version="8.0.5" /> <PackageReference Include="SystemTextJsonPatch" Version="3.2.1" /> </ItemGroup> diff --git a/backend/FwLite/MiniLcm/Models/WritingSystemId.cs b/backend/FwLite/MiniLcm/Models/WritingSystemId.cs index 670b88753..10f72bb75 100644 --- a/backend/FwLite/MiniLcm/Models/WritingSystemId.cs +++ b/backend/FwLite/MiniLcm/Models/WritingSystemId.cs @@ -1,5 +1,6 @@ using System.Text.Json; using System.Text.Json.Serialization; +using SIL.WritingSystems; namespace MiniLcm.Models; @@ -26,11 +27,26 @@ public override void WriteAsPropertyName(Utf8JsonWriter writer, WritingSystemId } [JsonConverter(typeof(WritingSystemIdJsonConverter))] -public readonly record struct WritingSystemId(string Code): ISpanFormattable, ISpanParsable<WritingSystemId> +public readonly record struct WritingSystemId: ISpanFormattable, ISpanParsable<WritingSystemId> { + public string Code { get; init; } + + public WritingSystemId(string code) + { + if (code == "default" || IetfLanguageTag.IsValid(code)) + { + Code = code; + } + else + { + throw new ArgumentException($"Invalid writing system ID {code}", nameof(code)); + } + } + public static implicit operator string(WritingSystemId ws) => ws.Code; public static implicit operator WritingSystemId(string code) => new(code); public static implicit operator WritingSystemId(ReadOnlySpan<char> code) => new(new string(code)); + public override string ToString() { return Code; From 30bdc0f082b026909150a968627071f23df9815b Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Tue, 12 Nov 2024 14:43:30 +0700 Subject: [PATCH 02/12] Teach AutoFaker.Generate about valid writing systems Now when AutoFaker.Generate creates a random writing system ID, it will be chosen from the list of all valid 2-letter writing system IDs. --- .../Fixtures/MultiStringOverride.cs | 5 +- .../LcmCrdt.Tests/MultiStringOverride.cs | 5 +- .../MiniLcm.Tests/WritingSystemCodes.cs | 190 ++++++++++++++++++ 3 files changed, 196 insertions(+), 4 deletions(-) create mode 100644 backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs diff --git a/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs b/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs index cb6af2072..4a1110707 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs @@ -1,4 +1,4 @@ -using MiniLcm.Models; +using MiniLcm.Models; using Soenneker.Utils.AutoBogus.Context; using Soenneker.Utils.AutoBogus.Override; @@ -16,7 +16,8 @@ public override void Generate(AutoFakerOverrideContext context) var wordsArray = context.Faker.Random.WordsArray(1, 4); foreach (var word in wordsArray) { - target[context.Faker.Random.String(2, 'a', 'z')] = word; + var ws = context.Faker.PickRandom(MiniLcm.Tests.WritingSystemCodes.ValidTwoLetterCodes); + target[ws] = word; } } } diff --git a/backend/FwLite/LcmCrdt.Tests/MultiStringOverride.cs b/backend/FwLite/LcmCrdt.Tests/MultiStringOverride.cs index ec6eb3752..5fc5326fa 100644 --- a/backend/FwLite/LcmCrdt.Tests/MultiStringOverride.cs +++ b/backend/FwLite/LcmCrdt.Tests/MultiStringOverride.cs @@ -1,4 +1,4 @@ -using MiniLcm.Models; +using MiniLcm.Models; using Soenneker.Utils.AutoBogus.Context; using Soenneker.Utils.AutoBogus.Override; @@ -16,7 +16,8 @@ public override void Generate(AutoFakerOverrideContext context) var wordsArray = context.Faker.Random.WordsArray(1, 4); foreach (var word in wordsArray) { - target[context.Faker.Random.String(2, 'a', 'z')] = word; + var ws = context.Faker.PickRandom(WritingSystemCodes.ValidTwoLetterCodes); + target[ws] = word; } } } diff --git a/backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs b/backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs new file mode 100644 index 000000000..f2632b1b9 --- /dev/null +++ b/backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs @@ -0,0 +1,190 @@ +namespace MiniLcm.Tests; + +public static class WritingSystemCodes +{ + public static string[] ValidTwoLetterCodes = [ + "aa", + "ab", + "ae", + "af", + "ak", + "am", + "an", + "ar", + "as", + "av", + "ay", + "az", + "ba", + "be", + "bg", + "bi", + "bm", + "bn", + "bo", + "br", + "bs", + "ca", + "ce", + "ch", + "co", + "cr", + "cs", + "cu", + "cv", + "cy", + "da", + "de", + "dv", + "dz", + "ee", + "el", + "en", + "eo", + "es", + "et", + "eu", + "fa", + "ff", + "fi", + "fj", + "fo", + "fr", + "fy", + "ga", + "gd", + "gl", + "gn", + "gu", + "gv", + "ha", + "he", + "hi", + "ho", + "hr", + "ht", + "hu", + "hy", + "hz", + "{{", + "id", + "ie", + "ig", + "ii", + "ik", + "io", + "is", + "it", + "iu", + "ja", + "jv", + "ka", + "kg", + "ki", + "kj", + "kk", + "kl", + "km", + "kn", + "ko", + "kr", + "ks", + "ku", + "kv", + "kw", + "ky", + "la", + "lb", + "lg", + "li", + "ln", + "lo", + "lt", + "lu", + "lv", + "mg", + "mh", + "#m", + "mk", + "ml", + "mn", + "mr", + "ms", + "mt", + "my", + "na", + "#n", + "nd", + "ne", + "ng", + "nl", + "nn", + "no", + "nr", + "nv", + "ny", + "oc", + "oj", + "om", + "or", + "os", + "pa", + "pi", + "pl", + "ps", + "pt", + "qu", + "rm", + "rn", + "ro", + "ru", + "rw", + "sa", + "sc", + "sd", + "se", + "sg", + "si", + "sk", + "sl", + "sm", + "sn", + "so", + "sq", + "sr", + "ss", + "st", + "su", + "sv", + "sw", + "ta", + "te", + "tg", + "th", + "ti", + "tk", + "tl", + "tn", + "to", + "tr", + "ts", + "tt", + "tw", + "ty", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "#v", + "wa", + "wo", + "xh", + "yi", + "yo", + "za", + "zh", + "zu", + ]; +} From 5d94a57cfdc4edf0fdc9d512aea5919095c2ea7c Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Tue, 12 Nov 2024 14:48:44 +0700 Subject: [PATCH 03/12] Pass MultiStringOverride to two failing tests --- backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs | 6 +++++- backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs index 7118f61e0..78fb3831e 100644 --- a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs @@ -10,6 +10,7 @@ using SIL.Harmony.Changes; using SIL.Harmony.Entities; using Soenneker.Utils.AutoBogus; +using Soenneker.Utils.AutoBogus.Config; namespace LcmCrdt.Tests; @@ -76,7 +77,10 @@ public async Task VerifyIObjectWithIdModels() [Fact] public void VerifyIObjectWithIdsMatchAdapterGetObjectTypeName() { - var faker = new AutoFaker(); + var faker = new AutoFaker(new AutoFakerConfig() + { + Overrides = [new MultiStringOverride()] + }); var jsonSerializerOptions = _crdtConfig.JsonSerializerOptions; var types = jsonSerializerOptions.GetTypeInfo(typeof(IObjectWithId)).PolymorphismOptions?.DerivedTypes ?? []; using (new AssertionScope()) diff --git a/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs b/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs index 22fb0cebf..c629bd19f 100644 --- a/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs @@ -8,7 +8,11 @@ namespace LcmCrdt.Tests; public class EntityCopyMethodTests { - private readonly AutoFaker _autoFaker = new(new AutoFakerConfig()); + private readonly AutoFaker _autoFaker = new(new AutoFakerConfig() + { + Overrides = [new MultiStringOverride()] + }); + public static IEnumerable<object[]> GetEntityTypes() { var crdtConfig = new CrdtConfig(); From da697475ecf7af9d693e4c232ba4d68d5c626af4 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Tue, 12 Nov 2024 15:23:46 +0700 Subject: [PATCH 04/12] Add some writing system ID validation tests --- .../MiniLcm.Tests/WritingSystemTestsBase.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs b/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs index d05e77fa5..0f89a88e0 100644 --- a/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs @@ -19,4 +19,30 @@ public async Task GetWritingSystems_ReturnsExemplars() var writingSystems = await Api.GetWritingSystems(); writingSystems.Vernacular.Should().Contain(ws => ws.Exemplars.Any()); } + + [Theory] + [InlineData("en")] + [InlineData("th")] + public void ValidWritingSystemId_ShouldNotThrow(string code) + { + var ws = new WritingSystemId(code); + ws.Should().NotBeNull(); + } + + [Theory] + [InlineData("gx")] + [InlineData("oo")] + [InlineData("eng")] // Three-letter codes not allowed when there's a valid two-letter code + [InlineData("nonsense")] + public void InvalidWritingSystemId_ShouldThrow(string code) + { + Assert.Throws<ArgumentException>(() => new WritingSystemId(code)); + } + + [Fact] + public void DefaultWritingSystemId_IsValid() + { + var ws = new WritingSystemId("default"); + ws.Should().NotBeNull(); + } } From 5f750a6fb614b9eb842f5be5e7fce259919a2405 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Tue, 12 Nov 2024 15:44:05 +0700 Subject: [PATCH 05/12] Add tests for audio ws validation --- backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs b/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs index 0f89a88e0..69ca91c01 100644 --- a/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs @@ -23,6 +23,7 @@ public async Task GetWritingSystems_ReturnsExemplars() [Theory] [InlineData("en")] [InlineData("th")] + [InlineData("en-Zxxx-x-audio")] public void ValidWritingSystemId_ShouldNotThrow(string code) { var ws = new WritingSystemId(code); @@ -33,6 +34,7 @@ public void ValidWritingSystemId_ShouldNotThrow(string code) [InlineData("gx")] [InlineData("oo")] [InlineData("eng")] // Three-letter codes not allowed when there's a valid two-letter code + [InlineData("eng-Zxxx-x-audio")] [InlineData("nonsense")] public void InvalidWritingSystemId_ShouldThrow(string code) { From 8dd36043251c8d1f82804f448e5fd4d58780cb8b Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Tue, 12 Nov 2024 15:53:44 +0700 Subject: [PATCH 06/12] Choose random wses correctly this time --- .../FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs | 2 +- backend/FwLite/LcmCrdt.Tests/MultiStringOverride.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs b/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs index 4a1110707..9634ddd14 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs @@ -16,7 +16,7 @@ public override void Generate(AutoFakerOverrideContext context) var wordsArray = context.Faker.Random.WordsArray(1, 4); foreach (var word in wordsArray) { - var ws = context.Faker.PickRandom(MiniLcm.Tests.WritingSystemCodes.ValidTwoLetterCodes); + var ws = context.Faker.Random.ArrayElement(MiniLcm.Tests.WritingSystemCodes.ValidTwoLetterCodes); target[ws] = word; } } diff --git a/backend/FwLite/LcmCrdt.Tests/MultiStringOverride.cs b/backend/FwLite/LcmCrdt.Tests/MultiStringOverride.cs index 5fc5326fa..a5638dbee 100644 --- a/backend/FwLite/LcmCrdt.Tests/MultiStringOverride.cs +++ b/backend/FwLite/LcmCrdt.Tests/MultiStringOverride.cs @@ -16,7 +16,7 @@ public override void Generate(AutoFakerOverrideContext context) var wordsArray = context.Faker.Random.WordsArray(1, 4); foreach (var word in wordsArray) { - var ws = context.Faker.PickRandom(WritingSystemCodes.ValidTwoLetterCodes); + var ws = context.Faker.Random.ArrayElement(WritingSystemCodes.ValidTwoLetterCodes); target[ws] = word; } } From 4dcb692a8a6fed8a42e0206b57c1adde8f24851a Mon Sep 17 00:00:00 2001 From: Kevin Hahn <kevin_hahn@sil.org> Date: Wed, 13 Nov 2024 11:48:38 +0700 Subject: [PATCH 07/12] move the writing system id tests into their own test class --- .../MiniLcm.Tests/WritingSystemIdTests.cs | 34 +++++++++++++++++++ .../MiniLcm.Tests/WritingSystemTestsBase.cs | 28 --------------- 2 files changed, 34 insertions(+), 28 deletions(-) create mode 100644 backend/FwLite/MiniLcm.Tests/WritingSystemIdTests.cs diff --git a/backend/FwLite/MiniLcm.Tests/WritingSystemIdTests.cs b/backend/FwLite/MiniLcm.Tests/WritingSystemIdTests.cs new file mode 100644 index 000000000..6448f77b0 --- /dev/null +++ b/backend/FwLite/MiniLcm.Tests/WritingSystemIdTests.cs @@ -0,0 +1,34 @@ +using MiniLcm.Models; + +namespace MiniLcm.Tests; + +public class WritingSystemIdTests +{ + [Theory] + [InlineData("en")] + [InlineData("th")] + [InlineData("en-Zxxx-x-audio")] + public void ValidWritingSystemId_ShouldNotThrow(string code) + { + var ws = new WritingSystemId(code); + ws.Should().NotBeNull(); + } + + [Theory] + [InlineData("gx")] + [InlineData("oo")] + [InlineData("eng")] // Three-letter codes not allowed when there's a valid two-letter code + [InlineData("eng-Zxxx-x-audio")] + [InlineData("nonsense")] + public void InvalidWritingSystemId_ShouldThrow(string code) + { + Assert.Throws<ArgumentException>(() => new WritingSystemId(code)); + } + + [Fact] + public void DefaultWritingSystemId_IsValid() + { + var ws = new WritingSystemId("default"); + ws.Should().NotBeNull(); + } +} diff --git a/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs b/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs index 69ca91c01..d05e77fa5 100644 --- a/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/WritingSystemTestsBase.cs @@ -19,32 +19,4 @@ public async Task GetWritingSystems_ReturnsExemplars() var writingSystems = await Api.GetWritingSystems(); writingSystems.Vernacular.Should().Contain(ws => ws.Exemplars.Any()); } - - [Theory] - [InlineData("en")] - [InlineData("th")] - [InlineData("en-Zxxx-x-audio")] - public void ValidWritingSystemId_ShouldNotThrow(string code) - { - var ws = new WritingSystemId(code); - ws.Should().NotBeNull(); - } - - [Theory] - [InlineData("gx")] - [InlineData("oo")] - [InlineData("eng")] // Three-letter codes not allowed when there's a valid two-letter code - [InlineData("eng-Zxxx-x-audio")] - [InlineData("nonsense")] - public void InvalidWritingSystemId_ShouldThrow(string code) - { - Assert.Throws<ArgumentException>(() => new WritingSystemId(code)); - } - - [Fact] - public void DefaultWritingSystemId_IsValid() - { - var ws = new WritingSystemId("default"); - ws.Should().NotBeNull(); - } } From 5f67d5b765c5b3f77780e04e21dc82a1cfb2bacf Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Thu, 14 Nov 2024 10:00:16 +0700 Subject: [PATCH 08/12] Use SIL.WritingSystems list instead of hardcoding Still some test failures, where AutoFaker.Generate is apparently generating strings (and therefore not using the WritingSystemIdOverride class), but those strings are actually writing system IDs and should have been chosen from the valid list. --- .../Fixtures/WritingSystemCodes.cs | 8 + .../Fixtures/WritingSystemIdOverride.cs | 14 ++ .../UpdateDiffTests.cs | 2 +- .../LcmCrdt.Tests/EntityCopyMethodTests.cs | 2 +- .../LcmCrdt.Tests/WritingSystemIdOverride.cs | 14 ++ .../MiniLcm.Tests/WritingSystemCodes.cs | 188 +----------------- 6 files changed, 41 insertions(+), 187 deletions(-) create mode 100644 backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemCodes.cs create mode 100644 backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemIdOverride.cs create mode 100644 backend/FwLite/LcmCrdt.Tests/WritingSystemIdOverride.cs diff --git a/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemCodes.cs b/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemCodes.cs new file mode 100644 index 000000000..078286e0e --- /dev/null +++ b/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemCodes.cs @@ -0,0 +1,8 @@ +using SIL.WritingSystems; + +namespace FwLiteProjectSync.Tests; + +public static class WritingSystemCodes +{ + public static string[] ValidTwoLetterCodes = StandardSubtags.RegisteredLanguages.Select(lang => lang.Code).ToArray(); +} diff --git a/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemIdOverride.cs b/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemIdOverride.cs new file mode 100644 index 000000000..cb0d17bc9 --- /dev/null +++ b/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemIdOverride.cs @@ -0,0 +1,14 @@ +using MiniLcm.Models; +using Soenneker.Utils.AutoBogus.Context; +using Soenneker.Utils.AutoBogus.Override; + +namespace FwLiteProjectSync.Tests; + +public class WritingSystemOverride: AutoFakerOverride<WritingSystemId> +{ + public override void Generate(AutoFakerOverrideContext context) + { + var ws = context.Faker.Random.ArrayElement(WritingSystemCodes.ValidTwoLetterCodes); + context.Instance = new WritingSystemId(ws); + } +} diff --git a/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs index a9f13f49c..c23235cd7 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs @@ -10,7 +10,7 @@ public class UpdateDiffTests { private readonly AutoFaker _autoFaker = new(new AutoFakerConfig() { - Overrides = [new MultiStringOverride()] + Overrides = [new MultiStringOverride(), new WritingSystemIdOverride()] }); [Fact] diff --git a/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs b/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs index c629bd19f..ca25e15c0 100644 --- a/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs @@ -10,7 +10,7 @@ public class EntityCopyMethodTests { private readonly AutoFaker _autoFaker = new(new AutoFakerConfig() { - Overrides = [new MultiStringOverride()] + Overrides = [new MultiStringOverride(), new WritingSystemIdOverride()] }); public static IEnumerable<object[]> GetEntityTypes() diff --git a/backend/FwLite/LcmCrdt.Tests/WritingSystemIdOverride.cs b/backend/FwLite/LcmCrdt.Tests/WritingSystemIdOverride.cs new file mode 100644 index 000000000..e94fbadad --- /dev/null +++ b/backend/FwLite/LcmCrdt.Tests/WritingSystemIdOverride.cs @@ -0,0 +1,14 @@ +using MiniLcm.Models; +using Soenneker.Utils.AutoBogus.Context; +using Soenneker.Utils.AutoBogus.Override; + +namespace LcmCrdt.Tests; + +public class WritingSystemIdOverride: AutoFakerOverride<WritingSystemId> +{ + public override void Generate(AutoFakerOverrideContext context) + { + var ws = context.Faker.Random.ArrayElement(WritingSystemCodes.ValidTwoLetterCodes); + context.Instance = new WritingSystemId(ws); + } +} diff --git a/backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs b/backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs index f2632b1b9..6ace101cf 100644 --- a/backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs +++ b/backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs @@ -1,190 +1,8 @@ +using SIL.WritingSystems; + namespace MiniLcm.Tests; public static class WritingSystemCodes { - public static string[] ValidTwoLetterCodes = [ - "aa", - "ab", - "ae", - "af", - "ak", - "am", - "an", - "ar", - "as", - "av", - "ay", - "az", - "ba", - "be", - "bg", - "bi", - "bm", - "bn", - "bo", - "br", - "bs", - "ca", - "ce", - "ch", - "co", - "cr", - "cs", - "cu", - "cv", - "cy", - "da", - "de", - "dv", - "dz", - "ee", - "el", - "en", - "eo", - "es", - "et", - "eu", - "fa", - "ff", - "fi", - "fj", - "fo", - "fr", - "fy", - "ga", - "gd", - "gl", - "gn", - "gu", - "gv", - "ha", - "he", - "hi", - "ho", - "hr", - "ht", - "hu", - "hy", - "hz", - "{{", - "id", - "ie", - "ig", - "ii", - "ik", - "io", - "is", - "it", - "iu", - "ja", - "jv", - "ka", - "kg", - "ki", - "kj", - "kk", - "kl", - "km", - "kn", - "ko", - "kr", - "ks", - "ku", - "kv", - "kw", - "ky", - "la", - "lb", - "lg", - "li", - "ln", - "lo", - "lt", - "lu", - "lv", - "mg", - "mh", - "#m", - "mk", - "ml", - "mn", - "mr", - "ms", - "mt", - "my", - "na", - "#n", - "nd", - "ne", - "ng", - "nl", - "nn", - "no", - "nr", - "nv", - "ny", - "oc", - "oj", - "om", - "or", - "os", - "pa", - "pi", - "pl", - "ps", - "pt", - "qu", - "rm", - "rn", - "ro", - "ru", - "rw", - "sa", - "sc", - "sd", - "se", - "sg", - "si", - "sk", - "sl", - "sm", - "sn", - "so", - "sq", - "sr", - "ss", - "st", - "su", - "sv", - "sw", - "ta", - "te", - "tg", - "th", - "ti", - "tk", - "tl", - "tn", - "to", - "tr", - "ts", - "tt", - "tw", - "ty", - "ug", - "uk", - "ur", - "uz", - "ve", - "vi", - "#v", - "wa", - "wo", - "xh", - "yi", - "yo", - "za", - "zh", - "zu", - ]; + public static string[] ValidTwoLetterCodes = StandardSubtags.RegisteredLanguages.Select(lang => lang.Code).ToArray(); } From 27dc0fb0c8f3e303eba7819fd0992df855d8ceea Mon Sep 17 00:00:00 2001 From: Kevin Hahn <kevin_hahn@sil.org> Date: Thu, 14 Nov 2024 10:45:00 +0700 Subject: [PATCH 09/12] move faker overrides into miniLcm tests --- .../Fixtures/MultiStringOverride.cs | 23 ------------------- .../Fixtures/WritingSystemCodes.cs | 8 ------- .../Fixtures/WritingSystemIdOverride.cs | 14 ----------- .../UpdateDiffTests.cs | 1 + .../LcmCrdt.Tests/DataModelSnapshotTests.cs | 1 + .../LcmCrdt.Tests/EntityCopyMethodTests.cs | 1 + .../FakerOverrids}/MultiStringOverride.cs | 4 ++-- .../FakerOverrids}/WritingSystemIdOverride.cs | 2 +- 8 files changed, 6 insertions(+), 48 deletions(-) delete mode 100644 backend/FwLite/FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs delete mode 100644 backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemCodes.cs delete mode 100644 backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemIdOverride.cs rename backend/FwLite/{LcmCrdt.Tests => MiniLcm.Tests/FakerOverrids}/MultiStringOverride.cs (90%) rename backend/FwLite/{LcmCrdt.Tests => MiniLcm.Tests/FakerOverrids}/WritingSystemIdOverride.cs (91%) diff --git a/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs b/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs deleted file mode 100644 index 9634ddd14..000000000 --- a/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/MultiStringOverride.cs +++ /dev/null @@ -1,23 +0,0 @@ -using MiniLcm.Models; -using Soenneker.Utils.AutoBogus.Context; -using Soenneker.Utils.AutoBogus.Override; - -namespace FwLiteProjectSync.Tests.Fixtures; - -public class MultiStringOverride: AutoFakerOverride<MultiString> -{ - public override void Generate(AutoFakerOverrideContext context) - { - var target = context.Instance as MultiString; - if (target is null) - { - context.Instance = target = new MultiString(); - } - var wordsArray = context.Faker.Random.WordsArray(1, 4); - foreach (var word in wordsArray) - { - var ws = context.Faker.Random.ArrayElement(MiniLcm.Tests.WritingSystemCodes.ValidTwoLetterCodes); - target[ws] = word; - } - } -} diff --git a/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemCodes.cs b/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemCodes.cs deleted file mode 100644 index 078286e0e..000000000 --- a/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemCodes.cs +++ /dev/null @@ -1,8 +0,0 @@ -using SIL.WritingSystems; - -namespace FwLiteProjectSync.Tests; - -public static class WritingSystemCodes -{ - public static string[] ValidTwoLetterCodes = StandardSubtags.RegisteredLanguages.Select(lang => lang.Code).ToArray(); -} diff --git a/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemIdOverride.cs b/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemIdOverride.cs deleted file mode 100644 index cb0d17bc9..000000000 --- a/backend/FwLite/FwLiteProjectSync.Tests/Fixtures/WritingSystemIdOverride.cs +++ /dev/null @@ -1,14 +0,0 @@ -using MiniLcm.Models; -using Soenneker.Utils.AutoBogus.Context; -using Soenneker.Utils.AutoBogus.Override; - -namespace FwLiteProjectSync.Tests; - -public class WritingSystemOverride: AutoFakerOverride<WritingSystemId> -{ - public override void Generate(AutoFakerOverrideContext context) - { - var ws = context.Faker.Random.ArrayElement(WritingSystemCodes.ValidTwoLetterCodes); - context.Instance = new WritingSystemId(ws); - } -} diff --git a/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs index c23235cd7..d6d7f23ab 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs @@ -1,6 +1,7 @@ using FwLiteProjectSync.Tests.Fixtures; using MiniLcm.Models; using MiniLcm.SyncHelpers; +using MiniLcm.Tests.FakerOverrids; using Soenneker.Utils.AutoBogus; using Soenneker.Utils.AutoBogus.Config; diff --git a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs index 78fb3831e..27f3bf572 100644 --- a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using MiniLcm.Tests.FakerOverrids; using SIL.Harmony.Changes; using SIL.Harmony.Entities; using Soenneker.Utils.AutoBogus; diff --git a/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs b/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs index ca25e15c0..051c56a92 100644 --- a/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs @@ -1,5 +1,6 @@ using SIL.Harmony.Entities; using LcmCrdt.Objects; +using MiniLcm.Tests.FakerOverrids; using SIL.Harmony; using Soenneker.Utils.AutoBogus; using Soenneker.Utils.AutoBogus.Config; diff --git a/backend/FwLite/LcmCrdt.Tests/MultiStringOverride.cs b/backend/FwLite/MiniLcm.Tests/FakerOverrids/MultiStringOverride.cs similarity index 90% rename from backend/FwLite/LcmCrdt.Tests/MultiStringOverride.cs rename to backend/FwLite/MiniLcm.Tests/FakerOverrids/MultiStringOverride.cs index a5638dbee..9b06f3923 100644 --- a/backend/FwLite/LcmCrdt.Tests/MultiStringOverride.cs +++ b/backend/FwLite/MiniLcm.Tests/FakerOverrids/MultiStringOverride.cs @@ -1,8 +1,8 @@ -using MiniLcm.Models; +using MiniLcm.Models; using Soenneker.Utils.AutoBogus.Context; using Soenneker.Utils.AutoBogus.Override; -namespace LcmCrdt.Tests; +namespace MiniLcm.Tests.FakerOverrids; public class MultiStringOverride: AutoFakerOverride<MultiString> { diff --git a/backend/FwLite/LcmCrdt.Tests/WritingSystemIdOverride.cs b/backend/FwLite/MiniLcm.Tests/FakerOverrids/WritingSystemIdOverride.cs similarity index 91% rename from backend/FwLite/LcmCrdt.Tests/WritingSystemIdOverride.cs rename to backend/FwLite/MiniLcm.Tests/FakerOverrids/WritingSystemIdOverride.cs index e94fbadad..c0cc7fb75 100644 --- a/backend/FwLite/LcmCrdt.Tests/WritingSystemIdOverride.cs +++ b/backend/FwLite/MiniLcm.Tests/FakerOverrids/WritingSystemIdOverride.cs @@ -2,7 +2,7 @@ using Soenneker.Utils.AutoBogus.Context; using Soenneker.Utils.AutoBogus.Override; -namespace LcmCrdt.Tests; +namespace MiniLcm.Tests.FakerOverrids; public class WritingSystemIdOverride: AutoFakerOverride<WritingSystemId> { From e1bce56273dabe6ca509a2ba6f2eed3b5ac789d7 Mon Sep 17 00:00:00 2001 From: Kevin Hahn <kevin_hahn@sil.org> Date: Thu, 14 Nov 2024 10:51:57 +0700 Subject: [PATCH 10/12] configure autofaker to allow us to create a ws id which lets us generate valid ids --- .../FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs | 11 ++++++----- .../FakerOverrids/WritingSystemIdOverride.cs | 2 ++ backend/FwLite/MiniLcm/Models/WritingSystemId.cs | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs index 27f3bf572..78279e85a 100644 --- a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs @@ -17,6 +17,11 @@ namespace LcmCrdt.Tests; public class DataModelSnapshotTests : IAsyncLifetime { + private static AutoFaker _faker = new AutoFaker(new AutoFakerConfig() + { + Overrides = [new MultiStringOverride(), new WritingSystemIdOverride()] + }); + protected readonly AsyncServiceScope _services; private readonly LcmCrdtDbContext _crdtDbContext; private CrdtConfig _crdtConfig; @@ -78,10 +83,6 @@ public async Task VerifyIObjectWithIdModels() [Fact] public void VerifyIObjectWithIdsMatchAdapterGetObjectTypeName() { - var faker = new AutoFaker(new AutoFakerConfig() - { - Overrides = [new MultiStringOverride()] - }); var jsonSerializerOptions = _crdtConfig.JsonSerializerOptions; var types = jsonSerializerOptions.GetTypeInfo(typeof(IObjectWithId)).PolymorphismOptions?.DerivedTypes ?? []; using (new AssertionScope()) @@ -89,7 +90,7 @@ public void VerifyIObjectWithIdsMatchAdapterGetObjectTypeName() foreach (var jsonDerivedType in types) { var typeDiscriminator = jsonDerivedType.TypeDiscriminator.Should().BeOfType<string>().Subject; - var obj = faker.Generate(jsonDerivedType.DerivedType); + var obj = _faker.Generate(jsonDerivedType.DerivedType); new MiniLcmCrdtAdapter((IObjectWithId)obj).GetObjectTypeName().Should().Be(typeDiscriminator); } } diff --git a/backend/FwLite/MiniLcm.Tests/FakerOverrids/WritingSystemIdOverride.cs b/backend/FwLite/MiniLcm.Tests/FakerOverrids/WritingSystemIdOverride.cs index c0cc7fb75..5c5d2a7b9 100644 --- a/backend/FwLite/MiniLcm.Tests/FakerOverrids/WritingSystemIdOverride.cs +++ b/backend/FwLite/MiniLcm.Tests/FakerOverrids/WritingSystemIdOverride.cs @@ -6,6 +6,8 @@ namespace MiniLcm.Tests.FakerOverrids; public class WritingSystemIdOverride: AutoFakerOverride<WritingSystemId> { + public override bool Preinitialize => false; + public override void Generate(AutoFakerOverrideContext context) { var ws = context.Faker.Random.ArrayElement(WritingSystemCodes.ValidTwoLetterCodes); diff --git a/backend/FwLite/MiniLcm/Models/WritingSystemId.cs b/backend/FwLite/MiniLcm/Models/WritingSystemId.cs index 10f72bb75..7441fb99d 100644 --- a/backend/FwLite/MiniLcm/Models/WritingSystemId.cs +++ b/backend/FwLite/MiniLcm/Models/WritingSystemId.cs @@ -39,7 +39,7 @@ public WritingSystemId(string code) } else { - throw new ArgumentException($"Invalid writing system ID {code}", nameof(code)); + throw new ArgumentException($"Invalid writing system ID '{code}'", nameof(code)); } } From c7f2f1a58c883f5e331bbcadd8abc1016773523c Mon Sep 17 00:00:00 2001 From: Kevin Hahn <kevin_hahn@sil.org> Date: Thu, 14 Nov 2024 10:52:45 +0700 Subject: [PATCH 11/12] make test WritingSystemCodes ValidTwoLetterCodes readonly --- backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs b/backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs index 6ace101cf..eda122ca2 100644 --- a/backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs +++ b/backend/FwLite/MiniLcm.Tests/WritingSystemCodes.cs @@ -4,5 +4,5 @@ namespace MiniLcm.Tests; public static class WritingSystemCodes { - public static string[] ValidTwoLetterCodes = StandardSubtags.RegisteredLanguages.Select(lang => lang.Code).ToArray(); + public static readonly string[] ValidTwoLetterCodes = StandardSubtags.RegisteredLanguages.Select(lang => lang.Code).ToArray(); } From a2e87bf2100f32082cc58ee9413d5a9819938883 Mon Sep 17 00:00:00 2001 From: Kevin Hahn <kevin_hahn@sil.org> Date: Thu, 14 Nov 2024 11:11:55 +0700 Subject: [PATCH 12/12] move MultiStringOverride.cs into auto faker helpers --- backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs | 1 - backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs | 2 +- backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs | 2 +- backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs | 2 +- .../{FakerOverrids => AutoFakerHelpers}/MultiStringOverride.cs | 2 +- .../WritingSystemIdOverride.cs | 2 +- backend/FwLite/MiniLcm.Tests/MiniLcmTestBase.cs | 1 - 7 files changed, 5 insertions(+), 7 deletions(-) rename backend/FwLite/MiniLcm.Tests/{FakerOverrids => AutoFakerHelpers}/MultiStringOverride.cs (94%) rename backend/FwLite/MiniLcm.Tests/{FakerOverrids => AutoFakerHelpers}/WritingSystemIdOverride.cs (91%) diff --git a/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs index 3ed5ffa0e..523f73526 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/EntrySyncTests.cs @@ -3,7 +3,6 @@ using MiniLcm.Models; using MiniLcm.SyncHelpers; using MiniLcm.Tests.AutoFakerHelpers; -using MiniLcm.Tests.FakerOverrids; using Soenneker.Utils.AutoBogus; namespace FwLiteProjectSync.Tests; diff --git a/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs index d6d7f23ab..9d1feffa2 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/UpdateDiffTests.cs @@ -1,7 +1,7 @@ using FwLiteProjectSync.Tests.Fixtures; using MiniLcm.Models; using MiniLcm.SyncHelpers; -using MiniLcm.Tests.FakerOverrids; +using MiniLcm.Tests.AutoFakerHelpers; using Soenneker.Utils.AutoBogus; using Soenneker.Utils.AutoBogus.Config; diff --git a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs index 78279e85a..c08c3812c 100644 --- a/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/DataModelSnapshotTests.cs @@ -7,7 +7,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using MiniLcm.Tests.FakerOverrids; +using MiniLcm.Tests.AutoFakerHelpers; using SIL.Harmony.Changes; using SIL.Harmony.Entities; using Soenneker.Utils.AutoBogus; diff --git a/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs b/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs index 051c56a92..395615d46 100644 --- a/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs +++ b/backend/FwLite/LcmCrdt.Tests/EntityCopyMethodTests.cs @@ -1,6 +1,6 @@ using SIL.Harmony.Entities; using LcmCrdt.Objects; -using MiniLcm.Tests.FakerOverrids; +using MiniLcm.Tests.AutoFakerHelpers; using SIL.Harmony; using Soenneker.Utils.AutoBogus; using Soenneker.Utils.AutoBogus.Config; diff --git a/backend/FwLite/MiniLcm.Tests/FakerOverrids/MultiStringOverride.cs b/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/MultiStringOverride.cs similarity index 94% rename from backend/FwLite/MiniLcm.Tests/FakerOverrids/MultiStringOverride.cs rename to backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/MultiStringOverride.cs index ff671c869..678a6a153 100644 --- a/backend/FwLite/MiniLcm.Tests/FakerOverrids/MultiStringOverride.cs +++ b/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/MultiStringOverride.cs @@ -2,7 +2,7 @@ using Soenneker.Utils.AutoBogus.Context; using Soenneker.Utils.AutoBogus.Override; -namespace MiniLcm.Tests.FakerOverrids; +namespace MiniLcm.Tests.AutoFakerHelpers; public class MultiStringOverride(string[]? validWs = null): AutoFakerOverride<MultiString> { diff --git a/backend/FwLite/MiniLcm.Tests/FakerOverrids/WritingSystemIdOverride.cs b/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/WritingSystemIdOverride.cs similarity index 91% rename from backend/FwLite/MiniLcm.Tests/FakerOverrids/WritingSystemIdOverride.cs rename to backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/WritingSystemIdOverride.cs index 5c5d2a7b9..2901dc454 100644 --- a/backend/FwLite/MiniLcm.Tests/FakerOverrids/WritingSystemIdOverride.cs +++ b/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/WritingSystemIdOverride.cs @@ -2,7 +2,7 @@ using Soenneker.Utils.AutoBogus.Context; using Soenneker.Utils.AutoBogus.Override; -namespace MiniLcm.Tests.FakerOverrids; +namespace MiniLcm.Tests.AutoFakerHelpers; public class WritingSystemIdOverride: AutoFakerOverride<WritingSystemId> { diff --git a/backend/FwLite/MiniLcm.Tests/MiniLcmTestBase.cs b/backend/FwLite/MiniLcm.Tests/MiniLcmTestBase.cs index 04bdc89f0..f4ee8de99 100644 --- a/backend/FwLite/MiniLcm.Tests/MiniLcmTestBase.cs +++ b/backend/FwLite/MiniLcm.Tests/MiniLcmTestBase.cs @@ -1,5 +1,4 @@ using MiniLcm.Tests.AutoFakerHelpers; -using MiniLcm.Tests.FakerOverrids; using Soenneker.Utils.AutoBogus; namespace MiniLcm.Tests;