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); } } }
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"); }
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)); }
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())); }
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)); }
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); } } }
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>(); }
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>(); }
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); } }