public async Task Add_WithGetRequest_ShouldReturnViewWithViewModel()
        {
            // Arrange
            var categories = new List <Category>
            {
                new Category {
                    Id = 101, Name = "Category One"
                },
                new Category {
                    Id = 102, Name = "Category Two"
                },
                new Category {
                    Id = 103, Name = "Category Three"
                }
            };

            var controllerBuilder = new TransactionsControllerBuilder();

            controllerBuilder.MockCategoriesDataService.Setup(x => x.RetrieveCategoriesAsync()).ReturnsAsync(categories);

            using var controller = controllerBuilder.Build();

            // Act
            var result = await controller.Add();

            // Assert
            Assert.IsNotNull(result, FailureMessages.ResultIsNull);
            Assert.IsInstanceOfType(result, typeof(ViewResult), FailureMessages.ResultNotExpectedType);

            var viewResult = result as ViewResult;

            Assert.IsNotNull(viewResult.Model, FailureMessages.ViewModelIsNull);
            Assert.IsInstanceOfType(viewResult.Model, typeof(AddTransactionViewModel), FailureMessages.ViewModelNotExpectedType);

            var viewModel = viewResult.Model as AddTransactionViewModel;

            Assert.AreEqual(DateTime.Today, viewModel.Date, FailureMessages.ViewModelPropertyNotExpectedValue);
            Assert.AreEqual(categories.Count, viewModel.CategoriesList.Count(), FailureMessages.IncorrectItemCount);
        }
        public async Task Add_WithInvalidViewModel_ShouldReturnViewWithSameViewModel()
        {
            // Arrange
            var controllerBuilder = new TransactionsControllerBuilder();

            using var controller = controllerBuilder.Build();

            controller.ModelState.AddModelError("SomeKey", "SomeErrorMessage");

            var postedViewModel = new AddTransactionViewModel
            {
                Date       = new DateTime(2008, 11, 17),
                CategoryId = 101,
                Memo       = "Something",
                Amount     = 123.45m,
                IsCredit   = false
            };

            // Act
            var result = await controller.Add(postedViewModel);

            // Assert
            Assert.IsNotNull(result, FailureMessages.ResultIsNull);
            Assert.IsInstanceOfType(result, typeof(ViewResult), FailureMessages.ResultNotExpectedType);

            var viewResult = result as ViewResult;

            Assert.IsNotNull(viewResult.Model, FailureMessages.ViewModelIsNull);
            Assert.IsInstanceOfType(viewResult.Model, typeof(AddTransactionViewModel), FailureMessages.ViewModelNotExpectedType);

            var resultViewModel = viewResult.Model as AddTransactionViewModel;

            Assert.AreEqual(postedViewModel.Date, resultViewModel.Date, FailureMessages.ViewModelPropertyNotExpectedValue);
            Assert.AreEqual(postedViewModel.CategoryId, resultViewModel.CategoryId, FailureMessages.ViewModelPropertyNotExpectedValue);
            Assert.AreEqual(postedViewModel.Memo, resultViewModel.Memo, FailureMessages.ViewModelPropertyNotExpectedValue);
            Assert.AreEqual(postedViewModel.Amount, resultViewModel.Amount, FailureMessages.ViewModelPropertyNotExpectedValue);
            Assert.AreEqual(postedViewModel.IsCredit, resultViewModel.IsCredit, FailureMessages.ViewModelPropertyNotExpectedValue);
        }
        public async Task Add_WithNullViewModel_ShouldThrowException()
        {
            // Arrange
            var controllerBuilder = new TransactionsControllerBuilder();

            using var controller = controllerBuilder.Build();

            Exception caughtException = null;

            // Act
            try
            {
                _ = await controller.Add(null);
            }
            catch (Exception exception)
            {
                caughtException = exception;
            }

            // Assert
            Assert.IsNotNull(caughtException, FailureMessages.ExceptionNotThrown);
            Assert.IsInstanceOfType(caughtException, typeof(ArgumentNullException), FailureMessages.ExceptionNotExpectedType);
        }