using After; namespace BeforeAfter.Tests; /// /// The after stores data-only persistence records /// ( / ), never domain objects: /// 's Save maps domain state into a row — /// inserting on the first save, refreshing in place on later ones — and the /// stored graph is flattened to ids. /// public class AfterPersistenceTests { [Fact] public void Save_maps_domain_state_into_data_records() { var db = new DbContext(); var client = new Client { Name = "Acme" }; var order = new Order { Description = "one" }; client.Orders.Add(order); db.Save(client); db.Save(order); var clientRow = Assert.Single(db.Clients); Assert.Equal(client.Id, clientRow.Id); Assert.Equal("Acme", clientRow.Name); var orderRow = Assert.Single(db.Orders); Assert.Equal(order.Id, orderRow.Id); Assert.Equal("one", orderRow.Description); Assert.Equal(client.Id, orderRow.ClientId); // the graph is flattened to a key } [Fact] public void An_order_without_client_stores_an_empty_client_id() { var db = new DbContext(); var order = new Order { Description = "orphan" }; db.Save(order); Assert.Equal(Guid.Empty, Assert.Single(db.Orders).ClientId); } [Fact] public void Saving_again_refreshes_the_row_instead_of_duplicating_it() { var db = new DbContext(); var client = new Client { Name = "Acme" }; var order = new Order { Description = "one" }; client.Orders.Add(order); db.Save(client); db.Save(order); order.Description = "one (edited)"; client.Name = "Acme GmbH"; db.Save(order); db.Save(client); // One row per saved object, refreshed with the *current* state: var orderRow = Assert.Single(db.Orders); Assert.Equal(order.Id, orderRow.Id); Assert.Equal("one (edited)", orderRow.Description); Assert.Equal(client.Id, orderRow.ClientId); var clientRow = Assert.Single(db.Clients); Assert.Equal("Acme GmbH", clientRow.Name); } [Fact] public void Rows_are_reachable_through_Set_and_Find() { var db = new DbContext(); var client = new Client { Name = "Acme" }; var order = new Order { Description = "one" }; client.Orders.Add(order); db.Save(client); db.Save(order); Assert.Single(db.Set()); Assert.Single(db.Set()); var found = db.Find(row => row.Description == "one"); Assert.Equal(order.Id, found!.Id); Assert.Null(db.Find(row => row.Description == "no such order")); } }