public RecommendationControllerTests()
        {
            var productService     = new FakeProductService();
            var categoryRepository = new FakeCategoryRepository();

            recommendationControler = new RecommendationControler(productService, categoryRepository);
        }
        public async Task GetPurchaseTest_Valid()
        {
            // Arrange
            var repo = new FakePurchaseRepo(TestData.Purchases());
            var productRepo = new FakeProductService(TestData.Products());
            using (var controller = new PurchasesController(repo, productRepo, null, null))
            {
                var purchaseId = 1;

                // Act
                var result = await controller.Details(purchaseId);

                // Assert
                Assert.IsNotNull(result);
                var objResult = result.Result as OkObjectResult;
                Assert.IsNotNull(objResult);
                var retResult = objResult.Value as PurchaseDetailsDto;
                Assert.IsNotNull(retResult);

                Assert.AreEqual(TestData.Purchases()[purchaseId - 1].ProductId, retResult.Id);
                Assert.AreEqual(TestData.Purchases()[purchaseId - 1].ProductId, retResult.ProductId);
                Assert.AreEqual(TestData.Purchases()[purchaseId - 1].Qty, retResult.Qty);
                Assert.AreEqual(TestData.Purchases()[purchaseId - 1].AddressId, retResult.AddressId);
                Assert.AreEqual(TestData.Purchases()[purchaseId - 1].AccountId, retResult.AccountId);
                Assert.AreEqual(TestData.Purchases()[purchaseId - 1].OrderStatus, retResult.OrderStatus);
                Assert.AreEqual(TestData.Purchases()[purchaseId - 1].TimeStamp, retResult.TimeStamp);
            }
        }
        public void GetSavedDraftOrdersRetrievesOrdersWithDraftStatusAndForCurrentUser()
        {
            OrdersManagementDataSet ds = new OrdersManagementDataSet();

            OrdersManagementDataSet.OrdersRow ordersRow = ds.Orders.NewOrdersRow();
            ordersRow.Approver    = "WhoCares";
            ordersRow.Creator     = "CurrentUser";
            ordersRow.OrderName   = "Test Order";
            ordersRow.OrderStatus = (int)OrderStatusEnum.Draft;
            ds.Orders.AddOrdersRow(ordersRow);
            OrdersManagementDataSet.OrderDetailsRow detailRow = ds.OrderDetails.NewOrderDetailsRow();
            detailRow.OrdersRow = ordersRow;
            detailRow.ProductId = 11;
            detailRow.Quantity  = 3;
            ds.OrderDetails.AddOrderDetailsRow(detailRow);
            ds.AcceptChanges();

            FakeProductService productService = new FakeProductService();

            productService.Products.Add(new Product(11, null, null, 2.99m, null));
            OrdersService ordersService = new OrdersService(ds, productService);

            IList <Order> orders = ordersService.GetSavedDraftOrders("CurrentUser");

            Assert.IsNotNull(orders);
            Assert.AreEqual(1, orders.Count);
            Order order = orders[0];

            Assert.AreEqual("Test Order", order.OrderName);
            Assert.IsNotNull(order);
            Assert.AreEqual(1, order.Details.Count);
            Assert.AreEqual((short)3, order.Details[0].Quantity);
            Assert.AreEqual(2.99m, order.Details[0].UnitPrice);
        }
        public async Task GetResellPriceTest_InvalidTest()
        {
            Guid invalidProductID = Guid.NewGuid();
            var  expectedResult   = FakeProductService.GetResellPriceOfProducts(invalidProductID);
            var  actualResult     = await _product.GetResellPriceOfProducts(invalidProductID);

            Assert.AreEqual(expectedResult, actualResult);
        }
        public static FakeProductService GetPopulatedProductService()
        {
            FakeProductService productService = new FakeProductService();

            productService.Products.Add(new Product(1, null, null, 5.95m, null));
            productService.Products.Add(new Product(2, null, null, 1.25m, null));
            return(productService);
        }
        //Test for get product invalid test returns null
        public async Task GetProductByProductID_InvalidTest()
        {
            var invalidProductID = Guid.NewGuid();
            var expectedResult   = FakeProductService.GetProductByProductID(invalidProductID);
            var actualResult     = await _product.GetProductByProductID(invalidProductID);

            Assert.AreEqual(expectedResult, actualResult);
        }
        public async Task SetStockLvlOfProduct_InvalidTest()
        {
            var invalidProductID = Guid.NewGuid();
            int stockLvl         = 50;
            var expectedResult   = FakeProductService.SetStockLevelOfProduct(invalidProductID, stockLvl);
            var actualResult     = await _product.SetStockLvlOfProducts(invalidProductID, stockLvl);

            Assert.AreEqual(expectedResult, actualResult);
        }
        public async Task GetResellHistory_ValidTest()
        {
            var expectedResult = FakeProductService.GetResellHistory(productID);
            var actualResult   = await _product.GetResellHistory(productID);

            Assert.IsInstanceOf <List <ResellHistory> >(actualResult);
            for (int i = 0; i < actualResult.Count; i++)
            {
                Assert.AreEqual(expectedResult[i].ID, actualResult[i].ID);
                Assert.AreEqual(expectedResult[i].ProductID, actualResult[i].ProductID);
                Assert.AreEqual(expectedResult[i].ResellPrice, actualResult[i].ResellPrice);
                Assert.AreEqual(expectedResult[i].DateTime, actualResult[i].DateTime);
            }
        }
        public async Task GetStockLvlOfProduct_ValidTest()
        {
            int stockLvl       = 30;
            var expectedResult = FakeProductService.GetStockLevelOfProduct(stockLvl);
            var actualResult   = await _product.GetStockLvlOfProducts(stockLvl);

            Assert.IsInstanceOf <List <ProductDto> >(actualResult);
            for (int i = 0; i < actualResult.Count; i++)
            {
                Assert.AreEqual(expectedResult[i].ID, actualResult[i].ID);
                Assert.AreEqual(expectedResult[i].ProductID, actualResult[i].ProductID);
                Assert.AreEqual(expectedResult[i].ResellPrice, actualResult[i].ResellPrice);
                Assert.AreEqual(expectedResult[i].StockLvl, actualResult[i].StockLvl);
            }
        }
        public async Task GetStockLvlOfProduct_InvalidTest()
        {
            //Invalid stock level test. It shouuld return empty.
            int invalidStockLvl = -10;
            var expectedResult  = FakeProductService.GetStockLevelOfProduct(invalidStockLvl);
            var actualResult    = await _product.GetStockLvlOfProducts(invalidStockLvl);

            Assert.IsInstanceOf <List <ProductDto> >(actualResult);
            for (int i = 0; i < actualResult.Count; i++)
            {
                Assert.AreEqual(expectedResult[i].ID, actualResult[i].ID);
                Assert.AreEqual(expectedResult[i].ProductID, actualResult[i].ProductID);
                Assert.AreEqual(expectedResult[i].ResellPrice, actualResult[i].ResellPrice);
                Assert.AreEqual(expectedResult[i].StockLvl, actualResult[i].StockLvl);
            }
        }
        public async Task DeletePurchase_OutOfBounds()
        {
            // Arrange
            var repo = new FakePurchaseRepo(TestData.Purchases());
            var productRepo = new FakeProductService(TestData.Products());
            using (var controller = new PurchasesController(repo, productRepo, null, null))
            {
                var purchaseId = -6;

                // Act
                var result = await controller.DeleteConfirmed(purchaseId);

                // Assert
                Assert.IsInstanceOfType(result, typeof(BadRequestResult));
            }
        }
        public async Task GetPurchaseDetailsTest_OutOfBoundsID()
        {
            // Arrange
            var repo = new FakePurchaseRepo(TestData.Purchases());
            var productRepo = new FakeProductService(TestData.Products());
            using (var controller = new PurchasesController(repo, productRepo, null, null))
            {
                var purchaseId = -6;

                //Act
                var result = await controller.Details(purchaseId);

                // Assert
                Assert.IsInstanceOfType(result.Result, typeof(NotFoundResult));
            }
        }
        public async Task GetOrderHistory_OutOfBounds()
        {
            // Arrange
            var repo = new FakePurchaseRepo(TestData.Purchases());
            var productRepo = new FakeProductService(TestData.Products());
            using (var controller = new PurchasesController(repo, productRepo, null, null))
            {
                var accId = -6;

                // Act
                var result = await controller.OrderHistory(accId);

                // Assert
                Assert.IsInstanceOfType(result.Result, typeof(BadRequestResult));
            }
        }
        public async Task GetAll_Success()
        {
            // Arrange
            var repo = new FakePurchaseRepo(TestData.Purchases());
            var productRepo = new FakeProductService(TestData.Products());
            using (var controller = new PurchasesController(repo, productRepo, null, null))
            {
                // Act
                var result = await controller.GetAll();

                // Assert
                Assert.IsInstanceOfType(result.Result, typeof(OkObjectResult));
                var objResult = result.Result as OkObjectResult;
                Assert.IsNotNull(objResult);
            }
        }
        public async Task DeletePurchase_Success()
        {
            // Arrange
            var repo = new FakePurchaseRepo(TestData.Purchases());
            var productRepo = new FakeProductService(TestData.Products());
            using (var controller = new PurchasesController(repo, productRepo, null, null))
            {
                var purchaseId = 1;

                // Act
                await controller.DeleteConfirmed(purchaseId);

                // Assert
                var purchase = await controller.Details(purchaseId);
                Assert.IsInstanceOfType(purchase.Result, typeof(NotFoundResult));
            }
        }
        public void GetOrderWithDetailsGetsBothOrderAndDetails()
        {
            OrdersManagementDataSet ds = new OrdersManagementDataSet();

            OrdersManagementDataSet.OrdersRow ordersRow = ds.Orders.NewOrdersRow();
            ordersRow.CustomerId     = "11";
            ordersRow.Description    = "MyDescription";
            ordersRow.Approver       = "MyEmployeeId";
            ordersRow.Creator        = "MyEmployeeId";
            ordersRow.OrderName      = "MyOrderName";
            ordersRow.OrderStatus    = (int)OrderStatusEnum.Draft;
            ordersRow.ShipAddress    = "MyShipAddress";
            ordersRow.ShipCity       = "MyShipCity";
            ordersRow.ShipPostalCode = "MyZip";
            ordersRow.ShipRegion     = "MyShipRegion";
            ds.Orders.AddOrdersRow(ordersRow);
            OrdersManagementDataSet.OrderDetailsRow detailRow = ds.OrderDetails.NewOrderDetailsRow();
            detailRow.OrdersRow = ordersRow;
            detailRow.ProductId = 11;
            detailRow.Quantity  = 3;
            ds.OrderDetails.AddOrderDetailsRow(detailRow);
            ds.AcceptChanges();

            FakeProductService productService = new FakeProductService();

            productService.Products.Add(new Product(11, null, null, 2.99m, null));

            OrdersService ordersService = new OrdersService(ds, productService);

            Order order = ordersService.GetOrderWithDetails(ordersRow.OrderId);

            Assert.IsNotNull(order);
            Assert.AreEqual(ordersRow.OrderId, order.OrderId);
            Assert.AreEqual("MyDescription", order.Description);
            Assert.IsNotNull(order.Details);
            Assert.AreEqual(1, order.Details.Count);
            Assert.AreEqual((short)3, order.Details[0].Quantity);
            Assert.AreEqual(2.99m, order.Details[0].UnitPrice);
        }
        public async Task GetOrderHistoryTest_Success()
        {
            // Arrange
            var repo = new FakePurchaseRepo(TestData.Purchases());
            var productRepo = new FakeProductService(TestData.Products());
            using (var controller = new PurchasesController(repo, productRepo, null, null))
            {
                var accId = 1;

                // Act
                var result = await controller.OrderHistory(accId);

                // Assert
                Assert.IsNotNull(result);
                var objResult = result.Result as OkObjectResult;
                Assert.IsNotNull(objResult);
                var retResult = objResult.Value as List<Purchase>;
                Assert.IsNotNull(retResult);
                //foreach (Purchase purchase in retResult)
                //{
                //    Assert.AreEqual(await repo.GetPurchase(purchase.Id), purchase);
                //}
            }
        }