示例#1
0
        public async Task Should_write_batched()
        {
            var key1 = DomainId.NewGuid();
            var key2 = DomainId.NewGuid();

            var bulk = sut.WithBatchContext(None.Type);

            await bulk.LoadAsync(new[] { key1, key2 });

            var persistedEvents1 = Save.Events();
            var persistence1     = bulk.WithEventSourcing(None.Type, key1, persistedEvents1.Write);

            var persistedEvents2 = Save.Events();
            var persistence2     = bulk.WithEventSourcing(None.Type, key2, persistedEvents2.Write);

            await persistence1.WriteSnapshotAsync(12);

            await persistence2.WriteSnapshotAsync(12);

            A.CallTo(() => snapshotStore.WriteAsync(A <DomainId> ._, A <int> ._, A <long> ._, A <long> ._, A <CancellationToken> ._))
            .MustNotHaveHappened();

            A.CallTo(() => snapshotStore.WriteManyAsync(A <IEnumerable <(DomainId, int, long)> > ._, A <CancellationToken> ._))
            .MustNotHaveHappened();

            await bulk.CommitAsync();

            await bulk.DisposeAsync();

            A.CallTo(() => snapshotStore.WriteManyAsync(A <IEnumerable <(DomainId, int, long)> > .That.Matches(x => x.Count() == 2), A <CancellationToken> ._))
            .MustHaveHappenedOnceExactly();
        }
示例#2
0
        public async Task Should_write_to_store_with_previous_version()
        {
            InvalidateMessage message = null;

            pubSub.Subscribe <InvalidateMessage>(m =>
            {
                message = m;
            });

            A.CallTo(() => snapshotStore.ReadAsync(key))
            .Returns((123, 13));

            var actualObject = await sut.GetSingleAsync <MyStatefulObject, string>(key);

            Assert.Same(statefulObject, actualObject);
            Assert.Equal(123, statefulObject.State);

            statefulObject.SetState(456);

            await statefulObject.WriteStateAsync();

            A.CallTo(() => snapshotStore.WriteAsync(key, 456, 13, 14))
            .MustHaveHappened();

            Assert.NotNull(message);
            Assert.Equal(key, message.Key);
        }
示例#3
0
        public void Should_configure_new_keys()
        {
            A.CallTo(() => store.ReadAsync(A <DomainId> ._, default))
            .Returns((null !, true, 0));

            var options = new OpenIddictServerOptions();

            sut.Configure(options);

            Assert.NotEmpty(options.SigningCredentials);
            Assert.NotEmpty(options.EncryptionCredentials);

            A.CallTo(() => store.WriteAsync(A <DomainId> ._, A <DefaultKeyStore.State> ._, 0, 0, default))
            .MustHaveHappenedOnceExactly();
        }
        public async Task WriteSnapshotAsync(TState state)
        {
            try
            {
                var newVersion = UseEventSourcing() ? versionEvents : versionSnapshot + 1;

                if (newVersion != versionSnapshot)
                {
                    try
                    {
                        await snapshotStore.WriteAsync(ownerKey, state, versionSnapshot, newVersion);
                    }
                    catch (InconsistentStateException ex)
                    {
                        throw new DomainObjectVersionException(ownerKey.ToString(), typeof(TOwner), ex.CurrentVersion, ex.ExpectedVersion);
                    }

                    versionSnapshot = newVersion;
                }

                UpdateVersion();

                invalidate?.Invoke();
            }
            catch
            {
                failed?.Invoke();

                throw;
            }
        }
        public void Should_write_new_item_to_store_with_friendly_name()
        {
            sut.StoreElement(new XElement("a"), "friendly-name");

            A.CallTo(() => store.WriteAsync("friendly-name", A <DefaultXmlRepository.State> .That.Matches(x => x.Xml == "<a />"), EtagVersion.Any, EtagVersion.Any))
            .MustHaveHappened();
        }
示例#6
0
        public async Task Should_write_to_store_with_previous_version()
        {
            A.CallTo(() => snapshotStore.ReadAsync(key))
            .Returns((123, 13));

            var actualObject = await sut.GetSingleAsync <MyStatefulObject, string>(key);

            Assert.Same(statefulObject, actualObject);
            Assert.Equal(123, statefulObject.State);

            statefulObject.SetState(456);

            await statefulObject.WriteStateAsync();

            A.CallTo(() => snapshotStore.WriteAsync(key, 456, 13, 14))
            .MustHaveHappened();
        }
示例#7
0
        public async Task Should_generate_signing_credentials_once()
        {
            A.CallTo(() => store.ReadAsync(A <Guid> ._))
            .Returns((null !, 0));

            var credentials1 = await sut.GetSigningCredentialsAsync();

            var credentials2 = await sut.GetSigningCredentialsAsync();

            Assert.Same(credentials1, credentials2);

            A.CallTo(() => store.ReadAsync(A <Guid> ._))
            .MustHaveHappenedOnceExactly();

            A.CallTo(() => store.WriteAsync(A <Guid> ._, A <DefaultKeyStore.State> ._, 0, 0))
            .MustHaveHappenedOnceExactly();
        }
示例#8
0
        public async Task Should_write_to_store_with_previous_version()
        {
            A.CallTo(() => snapshotStore.ReadAsync(key))
            .Returns((20, true, 10));

            var persistedState = Save.Snapshot(0);
            var persistence    = sut.WithSnapshots(None.Type, key, persistedState.Write);

            await persistence.ReadAsync();

            Assert.Equal(10, persistence.Version);
            Assert.Equal(20, persistedState.Value);

            await persistence.WriteSnapshotAsync(100);

            A.CallTo(() => snapshotStore.WriteAsync(key, 100, 10, 11))
            .MustHaveHappened();
        }
示例#9
0
        public async Task Should_write_to_store_with_previous_version()
        {
            A.CallTo(() => snapshotStore.ReadAsync(key))
            .Returns((20, 10));

            var persistedState = 0;
            var persistence    = sut.WithSnapshots <object, int, string>(key, x => persistedState = x);

            await persistence.ReadAsync();

            Assert.Equal(10, persistence.Version);
            Assert.Equal(20, persistedState);

            await persistence.WriteSnapshotAsync(100);

            A.CallTo(() => snapshotStore.WriteAsync(key, 100, 10, 11))
            .MustHaveHappened();
        }
示例#10
0
        public void Should_write_to_store()
        {
            var xml = new XElement("xml");

            sut.StoreElement(xml, "name");

            A.CallTo(() => store.WriteAsync("name", A <DefaultXmlRepository.State> ._, A <long> ._, 0))
            .MustHaveHappened();
        }
        public async Task Should_write_state_and_events_when_created()
        {
            await SetupEmptyAsync();

            var result = await sut.ExecuteAsync(new CreateAuto { Value = 4 });

            A.CallTo(() => snapshotStore.WriteAsync(id, A <MyDomainState> .That.Matches(x => x.Value == 4), -1, 0))
            .MustHaveHappened();
            A.CallTo(() => persistence.WriteEventsAsync(A <IEnumerable <Envelope <IEvent> > > .That.Matches(x => x.Count() == 1)))
            .MustHaveHappened();

            Assert.True(result is EntityCreatedResult <Guid>);

            Assert.Empty(sut.GetUncomittedEvents());

            Assert.Equal(4, sut.Snapshot.Value);
            Assert.Equal(0, sut.Snapshot.Version);
        }
示例#12
0
        public Task UpdateAsync()
        {
            return(stateForAssets.ReadAllAsync(async(state, version) =>
            {
                state.Slug = state.FileName.ToAssetSlug();

                await stateForAssets.WriteAsync(state.Id, state, version, version);
            }));
        }
示例#13
0
        public Task UpdateAsync()
        {
            return(stateForAssets.ReadAllAsync(async(state, version) =>
            {
                state.Slug = state.FileName.ToAssetSlug();

                var key = DomainId.Combine(state.AppId.Id, state.Id).ToString();

                await stateForAssets.WriteAsync(key, state, version, version);
            }));
        }
示例#14
0
        public async Task Should_write_events_to_store()
        {
            SetupEventStore(3);

            var persistedEvents = Save.Events();
            var persistence     = sut.WithEventSourcing(None.Type, key, persistedEvents.Write);

            await persistence.ReadAsync();

            await persistence.WriteEventAsync(Envelope.Create(new MyEvent()));

            await persistence.WriteEventAsync(Envelope.Create(new MyEvent()));

            A.CallTo(() => eventStore.AppendAsync(A <Guid> ._, key, 2, A <ICollection <EventData> > .That.Matches(x => x.Count == 1)))
            .MustHaveHappened();
            A.CallTo(() => eventStore.AppendAsync(A <Guid> ._, key, 3, A <ICollection <EventData> > .That.Matches(x => x.Count == 1)))
            .MustHaveHappened();

            A.CallTo(() => snapshotStore.WriteAsync(A <string> ._, A <int> ._, A <long> ._, A <long> ._))
            .MustNotHaveHappened();
        }
示例#15
0
        public async Task UpdateAsync(
            CancellationToken ct)
        {
            await foreach (var(state, version) in stateForAssets.ReadAllAsync(ct))
            {
                state.Slug = state.FileName.ToAssetSlug();

                var key = DomainId.Combine(state.AppId.Id, state.Id);

                await stateForAssets.WriteAsync(key, state, version, version, ct);
            }
        }
示例#16
0
        public async Task WriteSnapshotAsync(TSnapshot state)
        {
            var newVersion = UseEventSourcing() ? versionEvents : versionSnapshot + 1;

            if (newVersion != versionSnapshot)
            {
                await snapshotStore.WriteAsync(ownerKey, state, versionSnapshot, newVersion);

                versionSnapshot = newVersion;
            }

            UpdateVersion();
        }
示例#17
0
        public async Task WriteSnapshotAsync(TSnapshot state)
        {
            var newVersion = UseEventSourcing() ? versionEvents : versionSnapshot + 1;

            if (newVersion != versionSnapshot)
            {
                try
                {
                    await snapshotStore.WriteAsync(ownerKey, state, versionSnapshot, newVersion);
                }
                catch (InconsistentStateException ex)
                {
                    throw new DomainObjectVersionException(ownerKey.ToString(), ownerType, ex.CurrentVersion, ex.ExpectedVersion);
                }

                versionSnapshot = newVersion;
            }

            UpdateVersion();
        }
示例#18
0
 public void StoreElement(XElement element, string friendlyName)
 {
     store.WriteAsync(friendlyName, new State {
         Xml = element.ToString()
     }, EtagVersion.Any, EtagVersion.Any).Wait();
 }
示例#19
0
        public void StoreElement(XElement element, string friendlyName)
        {
            var state = new State(element);

            store.WriteAsync(friendlyName, state, EtagVersion.Any, 0);
        }