public void SnapshotContainsJson()
        {
            var domainObject = new DefaultDomainObject();

            var snapshot = domainObject.CreateSnapshot();

            Assert.False(string.IsNullOrWhiteSpace(snapshot.JsonData), "string.IsNullOrWhiteSpace(snapshot.JsonData)");
        }
        public void SnapshotContainsIdentifier()
        {
            var domainObject = new DefaultDomainObject();

            var snapshot = domainObject.CreateSnapshot();

            Assert.False(string.IsNullOrWhiteSpace(snapshot.Identifier), "string.IsNullOrWhiteSpace(snapshot.Identifier)");
        }
        public async Task NothingWrittenWithoutStoredEvents()
        {
            var domainObject = new DefaultDomainObject();
            var store        = new Mock <IEventStore>(MockBehavior.Strict);
            var result       = await domainObject.WriteRecordedEvents(store.Object);

            Assert.False(result.IsError, "result.IsError");
        }
        public void SnapshotIncludesSubProperties()
        {
            var domainObject = new DefaultDomainObject();

            var snapshot = domainObject.CreateSnapshot();

            Assert.Contains($"\"{nameof(DefaultDomainObject.FooBarSubProperty1)}\":{domainObject.FooBarSubProperty1}",
                            snapshot.JsonData,
                            StringComparison.OrdinalIgnoreCase);
        }
        public void UnknownSnapshotNotAccepted()
        {
            var domainObject = new DefaultDomainObject();

            var versions = (domainObject.CurrentVersion, domainObject.MetaVersion);

            domainObject.ApplySnapshot(new DomainObjectSnapshot("ForgedDataType", "Some-Identifier", "{}", long.MaxValue, long.MaxValue));

            Assert.Equal(versions, (domainObject.CurrentVersion, domainObject.MetaVersion));
        }
        public void NullEventReplayed()
        {
            var domainObject = new DefaultDomainObject();

            var versions = (domainObject.CurrentVersion, domainObject.MetaVersion);

            domainObject.ApplyEvent(null);

            Assert.Equal(versions.CurrentVersion, domainObject.CurrentVersion);
            Assert.Equal(versions.MetaVersion, domainObject.MetaVersion);
        }
        public void SnapshotContainsVersion()
        {
            var domainObject = new DefaultDomainObject();

            domainObject.SetVersion(42, 4711);

            var snapshot = domainObject.CreateSnapshot();

            Assert.Equal(42, snapshot.Version);
            Assert.Equal(4711, snapshot.MetaVersion);
        }
        public void EventReplayHandlerInvoked()
        {
            var domainObject = new DefaultDomainObject();

            Assert.RaisesAny <EventArgs>(e => domainObject.EventReplayHandled += e,
                                         e => domainObject.EventReplayHandled -= e,
                                         () => domainObject.ApplyEvent(new ReplayedEvent
            {
                Version     = 42,
                UtcTime     = DateTime.UtcNow,
                DomainEvent = new EnvironmentCreated(new EnvironmentIdentifier("Foo", "Bar"))
            }));
        }
        public void VersionsIncrementedAfterReplay()
        {
            var domainObject = new DefaultDomainObject();

            domainObject.ApplyEvent(new ReplayedEvent
            {
                Version     = 42,
                UtcTime     = DateTime.UtcNow,
                DomainEvent = new EnvironmentCreated(new EnvironmentIdentifier("Foo", "Bar"))
            });

            Assert.Equal(42, domainObject.CurrentVersion);
            Assert.Equal(42, domainObject.MetaVersion);
        }
        public async Task QueueClearedAfterWrite()
        {
            var domainObject = new DefaultDomainObject();

            domainObject.AddEvent(new EnvironmentCreated(new EnvironmentIdentifier("Foo", "Bar")));

            var store = new Mock <IEventStore>(MockBehavior.Strict);

            store.Setup(s => s.WriteEvents(It.IsAny <IList <DomainEvent> >()))
            .ReturnsAsync(42);

            await domainObject.WriteRecordedEvents(store.Object);

            Assert.Empty(domainObject.GetCapturedDomainEvents());
        }
        public async Task IncrementVersionAfterWrite()
        {
            var domainObject = new DefaultDomainObject();

            domainObject.AddEvent(new EnvironmentCreated(new EnvironmentIdentifier("Foo", "Bar")));

            var store = new Mock <IEventStore>(MockBehavior.Strict);

            store.Setup(s => s.WriteEvents(It.IsAny <IList <DomainEvent> >()))
            .ReturnsAsync(42);

            await domainObject.WriteRecordedEvents(store.Object);

            Assert.Equal(42, domainObject.CurrentVersion);
            Assert.Equal(42, domainObject.MetaVersion);
        }
        public void OldEventGiven()
        {
            var domainObject = new DefaultDomainObject();

            domainObject.SetVersion(100, 101);

            domainObject.ApplyEvent(new ReplayedEvent
            {
                Version     = 42,
                UtcTime     = DateTime.UtcNow,
                DomainEvent = new DefaultEnvironmentCreated(new EnvironmentIdentifier("Foo", "Bar"))
            });

            Assert.Equal(100, domainObject.CurrentVersion);
            Assert.Equal(101, domainObject.MetaVersion);
        }
        public void UnhandledEventGiven()
        {
            var domainObject = new DefaultDomainObject();

            var versions = (domainObject.CurrentVersion, domainObject.MetaVersion);

            domainObject.ApplyEvent(new ReplayedEvent
            {
                Version     = 42,
                UtcTime     = DateTime.UtcNow,
                DomainEvent = new DefaultEnvironmentCreated(new EnvironmentIdentifier("Foo", "Bar"))
            });

            Assert.Equal(versions.CurrentVersion, domainObject.CurrentVersion);
            Assert.Equal(42, domainObject.MetaVersion);
        }
        public void NullDomainEventReplayed()
        {
            var domainObject = new DefaultDomainObject();

            var versions = (domainObject.CurrentVersion, domainObject.MetaVersion);

            domainObject.ApplyEvent(new ReplayedEvent
            {
                Version     = 42,
                UtcTime     = DateTime.UtcNow,
                DomainEvent = null
            });

            Assert.Equal(versions.CurrentVersion, domainObject.CurrentVersion);
            Assert.Equal(versions.MetaVersion, domainObject.MetaVersion);
        }
        public void SnapshotAppliedInternally()
        {
            var domainObject = new DefaultDomainObject {
                FooBarSubProperty1 = 4242
            };

            domainObject.SetVersion(42, 42);

            var snapshot = domainObject.CreateSnapshot();

            Assert.RaisesAny <EventArgs>(e => domainObject.SnapshotAppliedInternally += e,
                                         e => domainObject.SnapshotAppliedInternally -= e,
                                         () => { domainObject.ApplySnapshot(snapshot); });

            Assert.Equal(42, domainObject.MetaVersion);
            Assert.Equal(42, domainObject.CurrentVersion);
        }
        public void ReturnValidationErrors()
        {
            var validator = new Mock <ICommandValidator>(MockBehavior.Strict);

            validator.Setup(v => v.ValidateDomainEvent(It.IsAny <EnvironmentCreated>()))
            .Returns(() => Result.Error("Something went wrong", ErrorCode.Undefined));

            var domainObject = new DefaultDomainObject();
            var domainEvent  = new EnvironmentCreated(new EnvironmentIdentifier("Foo", "Bar"));

            domainObject.AddEvent(domainEvent);

            var result = domainObject.Validate(new List <ICommandValidator> {
                validator.Object
            });

            Assert.NotEmpty(result[domainEvent]);
        }
        public void ValidatesCapturedEvents()
        {
            var validator = new Mock <ICommandValidator>(MockBehavior.Strict);

            validator.Setup(v => v.ValidateDomainEvent(It.IsAny <EnvironmentCreated>()))
            .Returns(Result.Success)
            .Verifiable();

            var domainObject = new DefaultDomainObject();

            domainObject.AddEvent(new EnvironmentCreated(new EnvironmentIdentifier("Foo", "Bar")));

            domainObject.Validate(new List <ICommandValidator> {
                validator.Object
            });

            validator.Verify();
        }