public void Get_GivenBorrowerDoesNotExistForId_ShouldReturnBorrowerItem()
        {
            //---------------Set up test pack-------------------
            var borrowerItem = new BorrowerItemBuilder()
                .WithRandomProps().Build();
           
            var dbContext = new TestDbContextBuilder()
                .WithBorrowerItem(borrowerItem)
                .Build();

            var repository =  CreateBuilder().WithDbContext(dbContext).Build();
            //---------------Assert Precondition----------------

            //---------------Execute Test ----------------------
            var actualBorrower = repository.Get(borrowerItem.Id+10);
            //---------------Test Result -----------------------
            Assert.IsNull(actualBorrower);
        }
        public void GetAll_GivenTwoBorrowerItems_ShouldReturnBorrower()
        {
            //---------------Set up test pack-------------------
            var borrowerItem1 = new BorrowerItemBuilder()
                .WithRandomProps().Build();
            var borrowerItem2 = new BorrowerItemBuilder()
                .WithRandomProps().Build();
           
            var dbContext = new TestDbContextBuilder()
                .WithBorrowerItem(borrowerItem1, borrowerItem2)
                .Build();

            var repository =  CreateBuilder().WithDbContext(dbContext).Build();
            //---------------Assert Precondition----------------

            //---------------Execute Test ----------------------
            var actualBorrower = repository.GetAll();
            //---------------Test Result -----------------------
            Assert.AreEqual(2, actualBorrower.Count);
            
        }
        public void Index_GivenAllUsersReturnedFromRepository_ShouldReturnViewWithMapModel()
        {
            //---------------Set up test pack-------------------
            var borrowersItem = new BorrowerItemBuilder()
                .WithRandomProps()
                .WithDateReturnedAsNull()
                .Build();
            var borrowersItems = new List<BorrowersItem>() { borrowersItem };
            var repository = Substitute.For<IBorrowerItemRepository>();
            repository.GetAll().Returns(borrowersItems);

            var borrowerItemRowViewModels = new List<BorrowerItemRowViewModel> { new BorrowerItemRowViewModel() };

            var mappingEngine =Substitute.For<IMappingEngine>();

            mappingEngine.Map<IEnumerable<BorrowerItemRowViewModel>>(borrowersItems)
                .Returns(borrowerItemRowViewModels);
            var borrowerItemRowViewModel = borrowerItemRowViewModels.FirstOrDefault();
            borrowerItemRowViewModel.Id = borrowersItem.Id;
            borrowerItemRowViewModel.BorrowerId = borrowersItem.BorrowerId;
            borrowerItemRowViewModel.ItemDescription = borrowersItem.Item.Description;
            borrowerItemRowViewModel.DateBorrowed = borrowersItem.DateBorrowed;
            borrowerItemRowViewModel.DateReturned = borrowersItem.DateReturned;


            var controller = CreateBuilder()
                .WithBorrowerItemRepository(repository)
                .WithMappingEngine(mappingEngine)
                .Build();
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            var result = controller.Index() as ViewResult;
            //---------------Test Result -----------------------
            Assert.IsNotNull(result);
            var viewModels = result.Model as IEnumerable<BorrowerItemRowViewModel>;
            CollectionAssert.AreEqual(borrowerItemRowViewModels, viewModels);
        }
        public void DeletePOST_GivenBorrowerItemViewModel_ShouldMapToBorrowerAndDelete()

        {
            var borrowerItems = new BorrowerItemBuilder().WithRandomProps().Build();
            
            var repository = Substitute.For<IBorrowerItemRepository>();
            var itemRepository = Substitute.For<IItemRepository>();
            var borrowerRepository = Substitute.For<IBorrowerRepository>();
            var mapper = Substitute.For<IMappingEngine>();
            
            var borrowerItemViewModel = new BorrowerItemViewModel
            {
                Id = RandomValueGen.GetRandomInt(),
                ItemId = RandomValueGen.GetRandomInt(),
                BorrowerId = RandomValueGen.GetRandomInt()
            };

            mapper.Map<BorrowersItem>(borrowerItemViewModel).Returns(borrowerItems);
            repository.Delete(borrowerItems);
            var borrowerItemController = CreateBuilder()
                .WithBorrowerItemRepository(repository)
                .WithBorrowerRepository(borrowerRepository)
                .WithItemRepository(itemRepository)
                .WithMappingEngine(mapper)
                .Build();
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            var result = borrowerItemController.Delete(borrowerItemViewModel);
            //---------------Test Result -----------------------
            Assert.IsNotNull(result);
            repository.Received().Delete(borrowerItems);
          

        }
        public void EditPOST_GivenValidBorrowerId_ShouldCallSaveandRedirect()

        {
            var borrowerItems = new BorrowerItemBuilder().WithRandomProps().Build();
            
            var repository = Substitute.For<IBorrowerItemRepository>();
            var itemRepository = Substitute.For<IItemRepository>();
            var borrowerRepository = Substitute.For<IBorrowerRepository>();
            var mapper = Substitute.For<IMappingEngine>();
            
            var borrowerItemViewModel = new BorrowerItemViewModel
            {
                Id = RandomValueGen.GetRandomInt(),
                ItemId = RandomValueGen.GetRandomInt(),
                BorrowerId = RandomValueGen.GetRandomInt()
            };

            mapper.Map<BorrowersItem>(borrowerItemViewModel).Returns(borrowerItems);
            repository.Save(borrowerItems);
            var borrowerItemController = CreateBuilder()
                .WithBorrowerItemRepository(repository)
                .WithBorrowerRepository(borrowerRepository)
                .WithItemRepository(itemRepository)
                .WithMappingEngine(mapper)
                .Build();
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            var result = borrowerItemController.Edit(borrowerItemViewModel) as RedirectToRouteResult;
            //---------------Test Result -----------------------
            Assert.IsNotNull(result);
            repository.Received().Save(borrowerItems);
            var actionName = result.RouteValues["action"];
            Assert.AreEqual("Index", actionName);

        }
        public void EditGET_GivenValidBorrowerItemId_ShouldReturnBorrowerViewModel()
        {
            //---------------Set up test pack-------------------
            var borrowerItems= new BorrowerItemBuilder().WithRandomProps().Build();
            var id = borrowerItems.Id;

            var repository = Substitute.For<IBorrowerItemRepository>();
            var itemRepository = Substitute.For<IItemRepository>();
            var borrowerRepository = Substitute.For<IBorrowerRepository>();
            var mapper = Substitute.For<IMappingEngine>();

            repository.Get(id).Returns(borrowerItems);

            var item = new Item { Id = RandomValueGen.GetRandomInt(), Description = RandomValueGen.GetRandomString() };
            var items = new List<Item> { item };
            var borrower = new BorrowerBuilder().WithRandomProps().Build();
            var borrowers = new List<Borrower> { borrower };


            itemRepository.GetAll().Returns(items);
            borrowerRepository.GetAll().Returns(borrowers);
          

            
            var borrowerItemViewModel = new BorrowerItemViewModel { Id = RandomValueGen.GetRandomInt() };
            
            mapper.Map<BorrowerItemViewModel>(borrowerItems).Returns(borrowerItemViewModel);

            var borrowerItemController = CreateBuilder()
                .WithBorrowerItemRepository(repository)
                .WithBorrowerRepository(borrowerRepository)
                .WithItemRepository(itemRepository)
                .WithMappingEngine(mapper)
                .Build();
            //---------------Assert Precondition----------------

            //---------------Execute Test ----------------------
            var result = borrowerItemController.Edit(id) as ViewResult;
            //---------------Test Result -----------------------
            Assert.IsNotNull(result);
            var model = result.Model as BorrowerItemViewModel;
            Assert.IsNotNull(model);
            Assert.AreEqual(1, model.BorrowersSelectListItems.Count);
            Assert.AreEqual(1, model.ItemSelectListItems.Count);
        }
        public void Create_POST_ShouldCallSaveAndRedirectToIndex()
        {
            //---------------Set up test pack-------------------
            var borrowerItemRepository = Substitute.For<IBorrowerItemRepository>();
            var borrowerRepository = Substitute.For<IBorrowerRepository>();
            var itemRepository = Substitute.For<IItemRepository>();
            var mapper = Substitute.For<IMappingEngine>();

            var borrowersItem = new BorrowerItemBuilder().WithRandomProps().Build();
            var borrower = new BorrowerBuilder().WithRandomProps().Build();
            var item = new ItemBuilder().WithRandomProps().Build();

            var borrowerItemViewModel = new BorrowerItemViewModel();

            mapper.Map<BorrowersItem>(borrowerItemViewModel).Returns(borrowersItem);

            itemRepository.Get(borrowerItemViewModel.ItemId).Returns(item);

            borrowersItem.ItemId = item.Id;
            borrowersItem.BorrowerId = borrower.Id;
            borrowerRepository.Get(borrowerItemViewModel.BorrowerId).Returns(borrower);

            borrowerItemViewModel.ItemId = item.Id;
            borrowerItemViewModel.BorrowerId = borrower.Id;
            borrowerItemViewModel.DateBorrowed=DateTime.Now;
            borrowerItemViewModel.DateReturned=DateTime.Now.ToString();

           
            
            var borrowerItemController = CreateBuilder()
                   .WithBorrowerItemRepository(borrowerItemRepository)
                   .WithBorrowerRepository(borrowerRepository)
                   .WithItemRepository(itemRepository)
                   .WithMappingEngine(mapper)
                   .Build();
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            var result = borrowerItemController.Create(borrowerItemViewModel) as RedirectToRouteResult;
            //---------------Test Result -----------------------
            borrowerItemRepository.Received().Save(borrowersItem);
            Assert.IsNotNull(result);
            var actionName = result.RouteValues["action"];
            Assert.AreEqual("Index", actionName);
        }
        public void Delete_GivenBorrowerItemExists_ShouldDeleteBorrowerAndCallSavedChanges()
        {
            //---------------Set up test pack-------------------
            var borrowerItem = new BorrowerItemBuilder()
                   .WithRandomProps().Build();

            var dbContext = new TestDbContextBuilder()
                .WithBorrowerItem(borrowerItem)
                .Build();

            var repository = CreateBuilder().WithDbContext(dbContext).Build();
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            repository.Delete(borrowerItem);
            //---------------Test Result -----------------------
            Assert.AreEqual(0, dbContext.Borrowers.Count());
            dbContext.Received().SaveChanges();
        }
        public void Save_GivenNewBorrower_ShouldSave()
        {
            //---------------Set up test pack-------------------
            var borrower = new BorrowerItemBuilder()
                   .WithRandomProps()
                   .WithNewId()
                   .Build();

            var dbContext = new TestDbContextBuilder().Build();

            var repository = CreateBuilder().WithDbContext(dbContext).Build();
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            repository.Save(borrower);
            //---------------Test Result -----------------------
            dbContext.Received().AttachEntity(borrower);
            dbContext.Received().SaveChanges();
        }