public async Task Given_timeout_only_default_policy()
        {
            var aggregateId = Guid.NewGuid().ToString();

            var cmd = new InflateNewBallonCommand(1, aggregateId);
            await Node.Prepare(cmd).Expect <BalloonCreated>().Execute();

            //checking "time-out" rule for policy, snapshots should be saved once on second command
            await Task.Delay(1000);

            var changedParameter             = 2;
            var changeSampleAggregateCommand = new WriteTitleCommand(changedParameter, aggregateId);

            await Node.Prepare(changeSampleAggregateCommand).Expect <BalloonTitleChanged>().Execute();

            await Task.Delay(1000);

            var snapshots =
                await
                new AggregateSnapshotRepository(AutoTestNodeDbConfiguration.Default.JournalConnectionString,
                                                new BalloonAggregateFactory(),
                                                new BalloonAggregateFactory()).Load <Balloon>(aggregateId);

            //Snapshots_should_be_saved_one_time()
            Assert.Empty(snapshots);
        }
示例#2
0
        public async Task Given_default_policy()
        {
            var aggregateId      = Guid.NewGuid().ToString();
            var initialParameter = 1;
            var cmd = new InflateNewBallonCommand(initialParameter, aggregateId);
            await Node.Prepare(cmd)
            .Expect <BalloonCreated>()
            .Execute();

            var changedParameter             = 2;
            var changeSampleAggregateCommand = new WriteTitleCommand(changedParameter, aggregateId);

            await Node.Prepare(changeSampleAggregateCommand)
            .Expect <BalloonTitleChanged>()
            .Execute();

            Thread.Sleep(1000);

            var aggregates = await AggregateSnapshotRepository.New(AutoTestNodeDbConfiguration.Default.JournalConnectionString,
                                                                   BalloonAggregateFactory.Default)
                             .Load <Balloon>(aggregateId);

            //Snapshots_should_be_saved_two_times()
            Assert.Equal(2, aggregates.Length);
            //Restored_aggregates_should_have_same_ids()
            Assert.True(aggregates.All(s => s.Payload.Id == aggregateId));
            //First_snapshot_should_have_parameters_from_first_command()
            Assert.Equal(initialParameter.ToString(), aggregates.First().Payload.Title);
            //Second_snapshot_should_have_parameters_from_second_command()
            Assert.Equal(changedParameter.ToString(), aggregates.Skip(1).First().Payload.Title);
        }
        public async Task Given_aggregate_When_executing_same_command_twice_Then_second_commands_fails()
        {
            var cmd = new WriteTitleCommand(43, Guid.NewGuid().ToString());

            await Node.Execute(cmd);

            await Node.Execute(cmd).ShouldThrow <CommandAlreadyExecutedException>();
        }
示例#4
0
        public async Task When_async_method_is_called_other_commands_can_be_executed_before_async_results()
        {
            var aggregateId  = Guid.NewGuid().ToString();
            var asyncCommand = new PlanTitleChangeCommand(43, Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), TimeSpan.FromSeconds(1));
            var syncCommand  = new WriteTitleCommand(42, aggregateId);

            var asyncCommandTask = Node.Prepare(asyncCommand)
                                   .Expect <BalloonTitleChanged>()
                                   .Execute();

            await Node.Prepare(syncCommand)
            .Expect <BalloonTitleChanged>()
            .Execute();

            var sampleAggregate = await this.LoadAggregateByActor <Balloon>(syncCommand.AggregateId);

            Assert.Equal(syncCommand.Parameter.ToString(), sampleAggregate.Title);

            var changedEvent = (await asyncCommandTask).Message <BalloonTitleChanged>();

            Assert.Equal(asyncCommand.Parameter.ToString(), changedEvent.Value);
        }