Exemple #1
0
        private void GetAndShowBuy(string command)
        {
            string[]       split     = command.Split(' ');
            string         username  = split[0];
            int            productID = Convert.ToInt32(split[1]);
            bool           success   = false;
            BuyTransaction trans     = null;

            try
            {
                trans   = Core.BuyProduct(Core.GetUserByUsername(username), Core.GetProductByID(productID));
                success = Core.ExecuteTransaction(trans);
            }
            catch (UserNotFoundException e)
            {
                Ui.DisplayUserNotFound(e.Message);
            }
            catch (ProductNotFoundException e)
            {
                Ui.DisplayProductNotFound(e.Message);
            }
            catch (InsufficientFundsException e)
            {
                Ui.DisplayInsufficientCash(e.Message);
            }

            if (success == true)
            {
                Ui.DisplayUserBuysProduct(trans);
            }
        }
        private void MultiBuyProduct(User user, Product product, int count)
        {
            if (!product.Active)
            {
                throw new NotActiveProductException($"This product is not active: {product.Name}");
            }
            if (count <= 0)
            {
                throw new InvalidDataException($"Amount has to be positive! typed: ({count})");
            }
            BuyTransaction bt = null;

            if (user.Balance < (product.Price * count) && !product.CanBeBoughtOnCredit)
            {
                SUI.DisplayInsufficientCash(user, product, count);
            }
            else
            {
                for (int i = 0; i < count; i++)
                {
                    bt = S.BuyProduct(user, product);
                }
                SUI.DisplayUserBuysProduct(count, bt);
            }
        }
        public BuyTransaction CreateBuyTransaction(IUser user, IProduct product)
        {
            BuyTransaction transaction = new BuyTransaction(user, DateTime.Now, product);

            transaction.NewTransactionExecutedEvent += TransactionController.Add;

            return(transaction);
        }
Exemple #4
0
        public BuyTransaction BuyProduct(IUser user, IProduct product, uint count = 1)
        {
            BuyTransaction buyTransaction = new BuyTransaction(user, product, DateTime.Now, count);

            ExecuteTransaction(buyTransaction);

            return(buyTransaction);
        }
Exemple #5
0
 public void DisplayUserBuysProduct(int count, BuyTransaction transaction)
 {
     Console.WriteLine($"proukter købt:");
     for (int i = 0; i < count; i++)
     {
         Console.WriteLine(transaction.ToString());
     }
 }
Exemple #6
0
        public void ExecuteTest()
        {
            var user     = new User("test", "test", "test", "*****@*****.**", 99);
            var product1 = new BuyTransaction(DateTime.Now, user, new Product("test", 100, true));
            var product2 = new BuyTransaction(DateTime.Now, user, new Product("test", 0, false));

            Assert.Throws <InsufficientCreditsException>(new TestDelegate(() => { product1.Execute(); }));
            Assert.Throws <NotActiveException>(new TestDelegate(() => { product2.Execute(); }));
        }
Exemple #7
0
        public void ExecuteInvalidBuyTransaction_WithCreditOff_ThrowError()
        {
            User           user    = new User("first name", "last name", "username", "*****@*****.**", 0);
            Product        product = new Product(69, "TestProduct", 25, true, false);
            BuyTransaction bt      = new BuyTransaction(user, product.Price, product);


            Assert.Throws <InsufficientCreditsException>(() => bt.Execute());
        }
Exemple #8
0
        public void ExecuteInvalidBuyTransaction_WithInactiveProduct_ThrowError()
        {
            User           user    = new User("first name", "last name", "username", "*****@*****.**", 500);
            Product        product = new Product(69, "TestProduct", 25, false, true);
            BuyTransaction bt      = new BuyTransaction(user, product.Price, product);


            Assert.Throws <NotActiveProductException>(() => bt.Execute());
        }
Exemple #9
0
        public BuyTransaction BuyProduct(IUser user, IProductBase product, decimal amount)
        {
            BuyTransaction buyTransaction = new BuyTransaction(user, DateTime.Now, product);


            ExecuteTransaction(buyTransaction);

            return(buyTransaction);
        }
Exemple #10
0
        public void CreateValidBuyTransaction_Succes()
        {
            User    user    = new User("first name", "last name", "username", "*****@*****.**", 500);
            Product product = new Product(69, "TestProduct", 25, true, false);

            BuyTransaction bt = new BuyTransaction(user, product.Price, product);

            Assert.IsTrue(bt.User == user && bt.ProductBought == product && bt.AmountAtPurchase == product.Price);
        }
Exemple #11
0
        public void ExecuteTransactions_ListOfTransactions_shouldAddSucceededTransactionsToListOfExecutedTransactions(string desc)
        {
            //arrange
            User    user = new User(id: 1, firstname: "jakob1", lastname: "skov", username: "******", email: "*****@*****.**", balance: 100, lowBalanceDefinition: 50);
            Product A    = new Product(id: 1, name: "A", price: 50, canBeBoughtOnCredit: true);
            Product B    = new Product(id: 2, name: "B", price: 60, active: false, canBeBoughtOnCredit: true);
            Product C    = new Product(id: 3, name: "C", price: 70, canBeBoughtOnCredit: true);
            Product D    = new Product(id: 4, name: "D", price: 80, canBeBoughtOnCredit: true);

            BuyTransaction btr1 = new BuyTransaction(user: user, product: A);
            BuyTransaction btr2 = new BuyTransaction(user: user, product: B);
            BuyTransaction btr3 = new BuyTransaction(user: user, product: C);
            BuyTransaction btr4 = new BuyTransaction(user: user, product: D);

            InsertCashTransaction Itr1 = new InsertCashTransaction(user, 100);
            //InsertCashTransaction Itr2 = new InsertCashTransaction(user, 10);
            List <Product> products = new List <Product>()
            {
                A, B, C, D
            };
            List <User> users = new List <User>()
            {
                user
            };
            Stregsystem stregsystem = new Stregsystem(users: users, products: products);


            List <Transaction> expected = new List <Transaction>()
            {
                btr1, Itr1, btr3, btr4
            };


            //act
            try
            { stregsystem.ExecuteTransaction(btr1); }
            catch { }
            try
            { stregsystem.ExecuteTransaction(btr2); }
            catch { }
            try
            { stregsystem.ExecuteTransaction(Itr1); }
            catch { }
            try
            { stregsystem.ExecuteTransaction(btr3); }
            catch { }
            try
            { stregsystem.ExecuteTransaction(btr4); }
            catch { }


            List <Transaction> actual = stregsystem.ExecutedTransactions;

            //assert
            Assert.AreEqual(expected, actual, $"{desc}: actual:{actual} expected:{expected}");
        }
Exemple #12
0
        public void BuyTransaction_CallToString_ReturnsString()
        {
            const decimal amount  = 10;
            Product       product = Substitute.For <Product>("Milk", amount);
            User          user    = Substitute.For <User>(userArgs);

            BuyTransaction transaction = new BuyTransaction(user, product);

            Assert.That(transaction.ToString(), Is.TypeOf <string>());
        }
Exemple #13
0
        public void ExecuteValidBuyTransaction_Succes(decimal amount)
        {
            User           user    = new User("first name", "last name", "username", "*****@*****.**", amount);
            Product        product = new Product(69, "TestProduct", 25, true, true);
            BuyTransaction bt      = new BuyTransaction(user, product.Price, product);

            bt.Execute();

            Assert.IsTrue((amount - product.Price) == user.Balance);
        }
        public void BuyProduct_UserBuysProduct_ExpectTransactionUserEqualsUser()
        {
            BarcodeSystemManager systemManager = new BarcodeSystemManager();
            IUser    user    = CreateUser(100);
            IProduct product = CreateProduct(100, false);

            BuyTransaction transaction = systemManager.BuyProduct(user, product);

            Assert.AreEqual(user, transaction.User);
        }
        public void Execute_UserBuysProduct_IsUserBalanceUpdatedCorrectly(decimal userBalance, decimal productPrice)
        {
            IUser        user        = CreateUser(userBalance);
            IProduct     product     = CreateProduct(productPrice);
            ITransaction transaction = new BuyTransaction(user, product, DateTime.Now);

            transaction.Execute();

            Assert.AreEqual(userBalance - productPrice, user.Balance);
        }
Exemple #16
0
        public void GetTransactions_UserInt_shouldReturnListOf3LatestUserTransactions(string desc)
        {
            //arrange
            User    user = new User(id: 1, firstname: "jakob1", lastname: "skov", username: "******", email: "*****@*****.**", balance: 1000, lowBalanceDefinition: 50);
            Product A    = new Product(id: 1, name: "A", price: 50);
            Product B    = new Product(id: 2, name: "B", price: 60);
            Product C    = new Product(id: 3, name: "C", price: 70);
            Product D    = new Product(id: 4, name: "D", price: 80);

            BuyTransaction btr1 = new BuyTransaction(user: user, product: A);
            BuyTransaction btr2 = new BuyTransaction(user: user, product: B);
            BuyTransaction btr3 = new BuyTransaction(user: user, product: C);
            BuyTransaction btr4 = new BuyTransaction(user: user, product: D);

            InsertCashTransaction Itr1 = new InsertCashTransaction(user, 100);
            //InsertCashTransaction Itr2 = new InsertCashTransaction(user, 10);

            List <Product> products = new List <Product>()
            {
                A, B, C, D
            };
            List <User> users = new List <User>()
            {
                user
            };
            Stregsystem stregsystem = new Stregsystem(users: users, products: products);

            List <Transaction> expected = new List <Transaction>()
            {
                Itr1, btr3, btr4
            };


            //act
            try
            { stregsystem.ExecuteTransaction(btr1); }
            catch { }
            try
            { stregsystem.ExecuteTransaction(btr2); }
            catch { }
            try
            { stregsystem.ExecuteTransaction(Itr1); }
            catch { }
            try
            { stregsystem.ExecuteTransaction(btr3); }
            catch { }
            try
            { stregsystem.ExecuteTransaction(btr4); }
            catch { }

            List <Transaction> actual = stregsystem.GetTransactions(user, 3);

            //assert
            Assert.AreEqual(expected, actual, $"{desc}: actual:{actual} expected:{expected}");
        }
        public override void Execute()
        {
            if (!HasEnoughArguments(2))
            {
                return;
            }

            string  username         = Command[0];
            string  productIdString  = Command[1];
            int     amountToPurchase = 1;
            Product product;
            User    user;

            if (Command.Length == 3 && !int.TryParse(Command[2], out amountToPurchase))
            {
                barcodeCli.DisplayGeneralError($"{Command[2]} is not a valid amount.");
                return;
            }

            try
            {
                user = barcodeSystem.GetUserByUsername(username);
                if (uint.TryParse(productIdString, out uint productId))
                {
                    try
                    {
                        product = barcodeSystem.GetProductById(productId);
                        try
                        {
                            BuyTransaction transaction = barcodeSystem.BuyProduct(user, product, amountToPurchase);

                            this.transaction = transaction;
                            Succeeded        = transaction.Succeeded;

                            barcodeCli.DisplayUserBuysProduct(transaction);
                        }
                        catch (InsufficientCreditsException)
                        {
                            barcodeCli.DisplayInsufficientCash(user, product);
                        }
                    }
                    catch (ProductNotFoundException)
                    {
                        barcodeCli.DisplayProductNotFound(productIdString);
                    }
                }
            }
            catch (UserNotFoundException)
            {
                barcodeCli.DisplayUserNotFound(username);
            }

            base.Execute();
        }
Exemple #18
0
        public void ExecuteTransaction_AddsTransactionToListIfSuccessful_True()
        {
            BarcodeSystem barcodeSystem = Substitute.For <BarcodeSystem>(log);
            User          user          = Substitute.For <User>(userArgs);
            Product       product       = Substitute.For <Product>(productArgs);

            user.Balance = 100m;

            BuyTransaction successfulTransaction = barcodeSystem.BuyProduct(user, product);

            Assert.That(barcodeSystem.Transactions.Contains(successfulTransaction), Is.True);
        }
Exemple #19
0
        public void BuyTransaction_buyingSomethingYouCantAfford_ShouldThrowInsufficientCreditsException(string desc)
        {
            //arrange
            User           user  = new User(id: 1, firstname: "jakob1", lastname: "skov", username: "******", email: "*****@*****.**", balance: 100, lowBalanceDefinition: 50);
            Product        apple = new Product(id: 1, name: "apple", price: 199);
            BuyTransaction tr    = new BuyTransaction(user: user, product: apple);

            //act

            //assert
            Assert.Throws <InsufficientCreditsException>(() => tr.Execute(), desc);
        }
Exemple #20
0
        public void BuyTransaction_BuyProductWithInsufficientCredits_ThrowsException(decimal productPrice,
                                                                                     decimal userBalance)
        {
            Product product = Substitute.For <Product>("Milk", productPrice);
            User    user    = Substitute.For <User>(userArgs);

            user.Balance = userBalance;

            BuyTransaction transaction = new BuyTransaction(user, product);

            Assert.Throws <InsufficientCreditsException>(transaction.Execute);
        }
        public void BuyProduct_UserBuysProduct_ExpectTransactionAmountEqualsProductPrice()
        {
            const decimal productPrice = 100;

            BarcodeSystemManager systemManager = new BarcodeSystemManager();
            IUser    user    = CreateUser(100);
            IProduct product = CreateProduct(productPrice, false);

            BuyTransaction transaction = systemManager.BuyProduct(user, product);

            Assert.AreEqual(productPrice, transaction.Amount);
        }
Exemple #22
0
        public void BuyTransaction_buyingInactiveProduct_ShouldThrowProductNotActivatedException(string desc)
        {
            //arrange
            User           user  = new User(id: 1, firstname: "jakob1", lastname: "skov", username: "******", email: "*****@*****.**", balance: 100, lowBalanceDefinition: 50);
            Product        apple = new Product(id: 1, name: "apple", price: 10, active: false);
            BuyTransaction tr    = new BuyTransaction(user: user, product: apple);

            //act

            //assert
            Assert.Throws <ProductNotActivatedException>(() => tr.Execute(), desc);
        }
Exemple #23
0
        public void BuyProduct_PurchaseWithEnoughCredit_Succeeds()
        {
            BarcodeSystem barcodeSystem = Substitute.For <BarcodeSystem>(log);
            User          user          = Substitute.For <User>(userArgs);
            Product       product       = Substitute.For <Product>(productArgs);

            user.Balance = 100m;

            BuyTransaction buyTransaction = barcodeSystem.BuyProduct(user, product);

            Assert.That(buyTransaction.Succeeded, Is.True);
        }
Exemple #24
0
        public void BuyTransaction_BuyProductWithSufficientCredits_Success(decimal productPrice)
        {
            Product product = Substitute.For <Product>("Milk", productPrice);
            User    user    = Substitute.For <User>(userArgs);

            user.Balance = productPrice;

            BuyTransaction transaction = new BuyTransaction(user, product);

            transaction.Execute();

            Assert.That(transaction.Succeeded, Is.True);
        }
Exemple #25
0
        public void BuyTransaction_buyingProduct_ShouldWithdrawAmountFromUserBalance(string desc)
        {
            //arrange
            User           user     = new User(id: 1, firstname: "jakob1", lastname: "skov", username: "******", email: "*****@*****.**", balance: 100, lowBalanceDefinition: 50);
            Product        apple    = new Product(id: 1, name: "apple", price: 10, active: true);
            BuyTransaction tr       = new BuyTransaction(user, apple);
            decimal        expected = 90;

            //act
            tr.Execute();

            //assert
            Assert.AreEqual(expected, user.Balance, $"{desc}: actual:{tr.User.Balance},expected:{expected}");
        }
Exemple #26
0
            /// <summary>
            /// performs a buy transaction for coin having <paramref name="buyTransaction"/>.CoinId.
            /// </summary>
            /// <seealso cref="PortfolioEntry.Buy(Transaction)"/>
            /// <param name="buyTransaction"></param>
            /// <exception cref="ManagerNotInitializedException">
            /// <seealso cref="GetPortfolioEntry(long)"/>
            /// </exception>
            /// <exception cref="CoinNotInPortfolioException">
            /// <seealso cref="GetPortfolioEntry(long)"/>
            /// </exception>
            /// <exception cref="InvalidPriceException">
            /// <seealso cref="PortfolioEntry.Buy(Transaction))"/>
            /// </exception>
            /// <exception cref="DatabaseCommunicationException">
            /// <seealso cref="handleDatabaseHandlerException(string, SQLiteDatabaseHandlerException)"/>
            /// </exception>
            public void BuyCoin(BuyTransaction buyTransaction)
            {
                assertManagerInitialized("BuyCoin");

                PortfolioEntry portfolioEntry = GetPortfolioEntry(buyTransaction.CoinId);

                try
                {
                    portfolioEntry.Buy(buyTransaction);
                }
                catch (SQLiteDatabaseHandlerException sqliteDatabaseHandlerException)
                {
                    handleDatabaseHandlerException("BuyCoin", sqliteDatabaseHandlerException);
                }
            }
Exemple #27
0
        public void ID_isGenerated_ShouldBeOrderedByTimeCreated(string desc)
        {
            //arrange
            User    user = new User();
            Product A    = new Product(id: 1, name: "A ", price: 10);
            Product B    = new Product(id: 2, name: "B ", price: 100);
            Product C    = new Product(id: 3, name: "C ", price: 10);
            Product D    = new Product(id: 4, name: "D ", price: 100);

            //TODO find en bedre test!!
            BuyTransaction tr1 = new BuyTransaction(user, A);

            System.Threading.Thread.Sleep(50);
            BuyTransaction tr2 = new BuyTransaction(user, B);

            System.Threading.Thread.Sleep(50);
            BuyTransaction tr3 = new BuyTransaction(user, C);

            System.Threading.Thread.Sleep(50);
            BuyTransaction tr4 = new BuyTransaction(user, D);

            List <BuyTransaction> expectedList = new List <BuyTransaction>()
            {
                tr4, tr3, tr2, tr1
            };
            string expected = "";

            foreach (BuyTransaction item in expectedList)
            {
                expected += $"\n{item.Product.Name}{item.ID}";
            }

            List <BuyTransaction> actualList = new List <BuyTransaction>()
            {
                tr2, tr1, tr3, tr4
            };
            string actual = "";

            //act
            actualList.Sort();
            foreach (BuyTransaction item in actualList)
            {
                actual += $"\n{item.Product.Name}{item.ID}";
            }

            //assert
            Assert.AreEqual(expectedList, actualList, $"desc: \nactual:{actual}\nexpected:{expected}");
        }
Exemple #28
0
        public void BuyTransaction_UndoProductPurchase_Success()
        {
            const decimal amount  = 10;
            Product       product = Substitute.For <Product>("Milk", amount);
            User          user    = Substitute.For <User>(userArgs);

            user.Balance = amount;

            BuyTransaction transaction = new BuyTransaction(user, product);

            transaction.Execute();
            transaction.Undo();

            Assert.That(transaction.Undone, Is.True);
            Assert.That(user.Balance, Is.EqualTo(amount));
        }
Exemple #29
0
        public void UndoTransaction_UndoTransaction_Success()
        {
            const decimal productPrice  = 10;
            BarcodeSystem barcodeSystem = Substitute.For <BarcodeSystem>(log);
            User          user          = Substitute.For <User>(userArgs);
            Product       product       = Substitute.For <Product>("Milk", productPrice);

            user.Balance = productPrice;

            BuyTransaction transaction = barcodeSystem.BuyProduct(user, product);

            barcodeSystem.UndoTransaction(transaction);

            Assert.That(transaction.Undone, Is.True);
            Assert.That(user.Balance, Is.EqualTo(productPrice));
        }
Exemple #30
0
        public void ToString_BuyTransAction_ShouldReturnString(string desc)
        {
            //arrange
            User           user   = new User();
            Product        A      = new Product(id: 1, name: "A ", price: 10);
            DateTime       date   = Convert.ToDateTime("1 / 1 / 2020");
            Guid           id     = Guid.NewGuid();
            decimal        amount = 20;
            BuyTransaction tr     = new BuyTransaction(user: user, product: A, date: date, id: id, amount: amount);

            string expected = $"{date};{id};Buy;{user};{A};{amount}";
            //act
            string actual = tr.ToString();

            //assert
            Assert.AreEqual(expected, actual, desc);
        }