예제 #1
0
        public async Task GivenNoPreviousPaths_WhenPublishingPathCreatedEvent_ThenWePublish()
        {
            var client = this.GivenIEventStoreClient()
                         .WithAppendToStreamAsync(this._pathStream);

            var reader = this.GivenIReadStreamedEvents <PathStream>()
                         .WithEvents(Enumerable.Empty <IEvent>());

            var created = new PathCreatedEvent {
                FeatureAdded = "bob",
                Path         = "let/me/show/you",
            };

            var aggregate = await this
                            .GivenAggregate(reader.Object, client.Object)
                            .WithLoad();

            await aggregate
            .WhenPublishing(created)
            .ThenWePublish(client, created);

            aggregate.Paths.Select(_ => _.Name)
            .Should()
            .BeEquivalentTo(new List <string> {
                "let",
                "let/me",
                "let/me/show",
                "let/me/show/you"
            });
        }
예제 #2
0
        public async Task GivenOnePreExistingPath_WhenRemovingThePath_ThenThePathsAreEmptied()
        {
            var created = new PathCreatedEvent {
                FeatureAdded = "bob",
                Path         = "let/me/show/you"
            };

            var removed = new PathRemovedEvent {
                FeatureRemoved = "bob",
                Path           = "let/me/show/you"
            };

            var client = this.GivenIEventStoreClient()
                         .WithAppendToStreamAsync(this._pathStream);

            var reader = this.GivenIReadStreamedEvents <PathStream>()
                         .WithEvents(new List <IEvent> {
                created, removed
            });

            var aggregate = await this
                            .GivenAggregate(reader.Object, client.Object)
                            .WithLoad();

            aggregate.Paths.Should().BeEmpty();
        }
예제 #3
0
        public async Task GivenPreExistingPaths_WhenRemovingThePath_ThenThePathsAreUpdated()
        {
            var created = new PathCreatedEvent {
                FeatureAdded = "bob",
                Path         = "let/me/show/you"
            };

            var createdSecond = new PathCreatedEvent {
                FeatureAdded = "bob",
                Path         = "let/me/show"
            };

            var createdThird = new PathCreatedEvent {
                FeatureAdded = "bob",
                Path         = "let/me"
            };

            var client = this.GivenIEventStoreClient()
                         .WithAppendToStreamAsync(this._pathStream);

            var reader = this.GivenIReadStreamedEvents <PathStream>()
                         .WithEvents(new List <IEvent> {
                created, createdSecond, createdThird
            });

            var removed = new PathRemovedEvent {
                FeatureRemoved = "bob",
                Path           = "let/me/show/you"
            };

            var aggregate = await this
                            .GivenAggregate(reader.Object, client.Object)
                            .WithLoad();

            await aggregate
            .WhenPublishing(removed)
            .ThenWePublish(client, removed);

            aggregate.Paths.Should()
            .BeEquivalentTo(new List <Path>
            {
                new Path
                {
                    Name          = "let",
                    TotalFeatures = 2
                },
                new Path
                {
                    Name          = "let/me",
                    TotalFeatures = 2
                },
                new Path
                {
                    Name          = "let/me/show",
                    TotalFeatures = 1
                }
            });
        }
예제 #4
0
        public static EventData ToEventData(this PathCreatedEvent pathCreatedEvent, JsonSerializerOptions settings = null !)
        {
            var contentBytes = JsonSerializer.SerializeToUtf8Bytes(pathCreatedEvent, settings);

            return(new EventData(
                       eventId: Uuid.NewUuid(),
                       type: pathCreatedEvent.Type,
                       data: contentBytes
                       ));
        }
예제 #5
0
        private void Apply(PathCreatedEvent e)
        {
            var sections = PathHelper.TranformToPathLevels(e.Path);

            var existingPaths = this.Paths
                                .Where(_ => sections.Contains(_.Name))
                                .Select(_ => _.Name)
                                .ToList();
            var missingSections = sections
                                  .Except(existingPaths)
                                  .ToList();

            if (existingPaths.Any())
            {
                this.Paths = this.Paths
                             .Select(p =>
                {
                    if (sections.Contains(p.Name))
                    {
                        return(new Domain.Path
                        {
                            Name = p.Name,
                            TotalFeatures = p.TotalFeatures + 1,
                        });
                    }

                    return(p);
                })
                             .ToList();

                if (missingSections.Any())
                {
                    this.Paths = this.Paths.Concat(
                        missingSections.Select(_ =>
                                               new Domain.Path
                    {
                        Name          = _,
                        TotalFeatures = 1,
                    }))
                                 .ToList();
                }
            }
            else if (!existingPaths.Any())
            {
                this.Paths = this.Paths.Concat(
                    sections.Select(_ =>
                                    new Domain.Path
                {
                    Name          = _,
                    TotalFeatures = 1,
                }))
                             .ToList();
            }
        }
예제 #6
0
        public async Task GivenNotConflictingPaths_WhenPublishingPathCreatedEvent_ThenWePublishTheFeature()
        {
            var createdAlready = new PathCreatedEvent {
                FeatureAdded = "bob",
                Path         = "let/me/show/you",
            };

            var client = this.GivenIEventStoreClient()
                         .WithAppendToStreamAsync(this._pathStream);

            var reader = this.GivenIReadStreamedEvents <PathStream>()
                         .WithEvents(new List <IEvent> {
                createdAlready
            });

            var created = new PathCreatedEvent {
                FeatureAdded = "bob",
                Path         = "let/me/show",
            };

            var aggregate = await this
                            .GivenAggregate(reader.Object, client.Object)
                            .WithLoad();

            await aggregate
            .WhenPublishing(created)
            .ThenWePublish(client, created);

            aggregate.Paths.Should()
            .BeEquivalentTo(new List <Path>
            {
                new Path
                {
                    Name          = "let",
                    TotalFeatures = 2,
                },
                new Path
                {
                    Name          = "let/me",
                    TotalFeatures = 2,
                },
                new Path
                {
                    Name          = "let/me/show",
                    TotalFeatures = 2,
                },
                new Path
                {
                    Name          = "let/me/show/you",
                    TotalFeatures = 1,
                },
            });
        }
예제 #7
0
        public async Task GivenOnePreExistingPath_WhenRemovingAnUnknownPath_ThenThePathIsUntouched()
        {
            var created = new PathCreatedEvent {
                FeatureAdded = "bob",
                Path         = "let/me/show/you"
            };

            var removed = new PathRemovedEvent {
                FeatureRemoved = "bob",
                Path           = "let/me/show/arrrrgh"
            };

            var client = this.GivenIEventStoreClient()
                         .WithAppendToStreamAsync(this._pathStream);

            var reader = this.GivenIReadStreamedEvents <PathStream>()
                         .WithEvents(new List <IEvent> {
                created, removed
            });

            var aggregate = await this
                            .GivenAggregate(reader.Object, client.Object)
                            .WithLoad();

            aggregate.Paths.Should()
            .BeEquivalentTo(new List <Path>
            {
                new Path
                {
                    Name          = "let",
                    TotalFeatures = 1
                },
                new Path
                {
                    Name          = "let/me",
                    TotalFeatures = 1
                },
                new Path
                {
                    Name          = "let/me/show",
                    TotalFeatures = 1
                },
                new Path
                {
                    Name          = "let/me/show/you",
                    TotalFeatures = 1
                }
            });
        }
        public async Task GivenUnsupportedEventInStream_WhenReading_ThenWeReturnEmptyList()
        {
            var eventOne = new PathCreatedEvent
            {
                Path = "🦄",
            };

            var results = new Dictionary <string, byte[]>
            {
                { eventOne.Type, JsonSerializer.SerializeToUtf8Bytes(eventOne) },
            };

            var client = this.GivenIEventStoreClient()
                         .WithReadStreamAsync(this._stream, results);

            await this
            .GivenFeatureStreamEventsReader(client.Object)
            .WhenReading()
            .ThenWeReturnEmptyList();
        }
예제 #9
0
        public static async Task ThenWePublish(
            this Func <Task> funk,
            Mock <IEventStoreClient> mockedClient,
            PathCreatedEvent e)
        {
            await funk();

            mockedClient.Verify(
                _ => _.AppendToStreamAsync(
                    It.IsAny <PathStream>(),
                    It.IsAny <StreamState>(),
                    It.Is <IEnumerable <EventData> >(items =>
                                                     items.All(ed =>
                                                               ed.Type.Equals(EventTypes.PathCreated) &&
                                                               JsonSerializer.Deserialize <PathCreatedEvent>(ed.Data.ToArray(), null) !.Path.Equals(e.Path, StringComparison.InvariantCultureIgnoreCase)
                                                               )),
                    It.IsAny <Action <EventStoreClientOperationOptions>?>(),
                    It.IsAny <UserCredentials?>(),
                    It.IsAny <CancellationToken>()),
                Times.Once());
        }
예제 #10
0
        public async Task GivenEventsInStream_Whenreading_ThenWeReturnEventList()
        {
            var eventOne = new PathCreatedEvent
            {
                Path = "🦄",
            };

            var results = new Dictionary <string, byte[]>
            {
                { eventOne.Type, JsonSerializer.SerializeToUtf8Bytes(eventOne) },
            };

            var client = this.GivenIEventStoreClient()
                         .WithReadStreamAsync(this._stream, results);

            await PathStreamEventsReaderTestsExtenstions.ThenWeReturnEventList(this
                                                                               .GivenPathStreamEventsReader(client.Object)
                                                                               .WhenReading(), new List <IEvent> {
                eventOne
            });
        }
예제 #11
0
        public async Task GivenOtherPaths_WhenPublishingPathCreatedEvent_ThenWePublish()
        {
            var createdAlready = new PathCreatedEvent {
                FeatureAdded = "derpy",
                Path         = "derpy/wants/muffins",
            };

            var client = this.GivenIEventStoreClient()
                         .WithAppendToStreamAsync(this._pathStream);

            var reader = this.GivenIReadStreamedEvents <PathStream>()
                         .WithEvents(new List <IEvent> {
                createdAlready
            });

            var created = new PathCreatedEvent {
                FeatureAdded = "bob",
                Path         = "let.me",
            };

            var aggregate = await this
                            .GivenAggregate(reader.Object, client.Object)
                            .WithLoad();

            await aggregate
            .WhenPublishing(created)
            .ThenWePublish(client, created);

            aggregate.Paths.Select(_ => _.Name)
            .Should()
            .BeEquivalentTo(new List <string> {
                "derpy",
                "derpy/wants",
                "derpy/wants/muffins",
                "let",
                "let.me"
            });
        }