Exemplo n.º 1
0
        public void Execute_throws_ArgumentException_if_parameter_wrong_type()
        {
            var sut = new StateTransitionParameterized <Sale, SaleState, SaleEvent, string>(
                stateAccessor: sale => sale.State
                , stateMutator: (sale, newState) => sale.State = newState
                , toState: SaleState.Complete
                , condition: (_, parameter) => parameter == "yes"
                , name: "test"
                , priority: 1);

            Assert.Throws <ArgumentException>(() => sut.Execute(new ExecutionParameters <Sale, SaleEvent>(SaleEvent.Pay, new Sale(saleID: 9), request: 0)));
        }
Exemplo n.º 2
0
        public void Execute_doesnt_transition_if_condition_not_met()
        {
            var testSale = new Sale(saleID: 55)
            {
                State = SaleState.Open
            };
            var sut = new StateTransitionParameterized <Sale, SaleState, SaleEvent, string>(
                stateAccessor: sale => sale.State
                , stateMutator: (sale, newState) => sale.State = newState
                , toState: SaleState.Complete
                , condition: (_, parameter) => parameter == "yes"
                , name: "test"
                , priority: 1);

            sut.Execute(new ExecutionParameters <Sale, SaleEvent>(SaleEvent.Pay, testSale, request: "NO"));

            Assert.Equal(SaleState.Open, testSale.State);
        }
        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 StateTransitionParameterized <Sale, SaleState, SaleEvent, string>(
                stateAccessor: saleToUpdate => saleToUpdate.State
                , stateMutator: (saleToUpdate, newState) => saleToUpdate.State = newState
                , toState: endState
                , conditionAsync: (_, stringParam, inCancelToken) => Task.FromResult(result: false)
                , name: "test"
                , priority: 1);

            await sut.ExecuteAsync(new ExecutionParameters <Sale, SaleEvent>(SaleEvent.Pay, sale, request : "notUsed"));

            Assert.Equal(startState, sale.State);
        }
        public async Task ExecuteAsync_throws_ArgumentException_if_Request_is_wrong_type()
        {
            const SaleState startState = SaleState.Open;
            var             sale       = new Sale(saleId: 66)
            {
                State = startState
            };
            var sut = new StateTransitionParameterized <Sale, SaleState, SaleEvent, string>(
                stateAccessor: saleToUpdate => saleToUpdate.State
                , stateMutator: (saleToUpdate, newState) => saleToUpdate.State = newState
                , toState: SaleState.Complete
                , conditionAsync: (_, stringParam, cancelToken) => Task.FromResult(result: true)
                , name: "test"
                , priority: 1);

            using var cancelSource = new CancellationTokenSource();
            {
                var cancelToken     = cancelSource.Token;
                var executionParams = new ExecutionParameters <Sale, SaleEvent>(SaleEvent.Pay, sale, request: 1, cancellationToken: cancelToken);

                await Assert.ThrowsAsync <ArgumentException>(async() => await sut.ExecuteAsync(executionParams));
            }
        }
        public void Execute_sends_notification_if_transition_successful()
        {
            var testSale = new Sale(saleID: 55)
            {
                State = SaleState.Open
            };

            var sut = new StateTransitionParameterized <Sale, SaleState, SaleEvent, string>(
                stateAccessor: sale => sale.State
                , stateMutator: (sale, newState) => sale.State = newState
                , toState: SaleState.Complete
                , condition: (_, parameter) => parameter == "yes"
                , name: "test"
                , priority: 1);

            var notificationReceived = false;

            StateTransitionParameterized <Sale, SaleState, SaleEvent, string> .OnTransitionedEvent += (sale, _) => notificationReceived = true;

            sut.Execute(new ExecutionParameters <Sale, SaleEvent>(SaleEvent.Pay, testSale, request: "yes"));

            Assert.True(notificationReceived);
        }