public async void CanMergeWithoutNewStreams() { var container = CreateContainer(new List <Action <Container> >() { Config.RegisterSagas }); var bus = container.GetInstance <IBus>(); var manager = container.GetInstance <IBranchManager>(); var command = new CreateRoot("Root"); await await bus.CommandAsync(command); await manager.Branch("test"); await await bus.CommandAsync(new UpdateRoot("Root")); var infoQuery = new RootInfoQuery("Root"); await bus.IsTrue(infoQuery, r => r.CreatedAt < r.UpdatedAt); await await bus.CommandAsync(new CreateRoot("BranchRoot")); manager.Reset(); await bus.IsTrue(infoQuery, r => r.CreatedAt == r.UpdatedAt); await manager.Merge("test", false); await bus.IsTrue(infoQuery, r => r.CreatedAt < r.UpdatedAt); await bus.Equal(new StatsQuery(), s => s.NumberOfRoots, 2); }
public async void CanCreateEmpty() { var container = CreateContainer(); var bus = container.GetInstance <IBus>(); var repository = container.GetInstance <IEsRepository <IAggregate> >(); var command = new CreateRoot("Root"); await await bus.CommandAsync(command); await repository.Find <Root>("Root"); var timeline = container.GetInstance <ITimeline>(); Assert.Equal("master", timeline.Id); var timeTraveller = container.GetInstance <IBranchManager>(); await timeTraveller.Branch("test", Time.MinValue); Assert.Equal("test", timeline.Id); await bus.IsTrue(new StatsQuery(), s => s.NumberOfRoots == 0); timeTraveller.Reset(); Assert.Equal("master", timeline.Id); await repository.FindUntil <Root>("Root"); await bus.IsTrue(new StatsQuery(), s => s.NumberOfRoots == 1); }
public async void CanPushSnapshot() { var container = CreateContainer(new List <Action <Container> > { c => c.UseLocalStore() }); var bus = container.GetInstance <IBus>(); var manager = container.GetInstance <IBranchManager>(); var remote = container.GetInstance <IRemote>(); var repository = container.GetInstance <IEsRepository <IAggregate> >(); var id = "Root"; var command = new CreateRoot(id); await await bus.CommandAsync(command); await await bus.CommandAsync(new UpdateRoot(id)); await await bus.CommandAsync(new CreateSnapshot <Root>(id)); var result = await remote.Push(BranchManager.Master); Assert.Equal(Status.Success, result.ResultStatus); await manager.Branch("test"); await await bus.CommandAsync(new UpdateRoot(id)); result = await remote.Push("test"); Assert.Equal(Status.Success, result.ResultStatus); var root = await repository.Find <Root>(id); Assert.Equal(3, root.Version); Assert.Equal(2, root.SnapshotVersion); }
public async void CanCreateClone() { var container = CreateContainer(new List <Action <Container> >() { Config.RegisterSagas }); var bus = container.GetInstance <IBus>(); var repository = container.GetInstance <IEsRepository <IAggregate> >(); var manager = container.GetInstance <IBranchManager>(); var locator = container.GetInstance <IStreamLocator>(); var queue = container.GetInstance <IMessageQueue>(); var command = new CreateRoot("Root"); await await bus.CommandAsync(command); var timeline = container.GetInstance <ITimeline>(); Assert.Equal("master", timeline.Id); await manager.Branch("test"); Assert.Equal("test", manager.ActiveBranch); manager.Reset(); Assert.Equal(BranchManager.Master, manager.ActiveBranch); await await bus.CommandAsync(new UpdateRoot("Root")); await manager.Branch("test"); Assert.Equal("test", timeline.Id); var root = await repository.Find <Root>("Root"); Assert.Equal("Root", root.Id); await bus.IsTrue(new RootInfoQuery("Root"), r => r.CreatedAt != default && r.CreatedAt == r.UpdatedAt); await await bus.CommandAsync(new CreateRoot("TestRoot")); await bus.IsTrue(new RootInfoQuery("TestRoot"), r => r.CreatedAt != default); Assert.NotNull(locator.Find <TestSaga>("Root")); manager.Reset(); await bus.IsTrue(new RootInfoQuery("Root"), r => r.CreatedAt != r.UpdatedAt); await bus.IsTrue(new RootInfoQuery("TestRoot"), r => r.CreatedAt == r.UpdatedAt); await manager.Branch("test"); queue.Alert(new InvalidateProjections()); await bus.IsTrue(new RootInfoQuery("TestRoot"), r => r.CreatedAt != default); await bus.IsTrue(new RootInfoQuery("Root"), r => r.CreatedAt != default && r.CreatedAt == r.UpdatedAt); var graph = container.GetInstance <IGraph>(); await graph.Serialise(); }
public async void CanSaveRoot() { var container = CreateContainer(); var bus = container.GetInstance <IBus>(); var repository = container.GetInstance <IEsRepository <IAggregate> >(); var command = new CreateRoot("Root"); await await bus.CommandAsync(command); var root = await repository.Find <Root>("Root"); Assert.Equal("Root", root.Id); }
public async void CanCreateGraph() { var container = CreateContainer(); var bus = container.GetInstance <IBus>(); var graph = container.GetInstance <IGraph>(); var manager = container.GetInstance <IBranchManager>(); var command = new CreateRoot("Root"); await await bus.CommandAsync(command); await manager.Branch("test"); await await bus.CommandAsync(new UpdateRoot("Root")); await graph.Populate(); }
public async void CanMergeGrandTimeline() { var container = CreateContainer(); var bus = container.GetInstance <IBus>(); var timeTraveller = container.GetInstance <IBranchManager>(); var queue = container.GetInstance <IMessageQueue>(); var command = new CreateRoot("Root"); await await bus.CommandAsync(command); var timeline = container.GetInstance <ITimeline>(); Assert.Equal("master", timeline.Id); await timeTraveller.Branch("test"); await await bus.CommandAsync(new CreateRoot("testRoot")); await timeTraveller.Branch("grandTest"); queue.Alert(new InvalidateProjections()); await await bus.CommandAsync(new CreateRoot("testRoot2")); await bus.IsTrue(new StatsQuery(), s => s.NumberOfRoots == 3); await timeTraveller.Branch("test"); queue.Alert(new InvalidateProjections()); await bus.IsTrue(new StatsQuery(), s => s.NumberOfRoots == 2); await timeTraveller.Merge("grandTest"); await bus.IsTrue(new StatsQuery(), s => s.NumberOfRoots == 3); timeTraveller.Reset(); await bus.IsTrue(new StatsQuery(), s => s.NumberOfRoots == 1); await timeTraveller.Merge("test"); await bus.IsTrue(new StatsQuery(), s => s.NumberOfRoots == 3); var graph = container.GetInstance <IGraph>(); await graph.Populate(); await graph.Serialise(); }
public async void CanPushGrandBranch() { var container = CreateContainer(new List <Action <Container> > { c => c.UseLocalStore() }); var bus = container.GetInstance <IBus>(); var timeTraveller = container.GetInstance <IBranchManager>(); var remote = container.GetInstance <IRemote>(); var command = new CreateRoot("Root"); await await bus.CommandAsync(command); var result = await remote.Push(BranchManager.Master); Assert.Equal(Status.Success, result.ResultStatus); var timeline = container.GetInstance <ITimeline>(); Assert.Equal("master", timeline.Id); await timeTraveller.Branch("test"); await await bus.CommandAsync(new CreateRoot("testRoot")); await timeTraveller.Branch("grandTest"); await await bus.CommandAsync(new CreateRoot("testRoot2")); await bus.IsTrue(new StatsQuery(), s => s.NumberOfRoots == 3); result = await remote.Push("grandTest"); Assert.Equal(Status.Failed, result.ResultStatus); result = await remote.Push("test"); Assert.Equal(Status.Success, result.ResultStatus); result = await remote.Push("grandTest"); Assert.Equal(Status.Success, result.ResultStatus); result = await remote.Pull("grandTest"); Assert.Equal(Status.Success, result.ResultStatus); }
public async void CannotSaveTwice() { var container = CreateContainer(); var bus = container.GetInstance <IBus>(); var errorLog = container.GetInstance <IErrorLog>(); var commandLog = container.GetInstance <ICommandLog>(); IError error = null; errorLog.Observable.Subscribe(e => error = e); var command = new CreateRoot("Root"); await await bus.CommandAsync(command); await bus.Command(command, 2); Assert.Equal(nameof(InvalidOperationException), error.ErrorType); Assert.Contains("ahead", error.Message); Assert.NotEqual(default, error.Timestamp);
public async void CanMergeTimeline() { var container = CreateContainer(new List <Action <Container> >() { Config.RegisterSagas }); var bus = container.GetInstance <IBus>(); var time = container.GetInstance <IBranchManager>(); var command = new CreateRoot("Root"); await await bus.CommandAsync(command); await time.Branch("test"); await await bus.CommandAsync(new UpdateRoot("Root")); var infoQuery = new RootInfoQuery("Root"); await bus.IsTrue(infoQuery, r => r.CreatedAt < r.UpdatedAt); await await bus.CommandAsync(new CreateRoot("TestRoot")); time.Reset(); await bus.IsTrue(infoQuery, r => r.CreatedAt == r.UpdatedAt); await time.Merge("test"); await bus.IsTrue(infoQuery, r => r.CreatedAt < r.UpdatedAt); await bus.Equal(new StatsQuery(), s => s.NumberOfRoots, 4); await time.Merge("test"); await bus.Equal(new StatsQuery(), s => s.NumberOfRoots, 4); var graph = container.GetInstance <IGraph>(); await graph.Serialise(nameof(CanMergeTimeline)); }
public async void CanExecuteQuery() { var container = CreateContainer(); var bus = container.GetInstance <IBus>(); var log = container.GetInstance <ILog>(); var generator = container.GetInstance <IGraphQlGenerator>(); var command = new CreateRoot("Root"); await await bus.CommandAsync(command); var schemaProvider = container.GetInstance <ISchemaProvider>(); var executor = schemaProvider.Build(); var query = generator.Query(new RootInfoQuery("Root")); var rootInfoResult = await executor.ExecuteAsync(query) as IReadOnlyQueryResult; dynamic rootInfoDict = rootInfoResult?.Data.SingleOrDefault().Value; log.Info(rootInfoDict); Assert.NotNull(rootInfoDict); var time = rootInfoDict["createdAt"] as Time; Assert.NotNull(time); Assert.NotEqual(default, time.ToInstant());
public bool CreateRootEx(CreateRoot command) => Resolve(command);