diff --git a/Tests/ExporterTests.cs b/Tests/ExporterTests.cs index 5bcefeb..a94c01b 100644 --- a/Tests/ExporterTests.cs +++ b/Tests/ExporterTests.cs @@ -50,7 +50,7 @@ public class ExporterTests : TestBase // Act string exportedTagHierarchy = new MusicBeeTagHierarchyExporter().ExportDatabase(this.Database); - exportedTagHierarchy = exportedTagHierarchy.TrimEnd(); + exportedTagHierarchy = exportedTagHierarchy.ReplaceLineEndings("\n").TrimEnd(); // Assert Assert.That(exportedTagHierarchy, Is.EqualTo(expectedExport)); diff --git a/Tests/ImporterTests.cs b/Tests/ImporterTests.cs index a8fed35..8373001 100644 --- a/Tests/ImporterTests.cs +++ b/Tests/ImporterTests.cs @@ -62,7 +62,7 @@ public class ImporterTests : TestBase await db.CreateAsync(":memory:", tagsToImport: testData); string exportedTagHierarchy = new MusicBeeTagHierarchyExporter().ExportDatabase(db); - exportedTagHierarchy = exportedTagHierarchy.TrimEnd(); + exportedTagHierarchy = exportedTagHierarchy.ReplaceLineEndings("\n").TrimEnd(); // Assert Assert.That(exportedTagHierarchy, Is.EqualTo(expectedExport.TrimEnd())); diff --git a/Tests/TagDatabaseSaveTests.cs b/Tests/TagDatabaseSaveTests.cs index 00022be..188ca08 100644 --- a/Tests/TagDatabaseSaveTests.cs +++ b/Tests/TagDatabaseSaveTests.cs @@ -25,30 +25,43 @@ public class TagDatabaseWriteTests : TestBase [SetUp] public async Task ClearDatabaseAndAddSampleData() { + var sampleOfSampleData = new List() + { + TestSampleTags.Ambient, TestSampleTags.Electronic + }; + this.Database.ClearTags(); - await this.Database.WriteTagToDatabase([TestSampleTags.Ambient, TestSampleTags.Electronic]); + foreach (var tag in sampleOfSampleData) + await this.Database.WriteTagToDatabase(tag); } - - /// - /// Tests if deletion of a tag works, by checking if the result of trying to select that tag's name returns null. - /// - /// A representing the asynchronous test. + [Test] - public async Task TagDatabase_DeleteTag_TagIsDeleted() + public async Task TagDatabase_WriteTagsToDatabase_TagDeleted() { // Arrange + TagDatabase.DatabaseEditResult? test = null; + TagDatabase db = new(); + await db.CreateAsync(":memory:"); + db.InitialisationComplete += (_, _) => Assert.Pass(); + EventHandler handler = (_, result) => test = result; + db.TagsWritten += handler; Tag deletedTag = new() { Name = "DELETE ME", IsTopLevel = true, }; - await this.Database.WriteTagToDatabase([deletedTag]); + await db.WriteTagToDatabase(deletedTag); // Act - await this.Database.DeleteTag(deletedTag.Id); - + await db.DeleteTag(deletedTag.Id); + // Assert - await Assert.ThatAsync(async () => await this.Database.SelectTagFromDatabase(deletedTag.Name), Is.Null); + Assert.That(test.Added.Count, Is.EqualTo(0)); + Assert.That(test.Updated.Count, Is.EqualTo(0)); + Assert.That(test.Deleted.Count, Is.EqualTo(1)); + await Assert.ThatAsync(async () => await db.SelectTagFromDatabase(deletedTag.Name), Is.Null); + + db.TagsWritten -= handler; } /// @@ -93,7 +106,13 @@ public class TagDatabaseWriteTests : TestBase TagBindings = ["genre"], Parents = ["Test parent tag 1"], }; - await this.Database.WriteTagToDatabase([firstParentTag, secondParentTag, childTag]); + var testTags = new List {firstParentTag, secondParentTag, childTag}; + + foreach (var tag in testTags) + { + await this.Database.WriteTagToDatabase(tag); + } + int childTagId = childTag.Id; List expectedParents = [firstParentTag.Id, secondParentTag.Id]; @@ -110,9 +129,14 @@ public class TagDatabaseWriteTests : TestBase childTag.IsTopLevel = newTopLevel; childTag.TagBindings.Add(addedTagBind); childTag.Parents.Add(addedParentName); + foreach (string parent in childTag.Parents) + { + var parentTag = await this.Database.SelectTagFromDatabase(parent); + childTag.ParentIds.Add(parentTag!.Id); + } childTag.Notes = newNotes; childTag.Aliases = newAliases; - await this.Database.WriteTagToDatabase([childTag]); + await this.Database.WriteTagToDatabase(childTag); // Assert Tag? editedChildTag = await this.Database.SelectTagFromDatabase(childTagId); @@ -129,21 +153,6 @@ public class TagDatabaseWriteTests : TestBase } } - /// - /// Tests if an attempt to save a tag that already exists results in an . - /// - [Test] - public void TagDatabase_WriteTagToDatabase_ThrowExceptionOnTagAlreadyExists() - { - // Arrange - Tag ambient = TestSampleTags.Ambient; - - // Act/Assert - ArgumentException? ex = - Assert.ThrowsAsync(async () => await this.Database.WriteTagToDatabase([ambient])); - Assert.That(ex!.Message, Does.EndWith("already exists in the database.")); - } - /// /// Tests if tags are being saved to and retrieved from the successfully. /// @@ -155,9 +164,14 @@ public class TagDatabaseWriteTests : TestBase { // Arrange bool tagValidated = inputTag.Validate(); + foreach (string parent in inputTag.Parents) + { + var parentTag = await this.Database.SelectTagFromDatabase(parent); + inputTag.ParentIds.Add(parentTag.Id); + } // Act - await this.Database.WriteTagToDatabase([inputTag]); + await this.Database.WriteTagToDatabase(inputTag); Tag? savedTag = await this.Database.SelectTagFromDatabase(inputTag.Name); // Assert @@ -190,9 +204,12 @@ public class TagDatabaseWriteTests : TestBase // Arrange List testTags = [TestSampleTags.Ambient, TestSampleTags.Electronic, TestSampleTags.SpaceAmbient]; this.Database.ClearTags(); - + // Act - await this.Database.WriteTagToDatabase(testTags); + foreach (var tag in testTags) + { + await this.Database.WriteTagToDatabase(tag); + } // Assert var retrievedTags = await this.Database.GetAllTagsFromDatabase(); @@ -200,7 +217,52 @@ public class TagDatabaseWriteTests : TestBase } [Test] - public async Task TagDatabase_WriteTagsToDatabase_TagWrittenEvent() + public async Task TagDatabase_WriteTagsToDatabase_TagWrittenAddedEvent() + { + // Arrange + TagDatabase.DatabaseEditResult? test = null; + TagDatabase db = new(); + await db.CreateAsync(":memory:"); + db.InitialisationComplete += (_, _) => Assert.Pass(); + db.TagsWritten += (_, result) => test = result; + + // Act + await db.WriteTagToDatabase(TestSampleTags.Ambient); + + // Assert + Assert.That(test.Added.Count, Is.EqualTo(1)); + Assert.That(test.Updated.Count, Is.EqualTo(0)); + Assert.That(test.Deleted.Count, Is.EqualTo(0)); + } + + [Test] + public async Task TagDatabase_WriteTagsToDatabase_TagWrittenUpdatedEvent() + { + // Arrange + TagDatabase.DatabaseEditResult? test = null; + TagDatabase db = new(); + await db.CreateAsync(":memory:"); + db.InitialisationComplete += (_, _) => Assert.Pass(); + EventHandler handler = (_, result) => test = result; + db.TagsWritten += handler; + + // Act + await db.WriteTagToDatabase(TestSampleTags.Ambient); + Tag? retrievedTag = await db.SelectTagFromDatabase(TestSampleTags.Ambient.Name); + retrievedTag!.Notes = "test edit"; + await db.WriteTagToDatabase(retrievedTag); + Assert.That(test.Updated.Count, Is.EqualTo(1)); + + // Assert + Assert.That(test.Added.Count, Is.EqualTo(0)); + Assert.That(test.Updated.Count, Is.EqualTo(1)); + Assert.That(test.Deleted.Count, Is.EqualTo(0)); + + db.TagsWritten -= handler; + } + + [Test] + public async Task TagDatabase_WriteTagsToDatabase_TagWrittenEvent_ExternalTransaction() { // Arrange TagDatabase.DatabaseEditResult? test = null; @@ -212,10 +274,15 @@ public class TagDatabaseWriteTests : TestBase db.TagsWritten += handler; List testTags = [TestSampleTags.Ambient, TestSampleTags.Electronic, TestSampleTags.SpaceAmbient]; - db.ClearTags(); // Act/Assert - await db.WriteTagToDatabase(testTags); + var transaction = await db.BeginExternalTransactionAsync(); + foreach (var tag in testTags) + { + await db.WriteTagToDatabase(tag, transaction); + } + await transaction.CommitAsync(); + Assert.That(test.Added.Count, Is.EqualTo(testTags.Count)); Assert.That(test.Updated.Count, Is.EqualTo(0)); Assert.That(test.Deleted.Count, Is.EqualTo(0)); @@ -223,7 +290,7 @@ public class TagDatabaseWriteTests : TestBase Tag? retrievedTag = await db.SelectTagFromDatabase(testTags[0].Name); Assert.That(retrievedTag, Is.Not.Null); retrievedTag.Notes = "test edit"; - await db.WriteTagToDatabase([retrievedTag]); + await db.WriteTagToDatabase(retrievedTag); Assert.That(test.Updated.Count, Is.EqualTo(1)); Tag? deletedTag = await db.SelectTagFromDatabase(testTags[2].Name); diff --git a/Tests/TagDatabaseSearchTests.cs b/Tests/TagDatabaseSearchTests.cs index cc7f1ec..cd4f3e6 100644 --- a/Tests/TagDatabaseSearchTests.cs +++ b/Tests/TagDatabaseSearchTests.cs @@ -124,7 +124,7 @@ public class TagDatabaseSearchTests : TestBase Parents = ["Ambient", "Electronic"], Aliases = ["áéíóúçýỷủ"], }; - await this.Database.WriteTagToDatabase([normalisedTest]); + await this.Database.WriteTagToDatabase(normalisedTest); // Act List tags = this.Database.SearchWithAliases(query, mode); diff --git a/Tests/TestBase.cs b/Tests/TestBase.cs index a8630c3..6f91a1c 100644 --- a/Tests/TestBase.cs +++ b/Tests/TestBase.cs @@ -63,7 +63,25 @@ public abstract class TestBase List sampleTags = TestSampleTags.AllTags(); this.Database.ClearTags(); - await this.Database.WriteTagToDatabase(sampleTags); + + // phase 1: add with no parents. + foreach (var tag in sampleTags) + { + await this.Database.WriteTagToDatabase(tag); + } + + // phase 2: add the parents + foreach (var tag in sampleTags) + { + foreach (string parent in tag.Parents) + { + var parentTag = await this.Database.SelectTagFromDatabase(parent); + tag.ParentIds.Add(parentTag.Id); + } + await this.Database.WriteTagToDatabase(tag); + } + + } // do not use in Test1_Init. That needs to be tested at a lower level.