public void Purchase_Item_Quantity_Should_Be_Less_ThanEqual_To_Stock()
        {
            //Arrange
            var repo = new StockItemRepository(new TonerJobContext());
            //Act
            Action action = () => PurchaseItem.Create(repo.GetStockItemById(1), 2);

            //Assert
            action.Should().Throw <ArgumentException>().WithMessage("Quantity should be less than or equal to quantity in stock!");
        }
        public void New_StockItem_Should_Get_Inserted_Without_Error()
        {
            //Arrange
            var stockItem = StockItem.Create("Epson L800 Roller", 1, 1, 1);
            var repo      = new StockItemRepository(new StockContext());

            //Act
            Action action = () => repo.Insert(stockItem);

            //Assert
            action.Should().NotThrow <Exception>();
        }
        public async Task GetStockItemsAsync_Returns_GetStockItemDtos()
        {
            //Arrange
            _fixture.MockStockItemService.Setup(x => x.GetStockItemsAsync())
            .ReturnsAsync(_fixture.StockItems);

            var repository = new StockItemRepository(AutoMapperSingleton.Mapper, _fixture.MockStockItemService.Object);

            //Act
            var result = await repository.GetStockItemsAsync();

            //Assert
            var items = result.Should().BeAssignableTo <IEnumerable <GetStockItemDto> >().Subject;

            items.Should().HaveCount(4);
        }
        public async Task DeleteStockItemAsync_Returns_NoResult()
        {
            //Arrange
            var id = 2;

            _fixture.MockStockItemService.Setup(x => x.GetStockItemAsync(It.IsAny <Expression <Func <StockItem, bool> > >()))
            .Returns <Expression <Func <StockItem, bool> > >(expression => Task.FromResult(_fixture.StockItems.AsQueryable().FirstOrDefault(expression)));

            _fixture.MockStockItemService.Setup(x => x.DeleteStockItemAsync(It.IsAny <StockItem>()));

            var repository = new StockItemRepository(AutoMapperSingleton.Mapper, _fixture.MockStockItemService.Object);

            //Act
            await repository.DeleteStockItemAsync(id);

            // Assert
            _fixture.MockStockItemService.Verify(x => x.DeleteStockItemAsync(It.IsAny <StockItem>()), Times.Once);
        }
        public async Task CreateStockItemAsync_Throws_ConflictException()
        {
            //Arrange
            _fixture.MockStockItemService.Setup(x => x.GetStockItemAsync(It.IsAny <Expression <Func <StockItem, bool> > >()))
            .Returns <Expression <Func <StockItem, bool> > >(expression => Task.FromResult(_fixture.StockItems.AsQueryable().FirstOrDefault(expression)));

            var repository = new StockItemRepository(AutoMapperSingleton.Mapper, _fixture.MockStockItemService.Object);

            //Act
            var exception = await Assert.ThrowsAsync <RestException>(() => repository.CreateStockItemAsync(new CreateStockItemDto {
                Name = "Rice", TypeId = 1, UnitOfMeasureId = 1, ItemUnit = 10
            }));

            //Assert
            exception.ErrorCode.Should().Be(HttpStatusCode.Conflict);
            exception.ErrorMessage.Should().Be("Stock item is already available.");
            exception.ErrorType.Should().Be(HttpStatusCode.Conflict.ToString());
        }
        public async Task CreateStockItemAsync_Returns_New_GetStockItemDto()
        {
            //Arrange
            _fixture.MockStockItemService.Setup(x => x.AddStockItemAsync(It.IsAny <StockItem>()))
            .ReturnsAsync(_fixture.CreatedNewStockItem);

            var repository = new StockItemRepository(AutoMapperSingleton.Mapper, _fixture.MockStockItemService.Object);

            //Act
            var result = await repository.CreateStockItemAsync(_fixture.CreateStockItemDto);

            //Assert
            result.Should().BeOfType(typeof(GetStockItemDto));
            result.Id.Should().Be(5);
            result.Name.Should().Be("Cream Soda");
            result.StockType.Should().Be("Beverage");
            result.UnitOfMeasureCode.Should().Be("ml");
        }
        public async Task GetStockItemAsync_Throws_NotFoundException()
        {
            //Arrange
            var id = 201;

            _fixture.MockStockItemService.Setup(x => x.GetStockItemAsync(It.IsAny <Expression <Func <StockItem, bool> > >()))
            .Returns <Expression <Func <StockItem, bool> > >(expression => Task.FromResult(_fixture.StockItems.AsQueryable().FirstOrDefault(expression)));

            var repository = new StockItemRepository(AutoMapperSingleton.Mapper, _fixture.MockStockItemService.Object);

            //Act
            var exception = await Assert.ThrowsAsync <RestException>(() => repository.GetStockItemAsync(id));

            //Assert
            exception.ErrorCode.Should().Be(HttpStatusCode.NotFound);
            exception.ErrorMessage.Should().Be("Stock item not found.");
            exception.ErrorType.Should().Be(HttpStatusCode.NotFound.ToString());
        }
        public async Task GetStockItemsByTypeAsync_With_Empty_Paged_Params_Returns_StockItemEnvelop()
        {
            //Arrange
            _fixture.MockStockItemService.Setup(x => x.GetStockItemsAsync(d => d.TypeId == 1, 0, 10))
            .ReturnsAsync(_fixture.CollectionEnvelop);

            var repository = new StockItemRepository(AutoMapperSingleton.Mapper, _fixture.MockStockItemService.Object);

            //Act
            var result = await repository.GetStockItemsByTypeAsync(1, null, null);

            //Assert
            var stockItemEnvelop = result.Should().BeAssignableTo <StockItemEnvelop>().Subject;

            stockItemEnvelop.StockItemCount.Should().Be(2);
            stockItemEnvelop.StockItems.Should().HaveCount(2);
            stockItemEnvelop.ItemsPerPage.Should().Be(10);
            stockItemEnvelop.TotalPages.Should().Be(1);
        }
        public async Task GetStockItemAsync_Returns_GetStockItemDto()
        {
            //Arrange
            var id = 1;

            _fixture.MockStockItemService.Setup(x => x.GetStockItemAsync(It.IsAny <Expression <Func <StockItem, bool> > >()))
            .Returns <Expression <Func <StockItem, bool> > >(expression => Task.FromResult(_fixture.StockItems.AsQueryable().FirstOrDefault(expression)));

            var repository = new StockItemRepository(AutoMapperSingleton.Mapper, _fixture.MockStockItemService.Object);

            //Act
            var result = await repository.GetStockItemAsync(id);

            //Assert
            result.Should().BeOfType(typeof(GetStockItemDto));
            result.Id.Should().Be(id);
            result.Name.Should().Be("Rice");
            result.StockType.Should().Be("Grocery");
            result.UnitOfMeasureCode.Should().Be("kg");
        }