public DefaultEventSerializer( ISerializer serializer, IEventMetadataProvider metadataProvider, ILogger <DefaultEventSerializer> logger) { _serializer = serializer ?? throw new ArgumentNullException(nameof(serializer)); _metadataProvider = metadataProvider ?? throw new ArgumentNullException(nameof(metadataProvider)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); }
public Repository(IEventStoreTransaction transaction, IEventMetadataProvider metadataProvider) { _transaction = Check.NotNull(transaction, nameof(transaction)); _metadataProvider = Check.NotNull(metadataProvider, nameof(metadataProvider)); }
public void SaveAndGet( TestEventStore store, Repository <Customer> repo, Customer c, Customer duplicate, Customer invalid, List <IEvent> allChanges ) { GIVEN["a TestEventStore"] = () => store = new TestEventStore(); GIVEN["a repository"] = () => { IEventMetadataProvider provider = Substitute.For <IEventMetadataProvider>(); provider.Provide().Returns(new DefaultEventMetadata(DateTime.Now)); repo = new Repository <Customer>(store.UseTransaction(null), provider); }; AND["a new customer with pending changes"] = () => { IEvent[] changes = { new Customer.Created(), new Customer.Promoted() }; allChanges = new List <IEvent>(changes); c = Substitute.For <Customer>(ID.NewID()); c.SetupGetChanges(isNew: true, changes); }; When["calling Save"] = () => Save(repo, c); THEN["the changes are stored in the event store"] = () => store.All.Single().Events.Should().BeEquivalentTo(c.RecordedChanges); AND["ClearChanges was called"] = () => c.Received().ClearChanges(); GIVEN["an existing customer with changes"] = () => { IEvent[] changes = { new Customer.AddressChanged() }; allChanges.AddRange(changes); c.SetupGetChanges(isNew: false, changes); }; When["calling Save"] = () => Save(repo, c); THEN["the changes are stored in the event store"] = () => store.All.ElementAt(1).Events.Should().BeEquivalentTo(c.RecordedChanges); GIVEN["a new customer with an existing ID"] = () => { duplicate = new Customer(c.ID); duplicate.SetupGetChanges(isNew: true); }; Then["calling Save", ThrowsA <InvalidOperationException>()] = () => Save(repo, duplicate); GIVEN["a new customer where Changeset.IsNew returns false"] = () => { invalid = new Customer(ID.NewID()); invalid.SetupGetChanges(isNew: false); }; Then["calling Save", ThrowsA <InvalidOperationException>()] = () => Save(repo, invalid); When["saving a second customr"] = () => { Customer second = new Customer(ID.NewID()); second.SetupGetChanges(isNew: true, new Customer.Created()); return(Save(repo, second)); }; And["getting the first object"] = async() => c = await repo.Get(c.ID); THEN["Restore was called with the original events"] = () => c.RestoreArgument.Should().BeEquivalentTo(allChanges, o => o.WithStrictOrdering()); }