public async Task <Response <TodoItem> > HandleAsync(CreateTodoItemRequest request)
        {
            var todoItemEntityResponse = new Response <TodoItemEntity>();

            // Query. Apply all validation and modification rules.  These rules can only query the database.
            await _rulesEngine.ProcessAsync(request, todoItemEntityResponse, _createRulesFactory.Create().ToList());

            if (todoItemEntityResponse.HasErrors())
            {
                return(new Response <TodoItem>(todoItemEntityResponse.Notifications));
            }

            // Query. Apply all validation and modification rules.  These rules can only query the database.
            await _rulesEngine.ProcessAsync(request, todoItemEntityResponse, _saveRulesFactory.Create().ToList());

            if (todoItemEntityResponse.HasErrors())
            {
                return(new Response <TodoItem>(todoItemEntityResponse.Notifications));
            }

            // Command.  Save the data.
            await _createTodoItemRepository.SaveAsync(todoItemEntityResponse);

            LogTodoItemEntityResponse(todoItemEntityResponse);

            return(new Response <TodoItem>(todoItemEntityResponse.Notifications, TodoItemMapper.MapToTodoItem(todoItemEntityResponse.Item)));
        }
        public async Task <IActionResult> CreateTodoItem([FromBody] CreateTodoItemRequest request)
        {
            var command = _mapper.Map <CreateTodoItemCommand>(request);
            var result  = await _mediator.Send(command, CancellationToken.None);

            var location    = Path.Join($"{Request.Scheme}://{Request.Host}", Request.Path, result);
            var locationUri = new Uri(location);

            return(Created(locationUri, result));
        }
Example #3
0
        public async Task HandleAsyncHasErrorTest(bool createRulesHasError)
        {
            var request = new CreateTodoItemRequest();

            var createRules = RuleFactory.CreateEmptyListOfCreateRules().ToList();

            createRules.Add(RuleFactory.CreateMockCreateRule());

            var mockCreateRulesFactory = new Mock <IRulesFactory <CreateTodoItemRequest, Response <TodoItemEntity> > >();

            mockCreateRulesFactory.Setup(rulesFactory => rulesFactory.Create()).Returns(createRules);

            var saveRules = RuleFactory.CreateEmptyListOfSaveRules().ToList();

            saveRules.Add(RuleFactory.CreateMockSaveRule());

            var mockSaveRulesFactory = new Mock <IRulesFactory <Request <TodoItem>, Response <TodoItemEntity> > >();

            mockSaveRulesFactory.Setup(rulesFactory => rulesFactory.Create()).Returns(saveRules);

            var errorNotification = Notification.CreateError("1", "error");

            var mockRulesEngine = new Mock <IRulesEngine>();

            // Setup generic mock setups first and then more specific.
            SetupMockProcessAsyncWithSaveRules(mockRulesEngine, request, saveRules,
                                               callbackResponse => ProcessCallBackResponseToAddNotification(!createRulesHasError, callbackResponse, errorNotification));
            SetupMockProcessAsyncWithCreateRules(mockRulesEngine, request, createRules,
                                                 callbackResponse => ProcessCallBackResponseToAddNotification(createRulesHasError, callbackResponse, errorNotification));

            var mockCreateTodoItemRepository = new Mock <ICreateTodoItemRepository>();
            var mockLogger = new Mock <ILogger <CreateTodoItemRequestHandler> >();

            var handler        = new CreateTodoItemRequestHandler(mockRulesEngine.Object, mockCreateRulesFactory.Object, mockSaveRulesFactory.Object, mockCreateTodoItemRepository.Object, mockLogger.Object);
            var actualResponse = await handler.HandleAsync(request);

            mockCreateRulesFactory.Verify(rulesFactory => rulesFactory.Create(), Times.Once);
            mockSaveRulesFactory.Verify(rulesFactory => rulesFactory.Create(),
                                        createRulesHasError ? Times.Never : Times.Once);
            mockRulesEngine.Verify(rulesEngine => rulesEngine.ProcessAsync(request, It.IsAny <Response <TodoItemEntity> >(), createRules), Times.Once);
            mockRulesEngine.Verify(rulesEngine => rulesEngine.ProcessAsync(request, It.IsAny <Response <TodoItemEntity> >(), saveRules),
                                   createRulesHasError ? Times.Never : Times.Once);

            mockCreateRulesFactory.VerifyNoOtherCalls();
            mockSaveRulesFactory.VerifyNoOtherCalls();
            mockRulesEngine.VerifyNoOtherCalls();
            mockCreateTodoItemRepository.VerifyNoOtherCalls();
            mockLogger.VerifyNoOtherCalls();

            Assert.IsNotNull(actualResponse);
            Assert.IsNull(actualResponse.Item);
            Assert.AreEqual(1, actualResponse.Notifications.Count);
            Assert.AreSame(errorNotification, actualResponse.Notifications.Single());
        }
Example #4
0
        public async Task <IActionResult> Post(int listId, CreateTodoItemRequest request)
        {
            var authorisationResponse = await _listAuthoriser.IsOwner(listId, _userProfileId);

            if (!authorisationResponse.AuthorisationResult)
            {
                return(NotFound());
            }

            var todoId = await _todoItemsWriter.Add(request.Title, TodoItemState.Open, listId, _userProfileId);

            return(Ok(todoId));
        }
Example #5
0
        protected override Task ProcessRuleAsync(CreateTodoItemRequest request, Response <TodoItemEntity> response)
        {
            if (request.Item.Id != 0)
            {
                response.Notifications.Add(TodoItemIdIsNotEmptyRuleNotification());
                Fail();
                ContinueProcessing = false;
                return(Task.CompletedTask);
            }

            Pass();
            return(Task.CompletedTask);
        }
        public async Task <ActionResult <TodoItem> > Create(CreateTodoItemRequest request)
        {
            this.logger.LogInformation("Trying to create a new todo item.");

            TodoItem todoItem = new TodoItem
            {
                Description  = request.Description,
                CreationDate = DateTime.Now,
                IsComplete   = false,
            };

            todoItem = await this.todoService.Create(todoItem).ConfigureAwait(false);

            this.logger.LogInformation("The new todo item has been created successfully.");

            return(todoItem);
        }
Example #7
0
 private static void SetupMockProcessAsyncWithCreateRules(Mock <IRulesEngine> mockRulesEngine, CreateTodoItemRequest request,
                                                          IReadOnlyCollection <IBaseRule <CreateTodoItemRequest, Response <TodoItemEntity> > > createRules, Action <Response <TodoItemEntity> > callBackMethod)
 {
     mockRulesEngine.Setup(rulesEngine => rulesEngine.ProcessAsync(request, It.IsAny <Response <TodoItemEntity> >(), createRules))
     .Callback <CreateTodoItemRequest, Response <TodoItemEntity>, IEnumerable <IBaseRule <CreateTodoItemRequest, Response <TodoItemEntity> > > >
         ((callbackRequest, callbackResponse, callbackRules) =>
     {
         callBackMethod(callbackResponse);
     });
 }
Example #8
0
        public async Task HandleAsyncSuccessTest()
        {
            var request = new CreateTodoItemRequest();

            var expectedResponse = CreateExpectedResponse();

            var createRules = RuleFactory.CreateEmptyListOfCreateRules().ToList();

            createRules.Add(RuleFactory.CreateMockCreateRule());

            var mockCreateRulesFactory = new Mock <IRulesFactory <CreateTodoItemRequest, Response <TodoItemEntity> > >();

            mockCreateRulesFactory.Setup(rulesFactory => rulesFactory.Create()).Returns(createRules);

            var saveRules = RuleFactory.CreateEmptyListOfSaveRules().ToList();

            saveRules.Add(RuleFactory.CreateMockSaveRule());

            var mockSaveRulesFactory = new Mock <IRulesFactory <Request <TodoItem>, Response <TodoItemEntity> > >();

            mockSaveRulesFactory.Setup(rulesFactory => rulesFactory.Create()).Returns(saveRules);

            var mockRulesEngine = new Mock <IRulesEngine>();

            // Setup generic mock setups first and then more specific.
            SetupMockProcessAsyncWithSaveRules(mockRulesEngine, request, saveRules,
                                               callbackResponse => ProcessCallBackResponseToCloneTodoItem(callbackResponse, expectedResponse));
            SetupMockProcessAsyncWithCreateRules(mockRulesEngine, request, createRules,
                                                 callbackResponse => ProcessCallBackResponseToCloneTodoItem(callbackResponse, expectedResponse));

            mockRulesEngine.Setup(rulesEngine => rulesEngine.ProcessAsync(request, It.IsAny <Response <TodoItemEntity> >(), saveRules))
            .Callback <Request <TodoItem>, Response <TodoItemEntity>, IEnumerable <IBaseRule <Request <TodoItem>, Response <TodoItemEntity> > > >
                ((callbackRequest, callbackResponse, callbackRules) =>
            {
                callbackResponse.Item = expectedResponse.Clone().Item;
            });

            var mockCreateTodoItemRepository = new Mock <ICreateTodoItemRepository>();

            mockCreateTodoItemRepository.Setup(repository =>
                                               repository.SaveAsync(It.Is <Response <TodoItemEntity> >(response => VerifyTodoItem.AreEqualResponse(expectedResponse, response))));

            var mockLogger = new Mock <ILogger <CreateTodoItemRequestHandler> >();

            var handler        = new CreateTodoItemRequestHandler(mockRulesEngine.Object, mockCreateRulesFactory.Object, mockSaveRulesFactory.Object, mockCreateTodoItemRepository.Object, mockLogger.Object);
            var actualResponse = await handler.HandleAsync(request);

            mockCreateRulesFactory.Verify(rulesFactory => rulesFactory.Create(), Times.Once);
            mockSaveRulesFactory.Verify(rulesFactory => rulesFactory.Create(), Times.Once);
            mockRulesEngine.Verify(rulesEngine => rulesEngine.ProcessAsync(request, It.IsAny <Response <TodoItemEntity> >(), createRules), Times.Once);
            mockRulesEngine.Verify(rulesEngine => rulesEngine.ProcessAsync(request, It.IsAny <Response <TodoItemEntity> >(), saveRules), Times.Once);

            mockCreateTodoItemRepository.Verify(repository =>
                                                repository.SaveAsync(It.Is <Response <TodoItemEntity> >(response => VerifyTodoItem.AreEqualResponse(expectedResponse, response))), Times.Once);

            mockCreateRulesFactory.VerifyNoOtherCalls();
            mockSaveRulesFactory.VerifyNoOtherCalls();
            mockRulesEngine.VerifyNoOtherCalls();
            mockCreateTodoItemRepository.VerifyNoOtherCalls();

            // Test critical behavior.  If the logging here is critical, then verify the calls.
            // See examples of ILogger testing in other parts of this app.
            mockLogger.VerifyAll();

            Assert.IsNotNull(actualResponse);
            Assert.IsNotNull(actualResponse.Item);
            Assert.IsFalse(actualResponse.HasErrors());
            Assert.AreEqual(0, actualResponse.Notifications.Count);
            VerifyTodoItem.AssertAreEqualResponse(expectedResponse, actualResponse);
        }
Example #9
0
        public async Task <ActionResult <TodoItemVm> > Create(CreateTodoItemRequest request)
        {
            var result = await _todoService.AddTodo(request.Name);

            return(Ok(result));
        }