Example #1
0
        public async Task ExecuteAsync_does_not_execute_if_CancelRequested()
        {
            const SaleState startState = SaleState.Open;
            var             sale       = new Sale(saleId: 66)
            {
                State = startState
            };
            var sut = new StateTransition <Sale, SaleState, SaleEvent>(
                stateAccessor: saleToUpdate => saleToUpdate.State
                , stateMutator: (saleToUpdate, newState) => saleToUpdate.State = newState
                , toState: SaleState.Complete
                , conditionAsync: (_, inCancelToken) => Task.FromResult(result: true)
                , name: "test"
                , priority: 1);

            using var cancelSource = new CancellationTokenSource();
            var cancelToken = cancelSource.Token;

            cancelSource.Cancel();

            var parameters = new ExecutionParameters <Sale, SaleEvent>(SaleEvent.Pay, sale, request: null, cancellationToken: cancelToken);
            var result     = await sut.ExecuteAsync(parameters);

            Assert.True(result.WasCancelled);
            Assert.False(result.WasTransitioned);
            Assert.Equal(startState, sale.State);
        }
Example #2
0
        public void ExecuteAsync_ConditionAsync_can_be_cancelled()
        {
            const SaleState startState = SaleState.Open;
            var             sale       = new Sale(saleId: 66)
            {
                State = startState
            };
            var sut = new StateTransition <Sale, SaleState, SaleEvent>(
                stateAccessor: saleToUpdate => saleToUpdate.State
                , stateMutator: (saleToUpdate, newState) => saleToUpdate.State = newState
                , toState: SaleState.Complete
                , conditionAsync: (_, cancellationToken) =>
            {
                Task.Delay(millisecondsDelay: 999999, cancellationToken: cancellationToken);
                return(Task.FromResult(!cancellationToken.IsCancellationRequested));
            }
                , name: "test"
                , priority: 1);

            using var cancelSource = new CancellationTokenSource();
            var parameters = new ExecutionParameters <Sale, SaleEvent>(SaleEvent.Pay, sale, cancellationToken: cancelSource.Token);

            Task.Run(async() => await sut.ExecuteAsync(parameters), cancelSource.Token);
            cancelSource.Cancel();

            Assert.Equal(startState, sale.State);
        }
Example #3
0
        public async Task ExecuteAsync_does_not_change_state_if_condition_not_met()
        {
            const SaleState startState = SaleState.Open;
            const SaleState endState   = SaleState.Complete;
            var             sale       = new Sale(saleId: 66)
            {
                State = startState
            };

            var sut = new StateTransition <Sale, SaleState, SaleEvent>(
                stateAccessor: saleToUpdate => saleToUpdate.State
                , stateMutator: (saleToUpdate, newState) => saleToUpdate.State = newState
                , toState: endState
                , conditionAsync: (_, inCancelToken) => Task.FromResult(result: false)
                , name: "test"
                , priority: 1);

            var result = await sut.ExecuteAsync(new ExecutionParameters <Sale, SaleEvent>(SaleEvent.Pay, sale));

            Assert.False(result.WasTransitioned);
            Assert.Equal(startState, sale.State);
        }