public void CreateOrderWorks()
        {
            // Arrange
            var options = new DbContextOptionsBuilder <_1811proj0Context>().UseInMemoryDatabase("createorder_test").Options;

            using (var db = new _1811proj0Context(options))
            {
                // Add location to in-memory database to be referenced
                db.Locations.Add(new Locations {
                    LId = 1, City = "Test", State = "Location"
                });
                db.SaveChanges();

                // Add user to in-memory database to be referenced
                db.Users.Add(new Users {
                    UId = 1, FirstName = "Sample", LastName = "User", DefaultLocation = 1
                });
                db.SaveChanges();
            }

            // Act
            using (var db = new _1811proj0Context(options))
            {
                var repo = new PizzaRepository(db);

                repo.CreateOrder(1, 1);
            }

            // Assert
            using (var db = new _1811proj0Context(options))
            {
                Orders order = db.Orders.Include(m => m.OrderForNavigation).Include(m => m.OrderedFromNavigation).First(m => m.OrderedFromNavigation.City == "Test");

                Assert.NotEqual(0, order.OId);
                Assert.NotNull(order.OrderForNavigation);
                Assert.NotNull(order.OrderedFromNavigation);
                Assert.NotEqual(0, order.OrderFor);
                Assert.NotEqual(0, order.OrderedFrom);
                Assert.Equal("Sample", order.OrderForNavigation.FirstName);
                Assert.Equal("User", order.OrderForNavigation.LastName);
                Assert.Equal("Test", order.OrderedFromNavigation.City);
                Assert.Equal("Location", order.OrderedFromNavigation.State);
            }
        }
예제 #2
0
        public static void Main(string[] args)
        {
            var connectionString = SecretConfiguration.ConnectionString;

            var optionsBuilder = new DbContextOptionsBuilder <_1811proj0Context>();

            optionsBuilder.UseSqlServer(connectionString);
            options = optionsBuilder.Options;

            var db   = new _1811proj0Context(options);
            var repo = new PizzaRepository(db);

            int activeProgram = 1;

            while (activeProgram == 1)
            {
                Console.WriteLine();
                Console.WriteLine("- - - - - - - - - - ");
                Console.WriteLine("Pete's Pizza Pagoda");
                Console.WriteLine();

                Console.WriteLine("What would you like to do?");
                Console.WriteLine("1) Place an order");
                Console.WriteLine("2) Show all users by name");
                Console.WriteLine("3) Show order history");
                Console.WriteLine();

                Console.WriteLine("4) Exit application");
                Console.WriteLine();

                var input = Console.ReadLine();

                switch (input)
                {
                // Place an order
                case "1":
                    Console.WriteLine();
                    Console.WriteLine("- - - - - - - - - - ");
                    Console.WriteLine("Choose a user to place an order for:");
                    Console.WriteLine();

                    int userCount   = 1;
                    var systemUsers = repo.AllUsersByName;

                    // Display all users
                    foreach (var item in systemUsers)
                    {
                        Console.WriteLine($"{userCount}) {item.LastName}, {item.FirstName}");
                        userCount++;
                    }

                    Console.WriteLine();
                    input = Console.ReadLine();

                    int selectedIndex = -1;

                    // Check that input is a number
                    if (!Int32.TryParse(input, out selectedIndex))
                    {
                        Console.WriteLine("Please enter the number of a user from the list");
                    }
                    // Check if the input number is a number on the given list
                    else if (selectedIndex > systemUsers.Count || selectedIndex <= 0)
                    {
                        Console.WriteLine("User could not be found");
                    }
                    // Number is valid, get user
                    else
                    {
                        var activeUser = repo.GetUserById(systemUsers[selectedIndex - 1].UId);
                        int loggedIn   = 1;

                        while (loggedIn == 1)
                        {
                            Console.WriteLine();
                            Console.WriteLine("- - - - - - - - - - ");
                            Console.WriteLine($"Welcome, {activeUser.FirstName} {activeUser.LastName}!");
                            Console.WriteLine("How can we help you today?");
                            Console.WriteLine();

                            Console.WriteLine("1) Place a new order");
                            Console.WriteLine("2) View order history");
                            Console.WriteLine();

                            Console.WriteLine("3) Logout");
                            input = Console.ReadLine();

                            switch (input)
                            {
                            // Place order for selected user
                            case "1":
                                int placingOrder = 1;

                                repo.CreateOrder(activeUser.UId, activeUser.DefaultLocation);

                                while (placingOrder == 1)
                                {
                                    Console.WriteLine();
                                    Console.WriteLine("- - - - - - - - - - ");
                                    Console.WriteLine($"New order for {activeUser.FirstName} {activeUser.LastName}");
                                    Console.WriteLine("| Pizza | Price | Quantity |");
                                    Console.WriteLine("-------------------------------------------------------");

                                    var currentOrder = repo.GetWorkingOrder(activeUser.UId);
                                    foreach (var item in repo.ShowOrderDetails(currentOrder))
                                    {
                                        Console.WriteLine($"| {item.PizzaNavigation.Name} | ${item.PizzaNavigation.Price} |  {item.Quantity} |");
                                    }
                                    Console.WriteLine("-------------------------------------------------------");
                                    Console.WriteLine();

                                    Console.WriteLine("1) Add entry");
                                    Console.WriteLine("2) Remove entry");
                                    Console.WriteLine();
                                    Console.WriteLine("3) Place order");
                                    Console.WriteLine("4) Cancel order");
                                    Console.WriteLine();

                                    input = Console.ReadLine();

                                    switch (input)
                                    {
                                    case "1":
                                        int addingPizza = 1;
                                        while (addingPizza == 1)
                                        {
                                            Console.WriteLine();
                                            Console.WriteLine("- - - - - - - - - - ");
                                            Console.WriteLine("What kind of pizza would you like");
                                            Console.WriteLine("-------------------------------------------------------");

                                            foreach (var item in repo.ListAllPizzas())
                                            {
                                                Console.WriteLine($"{item.PId}) {item.Name}, ${item.Price}");
                                            }
                                            Console.WriteLine("-------------------------------------------------------");
                                            Console.WriteLine();

                                            input = Console.ReadLine();

                                            int  pizza      = -1;
                                            bool inputIsInt = Int32.TryParse(input, out pizza);
                                            bool validId    = false;

                                            foreach (var item in repo.ListAllPizzas())
                                            {
                                                if (item.PId == pizza)
                                                {
                                                    validId = true;
                                                }
                                            }

                                            // Check that input is a number
                                            if (!inputIsInt)
                                            {
                                                Console.WriteLine("Please enter the number of a pizza from the list");
                                            }
                                            else if (!validId)
                                            {
                                                Console.WriteLine("Pizza could not be found");
                                            }
                                            else
                                            {
                                                int getNumber = 1;
                                                while (getNumber == 1)
                                                {
                                                    Console.WriteLine("How many would you like to add?");
                                                    Console.WriteLine();

                                                    input = Console.ReadLine();

                                                    int quantity = -1;
                                                    if (!Int32.TryParse(input, out quantity))
                                                    {
                                                        Console.WriteLine("Please enter a number");
                                                        Console.WriteLine();
                                                        Console.WriteLine("- - - - - - - - - - ");
                                                    }
                                                    else
                                                    {
                                                        repo.CreateOrderEntry(currentOrder.OId, pizza, quantity);
                                                        repo.SaveChanges();
                                                        getNumber = 0;
                                                    }
                                                }
                                            }
                                            addingPizza = 0;
                                        }
                                        break;

                                    case "2":
                                        if (repo.ShowOrderDetails(currentOrder).Count > 0)
                                        {
                                            Console.WriteLine();
                                            Console.WriteLine("- - - - - - - - - - ");
                                            Console.WriteLine("Which entry would you like to remove?");
                                            Console.WriteLine("| ID | Pizza | Price | Quantity |");

                                            foreach (var item in repo.ShowOrderDetails(currentOrder))
                                            {
                                                Console.WriteLine($"| {item.OeId} | {item.PizzaNavigation.Name} | ${item.PizzaNavigation.Price} |  {item.Quantity} |");
                                            }
                                            Console.WriteLine("-------------------------------------------------------");
                                            Console.WriteLine();

                                            input = Console.ReadLine();

                                            int  entry      = -1;
                                            bool inputIsInt = Int32.TryParse(input, out entry);
                                            bool validId    = false;

                                            foreach (var item in repo.ShowOrderDetails(currentOrder))
                                            {
                                                if (item.OeId == entry)
                                                {
                                                    validId = true;
                                                }
                                            }

                                            // Check that input is a number
                                            if (!inputIsInt)
                                            {
                                                Console.WriteLine("Please enter the ID of the entry you wish to remove");
                                                Console.WriteLine();
                                            }
                                            else if (!validId)
                                            {
                                                Console.WriteLine("Entry could not be found");
                                                Console.WriteLine();
                                            }
                                            else
                                            {
                                                repo.DeleteOrderEntry(entry);
                                                repo.SaveChanges();
                                            }
                                        }
                                        else
                                        {
                                            Console.WriteLine("This order has no entries!");
                                            Console.WriteLine();
                                            Console.WriteLine("[press any key to continue]");
                                            Console.ReadLine();
                                        }

                                        break;

                                    case "3":
                                        if (repo.ValidOrderPrice(currentOrder))
                                        {
                                            if (repo.ValidOrderSize(currentOrder))
                                            {
                                                currentOrder.OrderedAt         = DateTime.Now;
                                                currentOrder.TotalPrice        = repo.GetOrderTotal(currentOrder);
                                                currentOrder.NumOfOrderedItems = repo.GetNumberOfOrderItems(currentOrder);

                                                repo.SaveChanges();
                                            }
                                            else
                                            {
                                                Console.WriteLine("Order must have at least 1 pizza, but no more than 12");
                                            }
                                        }
                                        else
                                        {
                                            Console.WriteLine("Total order price cannot exceed $500");
                                        }

                                        placingOrder = 0;
                                        Console.WriteLine();
                                        Console.WriteLine("Order placed!");
                                        Console.WriteLine("[Press any key to continue]");

                                        Console.ReadLine();
                                        break;

                                    case "4":
                                        placingOrder = 0;
                                        repo.CancelOrder(currentOrder);
                                        repo.SaveChanges();
                                        break;

                                    default:
                                        Console.WriteLine();
                                        Console.WriteLine("Command not recognized");
                                        Console.WriteLine();
                                        break;
                                    }
                                }


                                break;

                            // Get user's order history
                            case "2":
                                Console.WriteLine();
                                Console.WriteLine("- - - - - - - - - - ");
                                Console.WriteLine($"{activeUser.FirstName} {activeUser.LastName}'s order history:");
                                DisplayOrders(repo.GetUsersOrderHistory(activeUser.UId), repo);
                                break;

                            // Log user out
                            case "3":
                                loggedIn = 0;
                                break;

                            default:
                                Console.WriteLine();
                                Console.WriteLine("Command not recognized");
                                Console.WriteLine();
                                break;
                            }
                        }
                    }
                    break;

                // Show all users by name
                case "2":
                    Console.WriteLine();
                    Console.WriteLine("- - - - - - - - - - ");
                    Console.WriteLine("All users by name:");
                    Console.WriteLine("| ID | Last Name | First Name | Default Location |");
                    Console.WriteLine("-------------------------------------------------------");

                    foreach (var item in repo.AllUsersByName)
                    {
                        Console.WriteLine($"| {item.UId} | {item.LastName} | {item.FirstName} | {item.DefaultLocation} |");
                    }

                    Console.WriteLine("-------------------------------------------------------");
                    Console.WriteLine();

                    Console.WriteLine("[Press any key to return to previous menu]");
                    Console.ReadLine();
                    break;

                // Display show orders menu
                case "3":
                    int viewOrders = 1;

                    while (viewOrders == 1)
                    {
                        Console.WriteLine();
                        Console.WriteLine("- - - - - - - - - - ");
                        Console.WriteLine("How would you like to view the orders?");
                        Console.WriteLine();

                        Console.WriteLine("1) By earliest order");
                        Console.WriteLine("2) By latest order");
                        Console.WriteLine("3) By cheapest order");
                        Console.WriteLine("4) By most expensive order");
                        Console.WriteLine();

                        Console.WriteLine("5) Return to main menu");
                        Console.WriteLine();

                        input = Console.ReadLine();

                        switch (input)
                        {
                        // Show all orders by earliest
                        case "1":
                            Console.WriteLine();
                            Console.WriteLine("- - - - - - - - - - ");
                            Console.WriteLine("All orders by earliest:");
                            DisplayOrders(repo.GetOrderHistoryByEarliest(), repo);
                            break;

                        // Show all orders by latest
                        case "2":
                            Console.WriteLine();
                            Console.WriteLine("- - - - - - - - - - ");
                            Console.WriteLine("All orders by latest:");
                            DisplayOrders(repo.GetOrderHistoryByLatest(), repo);
                            break;

                        // Show all orders by cheapest
                        case "3":
                            Console.WriteLine();
                            Console.WriteLine("- - - - - - - - - - ");
                            Console.WriteLine("All orders by cheapest:");
                            DisplayOrders(repo.GetOrderHistoryByCheapest(), repo);
                            break;

                        // Show all orders by most expensive
                        case "4":
                            Console.WriteLine();
                            Console.WriteLine("- - - - - - - - - - ");
                            Console.WriteLine("All orders by most expensive:");
                            DisplayOrders(repo.GetOrderHistoryByMostExpensive(), repo);
                            break;

                        // Return to Main Menu
                        case "5":
                            viewOrders = 0;
                            Console.WriteLine();
                            Console.WriteLine("- - - - - - - - - - ");
                            break;

                        default:
                            Console.WriteLine();
                            Console.WriteLine("Command not recognized");
                            Console.WriteLine();
                            break;
                        }
                    }

                    break;

                // Exit Program
                case "4":
                    activeProgram = 0;
                    Console.WriteLine();
                    Console.WriteLine("Exiting program...");
                    break;

                default:
                    Console.WriteLine();
                    Console.WriteLine("Command not recognized");
                    Console.WriteLine();
                    break;
                }
            }
        }
        public void CancelOrderWorks()
        {
            var options = new DbContextOptionsBuilder <_1811proj0Context>().UseInMemoryDatabase("cancelorder_test").Options;

            using (var db = new _1811proj0Context(options))
            {
                // Add location to in-memory database to be referenced
                db.Locations.Add(new Locations {
                    LId = 1, City = "", State = ""
                });
                db.SaveChanges();

                // Add user to in-memory database to be referenced
                db.Users.Add(new Users {
                    UId = 1, FirstName = "", LastName = "", DefaultLocation = 1
                });
                db.SaveChanges();

                // Add pizzas to in-memory database to be referenced
                db.Pizzas.Add(new Pizzas {
                    PId = 1, Name = "", Price = 49.99M
                });
                db.Pizzas.Add(new Pizzas {
                    PId = 2, Name = "", Price = 44.99M
                });
                db.SaveChanges();


                // Add orders to in-memory database to be tested/referenced
                // This order will have 1 order entry to be removed
                db.Orders.Add(new Orders
                {
                    OId         = 1,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                // This one will have 2 order entries to be removed
                db.Orders.Add(new Orders
                {
                    OId         = 2,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                // This one will have no order entries to be removed
                db.Orders.Add(new Orders
                {
                    OId         = 3,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });
                db.SaveChanges();

                // Add order entries to in-memory database to populate the orders being tested
                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 1,
                    OnOrder  = 1,
                    Pizza    = 2,
                    Quantity = 5
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 2,
                    OnOrder  = 2,
                    Pizza    = 1,
                    Quantity = 4
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 3,
                    OnOrder  = 2,
                    Pizza    = 2,
                    Quantity = 3
                });
                db.SaveChanges();
            }

            // Act
            using (var db = new _1811proj0Context(options))
            {
                var repo = new PizzaRepository(db);

                repo.CancelOrder(db.Orders.Find(1));
                repo.CancelOrder(db.Orders.Find(2));

                // Attmpet to cancel an order with no order entries (this still needs to work in order to actually cancel the order)
                repo.CancelOrder(db.Orders.Find(3));
            }

            // Assert
            using (var db = new _1811proj0Context(options))
            {
                Assert.Null(db.OrderEntries.Find(1));
                Assert.Null(db.OrderEntries.Find(2));
                Assert.Null(db.OrderEntries.Find(3));
                Assert.Null(db.Orders.Find(1));
                Assert.Null(db.Orders.Find(2));
                Assert.Null(db.Orders.Find(3));

                // Ask if there's a way to set this up to test that it throws an exceptions
                // Assert.Throws<ArgumentException>(repo.CancelOrder(db.Orders.Find(4)));
            }
        }
        public void GetNumberOfOrderItemsWorks()
        {
            var options = new DbContextOptionsBuilder <_1811proj0Context>().UseInMemoryDatabase("getnumberoforderitems_test").Options;

            // Declare variables for testing - these should change from -1 by the end of the test
            int itemsOnOrder1 = -1;
            int itemsOnOrder2 = -1;
            int itemsOnOrder3 = -1;

            // Arrange
            using (var db = new _1811proj0Context(options))
            {
                // Add location to in-memory database to be referenced
                db.Locations.Add(new Locations {
                    LId = 1, City = "", State = ""
                });
                db.SaveChanges();

                // Add user to in-memory database to be referenced
                db.Users.Add(new Users {
                    UId = 1, FirstName = "", LastName = "", DefaultLocation = 1
                });
                db.SaveChanges();

                // Add pizzas to in-memory database to be referenced
                db.Pizzas.Add(new Pizzas {
                    PId = 1, Name = "", Price = 49.99M
                });
                db.Pizzas.Add(new Pizzas {
                    PId = 2, Name = "", Price = 44.99M
                });
                db.SaveChanges();


                // Add orders to in-memory database to be tested/referenced
                // This order will have 5 items on it
                db.Orders.Add(new Orders
                {
                    OId         = 1,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                // This one will have 7 items on it across two order entries
                db.Orders.Add(new Orders
                {
                    OId         = 2,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                // This one will have no items on it (no order entries associated with the order)
                db.Orders.Add(new Orders
                {
                    OId         = 3,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });
                db.SaveChanges();

                // Add order entries to in-memory database to populate the orders being tested
                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 1,
                    OnOrder  = 1,
                    Pizza    = 2,
                    Quantity = 5
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 2,
                    OnOrder  = 2,
                    Pizza    = 1,
                    Quantity = 4
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 3,
                    OnOrder  = 2,
                    Pizza    = 2,
                    Quantity = 3
                });
                db.SaveChanges();
            }

            // Act
            using (var db = new _1811proj0Context(options))
            {
                var repo = new PizzaRepository(db);

                itemsOnOrder1 = repo.GetNumberOfOrderItems(db.Orders.Find(1));
                itemsOnOrder2 = repo.GetNumberOfOrderItems(db.Orders.Find(2));
                itemsOnOrder3 = repo.GetNumberOfOrderItems(db.Orders.Find(3));
            }

            // Assert
            using (var db = new _1811proj0Context(options))
            {
                Assert.True(itemsOnOrder1 == 5);
                Assert.True(itemsOnOrder2 == 7);
                Assert.True(itemsOnOrder3 == 0);
            }
        }
        public void CreateOrderEntryWorks()
        {
            var options = new DbContextOptionsBuilder <_1811proj0Context>().UseInMemoryDatabase("createorderentry_test").Options;

            // Arrange
            using (var db = new _1811proj0Context(options))
            {
                db.Locations.Add(new Locations {
                    LId = 1, City = "Test", State = "Location"
                });
                db.SaveChanges();

                db.Users.Add(new Users {
                    UId = 1, FirstName = "Sample", LastName = "User", DefaultLocation = 1
                });
                db.SaveChanges();

                // Add pizzas to in-memory database to be referenced
                db.Pizzas.Add(new Pizzas {
                    PId = 1, Name = "", Price = 49.99M
                });
                db.Pizzas.Add(new Pizzas {
                    PId = 2, Name = "", Price = 44.99M
                });
                db.SaveChanges();

                // Add order to in-memory database
                db.Orders.Add(new Orders
                {
                    OId         = 1,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });
                db.SaveChanges();
            }

            // Act
            using (var db = new _1811proj0Context(options))
            {
                var repo = new PizzaRepository(db);

                repo.CreateOrderEntry(1, 1, 2);
                repo.CreateOrderEntry(1, 2, 3);
                db.SaveChanges();
            }

            // Assert
            using (var db = new _1811proj0Context(options))
            {
                IList <OrderEntries> orderEntries = db.OrderEntries.Include(m => m.OnOrderNavigation).Where(m => m.OnOrder == 1).ToList();

                Assert.True(orderEntries[0].OnOrder == 1);
                Assert.True(orderEntries[1].OnOrder == 1);
                Assert.True(orderEntries[0].Pizza == 1);
                Assert.True(orderEntries[1].Pizza == 2);
                Assert.True(orderEntries[0].Quantity == 2);
                Assert.True(orderEntries[1].Quantity == 3);
                Assert.True(orderEntries[0].OnOrderNavigation.OrderFor == 1);
                Assert.True(orderEntries[1].OnOrderNavigation.OrderFor == 1);
                Assert.True(orderEntries[0].OnOrderNavigation.OrderedFrom == 1);
                Assert.True(orderEntries[1].OnOrderNavigation.OrderedFrom == 1);
            }
        }
        public void GetOrderTotalWorks()
        {
            var options = new DbContextOptionsBuilder <_1811proj0Context>().UseInMemoryDatabase("getordertotal_test").Options;

            // Declare variables for testing - these should change from -1 by the end of the test
            decimal order1TotalPrice = -1;
            decimal order2TotalPrice = -1;
            decimal order3TotalPrice = -1;

            // Arrange
            using (var db = new _1811proj0Context(options))
            {
                // Add location to in-memory database to be referenced
                db.Locations.Add(new Locations {
                    LId = 1, City = "", State = ""
                });
                db.SaveChanges();

                // Add user to in-memory database to be referenced
                db.Users.Add(new Users {
                    UId = 1, FirstName = "", LastName = "", DefaultLocation = 1
                });
                db.SaveChanges();

                // Add pizzas to in-memory database to be referenced
                db.Pizzas.Add(new Pizzas {
                    PId = 1, Name = "", Price = 49.99M
                });
                db.Pizzas.Add(new Pizzas {
                    PId = 2, Name = "", Price = 44.99M
                });
                db.SaveChanges();


                // Add orders to in-memory database to be tested/referenced
                // This one will cost have one lnid of pizza on it
                db.Orders.Add(new Orders
                {
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                // This one will have multiple kinds of pizza on it
                db.Orders.Add(new Orders
                {
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });
                db.SaveChanges();

                // Add order entries to in-memory database to populate the orders being tested
                db.OrderEntries.Add(new OrderEntries
                {
                    OnOrder  = 1,
                    Pizza    = 1,
                    Quantity = 3
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OnOrder  = 2,
                    Pizza    = 1,
                    Quantity = 2
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OnOrder  = 2,
                    Pizza    = 2,
                    Quantity = 1
                });
                db.SaveChanges();
            }

            // Act
            using (var db = new _1811proj0Context(options))
            {
                var repo = new PizzaRepository(db);

                order1TotalPrice = repo.GetOrderTotal(db.Orders.Find(1));
                order2TotalPrice = repo.GetOrderTotal(db.Orders.Find(2));

                // setup to test that the total of a newly created order with no items; should total 0 (zero)
                repo.CreateOrder(1, 1);
                db.SaveChanges();

                order3TotalPrice = repo.GetOrderTotal(db.Orders.Last());
            }

            // Assert
            using (var db = new _1811proj0Context(options))
            {
                Assert.True(order1TotalPrice.Equals(149.97M));
                Assert.True(order2TotalPrice.Equals(144.97M));
                Assert.True(order3TotalPrice.Equals(0M));
            }
        }
        public void ShowOrderDetailsWorks()
        {
            // Arrange
            var options = new DbContextOptionsBuilder <_1811proj0Context>().UseInMemoryDatabase("showorder_test").Options;

            // Declaring variables for testing
            Orders currentOrder = new Orders();
            IList <OrderEntries> orderDetails          = null;
            bool allReturnedEntriesAreForSelectedOrder = true;
            int  numOfOrderItems   = 4;
            int  countedOrderItems = -1;

            using (var db = new _1811proj0Context(options))
            {
                db.Orders.Add(new Orders
                {
                    OId         = 1,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });
                db.SaveChanges();

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 1,
                    OnOrder  = currentOrder.OId,
                    Pizza    = 2,
                    Quantity = 2
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 2,
                    OnOrder  = currentOrder.OId,
                    Pizza    = 5,
                    Quantity = 1
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 3,
                    OnOrder  = currentOrder.OId,
                    Pizza    = 3,
                    Quantity = 1
                });
                db.SaveChanges();
            }

            // Act
            using (var db = new _1811proj0Context(options))
            {
                var repo = new PizzaRepository(db);

                orderDetails = repo.ShowOrderDetails(currentOrder);

                foreach (var item in orderDetails)
                {
                    if (item.OnOrder != currentOrder.OId)
                    {
                        allReturnedEntriesAreForSelectedOrder = false;
                    }
                }

                countedOrderItems = orderDetails.Sum(m => m.Quantity);
            }

            // Assert
            using (var db = new _1811proj0Context(options))
            {
                Assert.True(orderDetails.Count() > 0);
                Assert.True(allReturnedEntriesAreForSelectedOrder);
                Assert.Equal(numOfOrderItems, countedOrderItems);
            }
        }
        public void EnoughIngredientsWorks()
        {
            var options = new DbContextOptionsBuilder <_1811proj0Context>().UseInMemoryDatabase("enoughingredients_test").Options;

            bool order1EnoughIngredients = false;
            bool order2EnoughIngredients = true;
            bool order3EnoughIngredients = true;

            // Arrange
            using (var db = new _1811proj0Context(options))
            {
                // Add locations to in-memory database to be referenced
                db.Locations.Add(new Locations {
                    LId = 1, City = "", State = ""
                });
                db.Locations.Add(new Locations {
                    LId = 2, City = "", State = ""
                });
                db.SaveChanges();

                // Add user to in-memory database to be referenced
                db.Users.Add(new Users {
                    UId = 1, FirstName = "", LastName = "", DefaultLocation = 1
                });
                db.SaveChanges();

                // Add pizzas to in-memory database to be referenced
                db.Pizzas.Add(new Pizzas {
                    PId = 1, Name = "", Price = 0
                });
                db.Pizzas.Add(new Pizzas {
                    PId = 2, Name = "", Price = 0
                });
                db.SaveChanges();

                // Add toppings to be referenced
                db.Toppings.Add(new Toppings {
                    TId = 1, Name = ""
                });
                db.Toppings.Add(new Toppings {
                    TId = 2, Name = ""
                });
                db.Toppings.Add(new Toppings {
                    TId = 3, Name = ""
                });
                db.Toppings.Add(new Toppings {
                    TId = 4, Name = ""
                });
                db.SaveChanges();

                // Add toppings to pizzas
                db.PizzaToppings.Add(new PizzaToppings {
                    PtId = 1, Pizza = 1, Topping = 1, Quantity = 2
                });
                db.PizzaToppings.Add(new PizzaToppings {
                    PtId = 2, Pizza = 1, Topping = 2, Quantity = 2
                });
                db.PizzaToppings.Add(new PizzaToppings {
                    PtId = 3, Pizza = 1, Topping = 3, Quantity = 2
                });
                db.PizzaToppings.Add(new PizzaToppings {
                    PtId = 4, Pizza = 1, Topping = 4, Quantity = 2
                });
                db.PizzaToppings.Add(new PizzaToppings {
                    PtId = 5, Pizza = 2, Topping = 2, Quantity = 6
                });
                db.PizzaToppings.Add(new PizzaToppings {
                    PtId = 6, Pizza = 2, Topping = 4, Quantity = 6
                });
                db.SaveChanges();

                // Add location inventories
                db.LocationInventory.Add(new LocationInventory {
                    LiId = 1, Location = 1, Topping = 1, Quantity = 10
                });
                db.LocationInventory.Add(new LocationInventory {
                    LiId = 2, Location = 1, Topping = 2, Quantity = 10
                });
                db.LocationInventory.Add(new LocationInventory {
                    LiId = 3, Location = 1, Topping = 3, Quantity = 10
                });
                db.LocationInventory.Add(new LocationInventory {
                    LiId = 4, Location = 1, Topping = 4, Quantity = 10
                });
                db.LocationInventory.Add(new LocationInventory {
                    LiId = 5, Location = 2, Topping = 1, Quantity = 10
                });
                db.LocationInventory.Add(new LocationInventory {
                    LiId = 6, Location = 2, Topping = 2, Quantity = 10
                });
                db.LocationInventory.Add(new LocationInventory {
                    LiId = 7, Location = 2, Topping = 3, Quantity = 1
                });
                db.LocationInventory.Add(new LocationInventory {
                    LiId = 8, Location = 2, Topping = 4, Quantity = 7
                });
                db.SaveChanges();

                // Add orders to in-memory database
                // This one will order from a location with enough ingredients and should return valid
                db.Orders.Add(new Orders
                {
                    OId         = 1,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                // This one will order from a location without enough ingredients and should return invalid
                db.Orders.Add(new Orders
                {
                    OId         = 2,
                    OrderFor    = 1,
                    OrderedFrom = 2,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                // This one will order from a location without enough ingredients for all piizas and should return invalid
                db.Orders.Add(new Orders
                {
                    OId         = 3,
                    OrderFor    = 1,
                    OrderedFrom = 2,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });
                db.SaveChanges();


                // Add order entries to in-memory database
                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 1,
                    OnOrder  = 1,
                    Pizza    = 1,
                    Quantity = 1
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 2,
                    OnOrder  = 2,
                    Pizza    = 1,
                    Quantity = 1
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 3,
                    OnOrder  = 3,
                    Pizza    = 1,
                    Quantity = 1
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 4,
                    OnOrder  = 3,
                    Pizza    = 2,
                    Quantity = 1
                });
                db.SaveChanges();
            }

            // Act
            using (var db = new _1811proj0Context(options))
            {
                var repo = new PizzaRepository(db);

                order1EnoughIngredients = repo.EnoughIngredients(db.Orders.Find(1));
                order2EnoughIngredients = repo.EnoughIngredients(db.Orders.Find(2));
                order3EnoughIngredients = repo.EnoughIngredients(db.Orders.Find(3));
            }

            // Assert
            using (var db = new _1811proj0Context(options))
            {
                Assert.True(order1EnoughIngredients);
                Assert.False(order2EnoughIngredients);
                Assert.False(order3EnoughIngredients);
            }
        }
        public void ValidOrderPriceWorks()
        {
            var options = new DbContextOptionsBuilder <_1811proj0Context>().UseInMemoryDatabase("validorderprice_test").Options;

            // Declare variables for testing - these should ultimately return the opposite boolean value given in the declaration
            bool order1ValidPrice = false;
            bool order2ValidPrice = true;

            // Arrange
            using (var db = new _1811proj0Context(options))
            {
                // Add location to in-memory database to be referenced
                db.Locations.Add(new Locations {
                    LId = 1, City = "", State = ""
                });
                db.SaveChanges();

                // Add user to in-memory database to be referenced
                db.Users.Add(new Users {
                    UId = 1, FirstName = "", LastName = "", DefaultLocation = 1
                });
                db.SaveChanges();

                // Add pizzas to in-memory database to be referenced
                db.Pizzas.Add(new Pizzas {
                    PId = 1, Name = "", Price = 49.99M
                });
                db.Pizzas.Add(new Pizzas {
                    PId = 2, Name = "", Price = 44.99M
                });
                db.SaveChanges();


                // Add orders to in-memory database to be tested/referenced
                // This one will cost $500 or less and should return valid
                db.Orders.Add(new Orders
                {
                    OId         = 1,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                // This one will cost more than $500 and should return invalid
                db.Orders.Add(new Orders
                {
                    OId         = 2,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                // This one will cost more than $500 across multiple entries and should return invalid
                db.Orders.Add(new Orders
                {
                    OId         = 3,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });
                db.SaveChanges();

                // Add order entries to in-memory database to populate the orders being tested
                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 1,
                    OnOrder  = 1,
                    Pizza    = 2,
                    Quantity = 11
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 2,
                    OnOrder  = 2,
                    Pizza    = 1,
                    Quantity = 11
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 3,
                    OnOrder  = 3,
                    Pizza    = 1,
                    Quantity = 6
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 4,
                    OnOrder  = 3,
                    Pizza    = 2,
                    Quantity = 5
                });
                db.SaveChanges();
            }

            // Act
            using (var db = new _1811proj0Context(options))
            {
                var repo = new PizzaRepository(db);

                order1ValidPrice = repo.ValidOrderPrice(db.Orders.Find(1));
                order2ValidPrice = repo.ValidOrderPrice(db.Orders.Find(2));
            }

            // Assert
            using (var db = new _1811proj0Context(options))
            {
                Assert.True(order1ValidPrice);
                Assert.False(order2ValidPrice);
            }
        }
        public void ValidOrderSizeWorks()
        {
            // Arrange
            var options = new DbContextOptionsBuilder <_1811proj0Context>().UseInMemoryDatabase("validordersize_test").Options;

            // Declare variables for testing - these should ultimately return the opposite boolean value given in the declaration
            bool order1ValidSize = false;
            bool order2ValidSize = true;
            bool order3ValidSize = false;
            bool order4ValidSize = true;

            using (var db = new _1811proj0Context(options))
            {
                // Add location to in-memory database to be referenced
                db.Locations.Add(new Locations {
                    LId = 1, City = "", State = ""
                });
                db.SaveChanges();

                // Add user to in-memory database to be referenced
                db.Users.Add(new Users {
                    UId = 1, FirstName = "", LastName = "", DefaultLocation = 1
                });
                db.SaveChanges();


                // Add orders to in-memory database to be tested/referenced
                // This one will have 12 or less pizzas and should return valid
                db.Orders.Add(new Orders
                {
                    OId         = 1,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                // This one will have more than 12 pizzas and should return invalid
                db.Orders.Add(new Orders
                {
                    OId         = 2,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                // This one will have exactly 12 pizza and should return valid
                db.Orders.Add(new Orders
                {
                    OId         = 3,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                // This one will have more than 12 pizza total across multiple types of pizza and should return invalid
                db.Orders.Add(new Orders
                {
                    OId         = 4,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });
                db.SaveChanges();


                // Add order entries to in-memory database to populate the orders being tested
                // Order 1 entry - less than 12 pizzas
                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 1,
                    OnOrder  = 1,
                    Pizza    = 1,
                    Quantity = 2
                });

                // Order 2 entry - more than 12 pizzas
                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 2,
                    OnOrder  = 2,
                    Pizza    = 1,
                    Quantity = 15
                });

                // Order 3 entry - exactly 12 pizzas
                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 3,
                    OnOrder  = 3,
                    Pizza    = 1,
                    Quantity = 12
                });

                // Order 4 entries - more than 12 pizzas across multiple entries
                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 4,
                    OnOrder  = 4,
                    Pizza    = 1,
                    Quantity = 6
                });

                db.OrderEntries.Add(new OrderEntries
                {
                    OeId     = 5,
                    OnOrder  = 4,
                    Pizza    = 2,
                    Quantity = 7
                });
                db.SaveChanges();
            }

            // Act
            using (var db = new _1811proj0Context(options))
            {
                var repo = new PizzaRepository(db);

                order1ValidSize = repo.ValidOrderSize(db.Orders.Find(1));
                order2ValidSize = repo.ValidOrderSize(db.Orders.Find(2));
                order3ValidSize = repo.ValidOrderSize(db.Orders.Find(3));
                order4ValidSize = repo.ValidOrderSize(db.Orders.Find(4));
            }

            // Assert
            using (var db = new _1811proj0Context(options))
            {
                Assert.True(order1ValidSize);
                Assert.True(order3ValidSize);
                Assert.False(order2ValidSize);
                Assert.False(order4ValidSize);
            }
        }
        public void TooEarlyCheckWorks()
        {
            // Arrange
            var options = new DbContextOptionsBuilder <_1811proj0Context>().UseInMemoryDatabase("tooearly_test").Options;

            // Declare variables for testing - these should ultimately return the opposite boolean value given in the declaration
            bool user1OrderedTooSoon = false;
            bool user2OrderedTooSoon = true;
            bool user3OrderedTooSoon = true;

            using (var db = new _1811proj0Context(options))
            {
                // Add location to in-memory database to be referenced
                db.Locations.Add(new Locations {
                    LId = 1, City = "", State = ""
                });
                db.SaveChanges();

                // Add users to in-memory database to be referenced
                db.Users.Add(new Users {
                    UId = 1, FirstName = "", LastName = "", DefaultLocation = 1
                });

                db.Users.Add(new Users {
                    UId = 2, FirstName = "", LastName = "", DefaultLocation = 1
                });

                db.Users.Add(new Users {
                    UId = 3, FirstName = "", LastName = "", DefaultLocation = 1
                });
                db.SaveChanges();

                // Add orders to in-memory database to be tested
                db.Orders.Add(new Orders
                {
                    OId         = 1,
                    OrderFor    = 1,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now,
                    TotalPrice  = 0M
                });

                db.Orders.Add(new Orders
                {
                    OId         = 2,
                    OrderFor    = 2,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now.AddHours(-2),
                    TotalPrice  = 0M
                });

                db.Orders.Add(new Orders
                {
                    OId         = 3,
                    OrderFor    = 3,
                    OrderedFrom = 1,
                    OrderedAt   = DateTime.Now.AddDays(-1),
                    TotalPrice  = 0M
                });
                db.SaveChanges();
            }

            // Act
            using (var db = new _1811proj0Context(options))
            {
                var repo = new PizzaRepository(db);

                Orders user1Order = db.Orders.Where(m => m.OrderFor == 1).Last();
                Orders user2Order = db.Orders.Where(m => m.OrderFor == 2).Last();
                Orders user3Order = db.Orders.Where(m => m.OrderFor == 3).Last();

                user1OrderedTooSoon = repo.TooEarly(user1Order.OrderFor, user1Order.OrderedFrom);
                user2OrderedTooSoon = repo.TooEarly(user2Order.OrderFor, user2Order.OrderedFrom);
                user3OrderedTooSoon = repo.TooEarly(user3Order.OrderFor, user3Order.OrderedFrom);
            }

            // Assert
            Assert.True(user1OrderedTooSoon);
            Assert.False(user2OrderedTooSoon);
            Assert.False(user3OrderedTooSoon);
        }