Example #1
0
        public IHttpActionResult SendMoneyToOthers(Money money, string toUsername, string fromUsername)
        {
            //initialize
            Currency usd = new Currency("USD", (decimal)1.0);
            Currency eur = new Currency("EUR", (decimal)1.5);
            Currency php = new Currency("PHP", (decimal)0.02);

            _currencyRepository.Save(usd);
            _currencyRepository.Save(eur);
            _currencyRepository.Save(php);

            // sender initialize
            Balance myBalance = new Balance();

            myBalance.AddMoney(new Money(usd, 20));
            myBalance.AddMoney(new Money(eur, 100));

            // recipient initialize
            Balance toBalance = new Balance();

            toBalance.AddMoney(new Money(usd, 0));
            toBalance.AddMoney(new Money(eur, 0));

            //Send Money
            myBalance.ChargeMoney(money); //the input parameter
            toBalance.AddMoney(money);

            _userRepository.Save(new User(fromUsername, myBalance));
            _userRepository.Save(new User(toUsername, toBalance));

            return(Ok());
        }
Example #2
0
        public IHttpActionResult StoreAndExchangeMoney(Money moneyFrom, string username)
        {
            //initialize
            Currency usd = new Currency("USD", (decimal)1.0);
            Currency eur = new Currency("EUR", (decimal)1.5);
            Currency php = new Currency("PHP", (decimal)0.02);

            _currencyRepository.Save(usd);
            _currencyRepository.Save(eur);
            _currencyRepository.Save(php);

            // initialize
            Balance myBalance = new Balance();

            myBalance.AddMoney(new Money(usd, 20));
            myBalance.AddMoney(new Money(eur, 100));
            myBalance.AddMoney(new Money(php, 0));


            //change to PHP
            myBalance.Exchange(moneyFrom, php);

            _userRepository.Save(new User(username, myBalance));

            return(Ok());
        }
Example #3
0
        public IHttpActionResult GetMyBalance(string username)
        {
            //initialize
            Currency usd = new Currency("USD", (decimal)1.0);
            Currency eur = new Currency("EUR", (decimal)1.5);
            Currency php = new Currency("PHP", (decimal)0.02);

            _currencyRepository.Save(usd);
            _currencyRepository.Save(eur);
            _currencyRepository.Save(php);

            // initialize
            Balance myBalance = new Balance();

            myBalance.AddMoney(new Money(usd, 20));
            myBalance.AddMoney(new Money(eur, 100));
            myBalance.AddMoney(new Money(php, 0));

            _userRepository.Save(new User(username, myBalance));

            // get balance
            var user = _userRepository.FindByUsername(username);

            var result = user.GetBalance()["php"];

            return(Ok(result));
        }
Example #4
0
        public void When_AddMoney_Then_ShouldReturn_ExpectedValue(decimal input1, decimal input2, decimal expected)
        {
            var balance = new Balance();

            balance.AddMoney(new Money(input1, new Currency()));
            balance.AddMoney(new Money(input2, new Currency()));

            balance.Amount.ShouldBe(expected);
        }
Example #5
0
        public void Init()
        {
            _currencyInPeso   = new Currency("Php", 1.0M);
            _currencyInDollar = new Currency("USD", 0.3M);
            _currencyInAU     = new Currency("AUD", 0.4M);

            addedMoney1 = new Money(_currencyInPeso, 500M);
            addedMoney2 = new Money(_currencyInPeso, 500M);
            addedMoney3 = new Money(_currencyInDollar, 900);

            balance = new Balance();
            balance.AddMoney(addedMoney1);
            balance.AddMoney(addedMoney2);
            balance.AddMoney(addedMoney3);
        }
Example #6
0
        public void When_Exhanging_Money()
        {
            var fixture     = new Fixture();
            var userId      = 1;
            var currencyId  = 1;
            var currencyId2 = 2;

            var currencyResult1 = new Currency(currencyId, "USD", (decimal)1);
            var currencyResult  = new Currency(currencyId, "EUR", (decimal)2);
            var balance         = new Balance();

            balance.AddMoney(new Money(currencyResult, 10));
            var dataResult = userRepository.Add(new User(userId, "test", balance));

            var param = new ExchangeMoney()
            {
                FromCurrencyId = currencyId, ToCurrencyId = 2, Amount = 10
            };

            var user = _userDataManager.Setup(x => x.GetUserBalance(userId, currencyId)).Returns(dataResult);

            _userDataManager.Setup(x => x.GetCurrency(currencyId)).Returns(currencyResult1);
            _userDataManager.Setup(x => x.GetCurrency(currencyId2)).Returns(currencyResult);


            _userDataManager.Setup(x => x.UpdateUserBalance(dataResult));

            var result = userRepository.ExchangeMoney(param, userId);

            Assert.IsNotNull(result);
        }
Example #7
0
        public async Task User_get_balance()
        {
            var userId  = 1;
            var balance = new Balance();

            balance.AddMoney(new Money(new Currency("Php", 0.45M), 500));
            var user = new User("user101", balance)
            {
                Id = userId
            };

            var iMapperMock  = new Mock <IMapper>();
            var userRepo     = new Mock <IUserRepository>();
            var currencyRepo = new Mock <IRepository <Currency> >();

            userRepo.Setup(x => x.GetByIdIncludingBalanceAsync(userId)).ReturnsAsync(user);

            var controller = new UserController(userRepo.Object, iMapperMock.Object, currencyRepo.Object);

            var result = await controller.GetBalance(userId);

            var contentResult = result as OkObjectResult;
            var data          = contentResult.Value as IList <GetUserBalance>;

            Assert.IsNotNull(result);
            Assert.AreEqual(StatusCodes.Status200OK, contentResult.StatusCode);
            Assert.IsNotNull(data);
            Assert.AreEqual(500, data.FirstOrDefault().Amount);
        }
Example #8
0
        public void When_Sending_Money()
        {
            var fixture    = new Fixture();
            var userId     = 1;
            var currencyId = 1;

            var currencyResult = new Currency(currencyId, "USD", (decimal)1);
            var balance        = new Balance();

            balance.AddMoney(new Money(currencyResult, 10));
            var user = userRepository.Add(new User(userId, "test", balance));

            var param = new SendMoney()
            {
                CurrencyId = 1, ToUserId = 1, Amount = 10
            };

            var dataResult = _userDataManager.Setup(x => x.GetUserBalance(userId, currencyId)).Returns(user);
            var currency   = _userDataManager.Setup(x => x.GetCurrency(currencyId)).Returns(currencyResult);

            _userDataManager.Setup(x => x.UpdateUserBalance(user));

            var result = userRepository.SendMoney(param, userId);

            Assert.IsNotNull(result);
            Assert.AreEqual(true, result);
        }
Example #9
0
        public void Exhance_money_will_increment_currency_balance()
        {
            var mybalance = new Balance();

            mybalance.AddMoney(addedMoney1);
            mybalance.AddMoney(addedMoney3);

            mybalance.Exchange(new Money(_currencyInPeso, 100), _currencyInDollar);
            moneyInBalance = mybalance.GetAllMoney();
            var moneyInPeso   = moneyInBalance.FirstOrDefault(c => c.Currency == _currencyInPeso).Amount;
            var moneyInDollar = moneyInBalance.FirstOrDefault(c => c.Currency == _currencyInDollar).Amount;

            Assert.IsTrue(moneyInBalance.Count > 0);
            Assert.AreEqual(400M, moneyInPeso);
            Assert.IsTrue(moneyInDollar > 900M);
        }
        public User GetUserBalance(int userId, int currencyId)
        {
            string query = @"SELECT U.UserId,U.UserName,b.Amount,C.CurrencyId,C.Name Currency,C.Ratio
                            FROM dbo.[User] U
                            INNER JOIN dbo.[Balance] b ON b.UserId = U.UserId
                            INNER JOIN dbo.[Currency] c ON c.CurrencyId = b.CurrencyId
                            WHERE U.UserId = @UserId and b.CurrencyId = @CurrencyId";

            var userBalance = new List <DataModel.UserBalance>();

            using (var connection = CreateConnection())
            {
                userBalance = connection.Query <DataModel.UserBalance>(query, new { UserId = userId, CurrencyId = currencyId }).ToList();
            }
            var user = GetUserInfo(userId);

            var balance = new Balance();

            if (userBalance != null && userBalance.Count() > 0)
            {
                foreach (var item in userBalance)
                {
                    balance.AddMoney(
                        new Money(new Currency(item.CurrencyId, item.Currency, item.Ratio), item.Amount));
                }
            }

            return(new User(user.UserId, user.Username, balance));
        }
Example #11
0
        public async Task <User> GetUserAsync(string username)
        {
            Balance balance = new Balance();

            var userEntity = await _unitOfWork.RepositoryFor <EntityUser>().Get(u => u.Username == username);

            var userBalance = await _unitOfWork.RepositoryFor <UserBalance>().GetMany(u => u.UserId == userEntity.Id);

            var currencies = await _unitOfWork.RepositoryFor <Currency>().GetAll();

            /* Populate balance from DB */
            if (userBalance.Any())
            {
                foreach (var item in userBalance)
                {
                    var currency = currencies.SingleOrDefault(c => c.Id == item.CurrencyId);
                    balance.AddMoney(new Money()
                    {
                        Currency = currency,
                        Amount   = item.Amount
                    });
                }
            }

            return(new User()
            {
                Id = userEntity.Id, Username = userEntity.Username, Balance = balance
            });
        }
Example #12
0
        public void AddMoney_Should_Be_Added_To_Balance()
        {
            Balance balance = new Balance();

            balance.AddMoney(_200Usd);

            var monies = balance.GetAllMonies();

            monies.Should().NotBeNull();
            monies.Count.Should().BeGreaterThan(0);
        }
Example #13
0
        public void ChargeMoney_Should_Be_Deducted_To_Balance()
        {
            Balance balance = new Balance();

            balance.AddMoney(_500Php);

            balance.ChargeMoney(_150Php);

            var monies        = balance.GetAllMonies();
            var newPhpBalance = monies.Find(c => c.Currency == _php);

            newPhpBalance.Amount.Should().Be(350);
        }
Example #14
0
        public async Task Exhange_money_return_ok_response_when_no_error_occured()
        {
            var userId   = 1;
            var currency = new Currency("Php", 0.45M)
            {
                Id = 1
            };
            var currency2 = new Currency("USD", 0.45M)
            {
                Id = 2
            };

            var balance = new Balance();

            balance.AddMoney(new Money(currency, 500));

            var user = new User("user101", balance)
            {
                Id = userId
            };
            var user2 = new User("user102", balance)
            {
                Id = 2
            };

            var iMapperMock = new Mock <IMapper>();

            var userRepo = new Mock <IUserRepository>();

            userRepo.Setup(x => x.GetByIdIncludingBalanceAsync(userId)).ReturnsAsync(user);
            userRepo.Setup(x => x.GetByIdIncludingBalanceAsync(2)).ReturnsAsync(user2);
            userRepo.Setup(x => x.UpdateBalanceAsync(user)).ReturnsAsync(true);

            var currencyRepo = new Mock <IRepository <Currency> >();

            currencyRepo.Setup(x => x.GetAsync(1)).ReturnsAsync(currency);
            currencyRepo.Setup(x => x.GetAsync(2)).ReturnsAsync(currency2);


            var controller = new UserController(userRepo.Object, iMapperMock.Object, currencyRepo.Object);

            var result = await controller.ExchangeMoney(userId, new ExchangeMoney()
            {
                FromCurrencyId = 1, Amount = 50, ToCurrencyId = 2
            });

            var contentResult = result as OkObjectResult;

            Assert.IsNotNull(result);
            Assert.AreEqual(StatusCodes.Status200OK, contentResult.StatusCode);
        }
Example #15
0
        public void ExchangeMoney_Should_Be_Converted_To_ExchangeCurrency()
        {
            Balance balance = new Balance();

            balance.AddMoney(_500Php);

            balance.Exchange(_150Php, _usd);

            var monies        = balance.GetAllMonies();
            var newPhpBalance = monies.Find(c => c.Currency == _php);
            var newUsdBalance = monies.Find(c => c.Currency == _usd);

            newPhpBalance.Amount.Should().Be(350);
            newUsdBalance.Amount.Should().Be(3);
        }
Example #16
0
        public void ValidateMoney_Should_Block_Transaction_If_No_Enough_Money()
        {
            Balance balance = new Balance();

            balance.AddMoney(_150Php);

            try
            {
                balance.ChargeMoney(_500Php);
            }
            catch (Exception e)
            {
                e.Message.Should().Be("Insufficient amount in balance!");
            }
        }
Example #17
0
        public async Task Exchange_money_return_bad_response_when_validation_failed()
        {
            var userId   = 1;
            var currency = new Currency("Php", 0.45M)
            {
                Id = 1
            };
            var currency2 = new Currency("USD", 0.45M)
            {
                Id = 2
            };


            var balance = new Balance();

            balance.AddMoney(new Money(currency, 500));
            var user = new User("user101", balance)
            {
                Id = userId
            };

            var iMapperMock = new Mock <IMapper>();

            var userRepo = new Mock <IUserRepository>();

            userRepo.Setup(x => x.GetByIdIncludingBalanceAsync(userId)).ReturnsAsync(user);
            userRepo.Setup(x => x.UpdateBalanceAsync(user)).ReturnsAsync(false);

            var currencyRepo = new Mock <IRepository <Currency> >();

            currencyRepo.Setup(x => x.GetAsync(1)).ReturnsAsync(currency);
            currencyRepo.Setup(x => x.GetAsync(2)).ReturnsAsync(currency2);

            var controller = new UserController(userRepo.Object, iMapperMock.Object, currencyRepo.Object);

            controller.ModelState.AddModelError("FromCurrencyId", "Required");

            var errorResult = await controller.ExchangeMoney(userId, new ExchangeMoney()
            {
                FromCurrencyId = 1, Amount = 50, ToCurrencyId = 2
            });

            var errorContentResult = errorResult as BadRequestObjectResult;

            Assert.IsNotNull(errorResult);
            Assert.AreEqual(StatusCodes.Status400BadRequest, errorContentResult.StatusCode);
        }
Example #18
0
        public async Task Add_money_to_balance_return_ok_response_when_no_error_occured()
        {
            var userId   = 1;
            var currency = new Currency("Php", 0.45M)
            {
                Id = 2
            };

            var balance = new Balance();

            balance.AddMoney(new Money(currency, 500));
            var user = new User("user101", balance)
            {
                Id = userId
            };

            var iMapperMock = new Mock <IMapper>();

            var userRepo = new Mock <IUserRepository>();

            userRepo.Setup(x => x.GetByIdIncludingBalanceAsync(userId)).ReturnsAsync(user);
            userRepo.Setup(x => x.UpdateBalanceAsync(user)).ReturnsAsync(true);

            var currencyRepo = new Mock <IRepository <Currency> >();

            currencyRepo.Setup(x => x.GetAsync(2)).ReturnsAsync(currency);

            var controller = new UserController(userRepo.Object, iMapperMock.Object, currencyRepo.Object);

            var errorResult = await controller.AddMoneyToBalance(userId, new AddMoneyToBalance()
            {
                CurrencyId = 2, Amount = 500
            });

            var errorContentResult = errorResult as OkResult;

            Assert.IsNotNull(errorResult);
            Assert.AreEqual(StatusCodes.Status200OK, errorContentResult.StatusCode);
        }
Example #19
0
        public async Task <User> GetByIdIncludingBalanceAsync(int id)
        {
            string sql = @"SELECT        dbo.Balance.Id, dbo.Balance.UserId,dbo.[User].Username,dbo.Balance.CurrencyId, dbo.Currency.Name AS [CurrencyName], dbo.Balance.Amount, dbo.Currency.Ratio
                            FROM            dbo.Balance INNER JOIN
                                dbo.Currency ON dbo.Balance.CurrencyId = dbo.Currency.Id INNER JOIN
                                      dbo.[User] ON dbo.Balance.UserId = dbo.[User].Id
                                            WHERE UserId=@id";

            IEnumerable <GetUserBalance> result = null;

            var userInfo = await GetAsync(id);

            using (var connection = CreateConnection())
            {
                result = await connection.QueryAsync <GetUserBalance>(sql, new { id = id });
            }

            var balance = new Balance();

            if (result != null && result.Count() > 0)
            {
                foreach (var item in result)
                {
                    balance.AddMoney(
                        new Money(new Currency(item.CurrencyName, item.Ratio)
                    {
                        Id = item.CurrencyId
                    }, item.Amount));
                }
            }

            return(new User(userInfo.Username, balance)
            {
                Id = id
            });
        }
Example #20
0
 private void OnMouseDown()
 {
     balance.AddMoney(this.baseProfit);
 }