public static async Task ExpectNone(this ConnectedProjectionScenario <ProductContext> scenario)
        {
            var database = Guid.NewGuid().ToString("N");

            var specification = scenario.Verify(async context =>
            {
                var actualRecords = await context.AllRecords();
                return(actualRecords.Length == 0
                    ? VerificationResult.Pass()
                    : VerificationResult.Fail($"Expected 0 records but found {actualRecords.Length}."));
            });

            using (var context = CreateContextFor(database))
            {
                var projector = new ConnectedProjector <ProductContext>(specification.Resolver);
                foreach (var message in specification.Messages)
                {
                    var envelope = new Envelope(message, new Dictionary <string, object>()).ToGenericEnvelope();
                    await projector.ProjectAsync(context, envelope);
                }
                await context.SaveChangesAsync();
            }

            using (var context = CreateContextFor(database))
            {
                var result = await specification.Verification(context, CancellationToken.None);

                if (result.Failed)
                {
                    throw specification.CreateFailedScenarioExceptionFor(result);
                }
            }
        }
Пример #2
0
        public async Task Should_be_when_projected_multiple()
        {
            //Arrange
            var connector = new InMemoryConnector();

            var projector = new ConnectedProjector <InMemoryConnector>(connector, _ => new List <IProjection <InMemoryConnector> >
            {
                new CarProjection(),
                new CarHistoryProjection()
            });

            var @event = new CarRegisteredEvent("123", "Ferrari");

            //Act
            await projector.ProjectAsync(@event).ConfigureAwait(false);

            //Assertion
            var carView = connector.Get <CarView>("123");

            carView.Should().NotBeNull();
            carView.Name.Should().Be("Ferrari");

            var carHistoryView = connector.Get <CarHistoryView>("123");

            carHistoryView.Should().NotBeNull();
            carHistoryView.Name.Should().Be("Ferrari");
        }
Пример #3
0
 public async Task ApplyProjections(
     ConnectedProjector <TContext> projector,
     StreamMessage message,
     CancellationToken cancellationToken)
 => await projector.ProjectAsync(
     _context,
     _envelopeFactory.Create(message),
     cancellationToken);
 public ConnectedProjectionMessageHandler(
     ConnectedProjectionIdentifier projection,
     ConnectedProjectionHandler <TContext>[] handlers,
     Func <Owned <IConnectedProjectionContext <TContext> > > contextFactory,
     ILoggerFactory loggerFactory)
 {
     Projection      = projection;
     _contextFactory = contextFactory ?? throw new ArgumentNullException(nameof(contextFactory));
     _projector      = new ConnectedProjector <TContext>(Resolve.WhenEqualToHandlerMessageType(handlers));
     Logger          = loggerFactory?.CreateLogger <ConnectedProjectionMessageHandler <TContext> >() ?? throw new ArgumentNullException(nameof(loggerFactory));
 }
Пример #5
0
 protected Runner(
     string runnerName,
     EnvelopeFactory envelopeFactory,
     ILogger logger,
     IEnumerable <ConnectedProjectionHandler <TContext> > handlers)
 {
     RunnerName       = runnerName;
     _envelopeFactory = envelopeFactory;
     _logger          = logger;
     _tasks           = new ConcurrentBag <Task>();
     _subscriptions   = new ConcurrentBag <IAllStreamSubscription>();
     _projector       = new ConnectedProjector <TContext>(Resolve.WhenEqualToHandlerMessageType(handlers.ToArray()));
 }
Пример #6
0
 public ConnectedProjectionMessageHandler(
     ConnectedProjectionName runnerName,
     ConnectedProjectionHandler <TContext>[] handlers,
     Func <Owned <TContext> > contextFactory,
     EnvelopeFactory envelopeFactory,
     ILoggerFactory loggerFactory)
 {
     _runnerName      = runnerName;
     _contextFactory  = contextFactory ?? throw new ArgumentNullException(nameof(contextFactory));
     _projector       = new ConnectedProjector <TContext>(Resolve.WhenEqualToHandlerMessageType(handlers));
     _envelopeFactory = envelopeFactory ?? throw new ArgumentNullException(nameof(envelopeFactory));
     _logger          = loggerFactory?.CreateLogger <ConnectedProjectionMessageHandler <TContext> >() ?? throw new ArgumentNullException(nameof(loggerFactory));
 }
Пример #7
0
        static async Task Main(string[] args)
        {
            var connector = new ConsoleConnector();

            var projector = new ConnectedProjector <ConsoleConnector>(connector, _ => new List <IProjection <ConsoleConnector> >
            {
                new ConsoleProjection()
            });

            var @event = new FakeEvent("Amsterdam");

            await projector.ProjectAsync(@event).ConfigureAwait(false);
        }
        public static async Task Expect(
            this ConnectedProjectionScenario <ProductContext> scenario,
            params object[] records)
        {
            var database = Guid.NewGuid().ToString("N");

            var specification = scenario.Verify(async context =>
            {
                var comparisonConfig = new ComparisonConfig {
                    MaxDifferences = 5
                };
                var comparer      = new CompareLogic(comparisonConfig);
                var actualRecords = await context.AllRecords();
                var result        = comparer.Compare(
                    actualRecords,
                    records
                    );

                return(result.AreEqual
                    ? VerificationResult.Pass()
                    : VerificationResult.Fail(result.CreateDifferenceMessage(actualRecords, records)));
            });

            using (var context = CreateContextFor(database))
            {
                var projector = new ConnectedProjector <ProductContext>(specification.Resolver);
                var position  = 0L;
                foreach (var message in specification.Messages)
                {
                    var envelope = new Envelope(message, new Dictionary <string, object> {
                        { "Position", position }
                    }).ToGenericEnvelope();
                    await projector.ProjectAsync(context, envelope);

                    position++;
                }

                await context.SaveChangesAsync();
            }

            using (var context = CreateContextFor(database))
            {
                var result = await specification.Verification(context, CancellationToken.None);

                if (result.Failed)
                {
                    throw specification.CreateFailedScenarioExceptionFor(result);
                }
            }
        }
Пример #9
0
        public void Should_throw_not_registered_when_projected()
        {
            //Arrange
            var connector = new InMemoryConnector();

            var projector = new ConnectedProjector <InMemoryConnector>(connector, _ => null);

            var @event = new CarRegisteredEvent("123", "Ferrari");

            //Act
            Func <Task> act = () => projector.ProjectAsync(@event);

            act.Should().Throw <ProjectionNotRegisteredException>();
        }
Пример #10
0
        public void Should_throw_not_found_when_projected()
        {
            //Arrange
            var connector = new InMemoryConnector();

            var projector = new ConnectedProjector <InMemoryConnector>(connector, _ => new List <IProjection <InMemoryConnector> >
            {
                new CarProjection()
            });

            var @event = new CarNameChangedEvent("123", "Ferrari");

            //Act
            Func <Task> act = () => projector.ProjectAsync(@event);

            act.Should().Throw <ProjectionNotFoundException>();
        }
Пример #11
0
        public static async Task Assert <TContext>(
            this ConnectedProjectionTestSpecification <TContext> specification,
            Func <TContext> contextFactory,
            ILogger logger)
            where TContext : DbContext
        {
            var projector = new ConnectedProjector <TContext>(specification.Resolver);

            using (var ctx = contextFactory())
            {
                ctx.Database.EnsureCreated();

                logger.LogTrace($"Given: {Environment.NewLine}{specification.Messages.ToLogStringLimited(max: int.MaxValue)}");

                var position = 0L;

                foreach (var message in specification.Messages.Select(e => new Envelope(
                                                                          e,
                                                                          new ConcurrentDictionary <string, object>(
                                                                              new List <KeyValuePair <string, object> >
                {
                    new KeyValuePair <string, object>(Envelope.PositionMetadataKey, position++)
                })
                                                                          ).ToGenericEnvelope()))
                {
                    await projector.ProjectAsync(ctx, message);

                    await ctx.SaveChangesAsync();
                }

                var result = await specification.Verification(ctx, CancellationToken.None);

                if (result.Failed)
#if NUNIT
                { throw new NUnit.Framework.AssertionException($"The verfication failed because: {result.Message}"); }
#elif XUNIT
                { throw new Xunit.Sdk.XunitException($"The verfication failed because: {result.Message}"); }
#endif

                logger.LogTrace(result.Message);
            }
        }