diff --git a/tests/ArrowDbCore.Tests.Integrity/OverwriteForceClear.cs b/tests/ArrowDbCore.Tests.Integrity/OverwriteForceClear.cs new file mode 100644 index 0000000..50092df --- /dev/null +++ b/tests/ArrowDbCore.Tests.Integrity/OverwriteForceClear.cs @@ -0,0 +1,50 @@ +using Bogus; + +namespace ArrowDbCore.Tests.Integrity; + +public class OverwriteForceClear { + [Fact] + public async Task SerializeOverwritesExistingFile() { + const int itemCount = 1_000; + + var faker = new Faker(); + faker.UseSeed(1337); + faker.RuleFor(p => p.Name, (f, _) => f.Name.FullName()); + faker.RuleFor(p => p.Age, (f, _) => f.Random.Int(1, 100)); + faker.RuleFor(p => p.BirthDate, (f, _) => f.Date.Past(1, DateTime.Now.AddYears(-100))); + faker.RuleFor(p => p.IsMarried, (f, _) => f.Random.Bool()); + + var buffer = new char[256]; + + var path = Sharpify.Utils.Env.PathInBaseDirectory("overwrite-test.db"); + try { + // load the db + var db = await ArrowDb.CreateFromFile(path); + // clear + db.Clear(); + // add items + for (var j = 0; j < itemCount; j++) { + var person = faker.Generate(); + var key = ArrowDb.GenerateTypedKey(person.Name, buffer); + db.Upsert(key, person, JContext.Default.Person); + } + // save + await db.SerializeAsync(); + // now we have sample data to verify overwrite + var fileSize = new FileInfo(path).Length; + // now we overwrite + db.Clear(); + await db.SerializeAsync(); + // clear data and overwritten (file should next to empty - aside from headers) + var newFileSize = new FileInfo(path).Length; + // check if new is smaller + Assert.True(newFileSize < fileSize); + } finally { + if (File.Exists(path)) { + File.Delete(path); + } + } + + // this test fails if an exception is thrown or the file is not overwritten + } +} \ No newline at end of file