Пример #1
0
        public void TestCalculateAccountEquity()
        {
            List <AccountShare> shares;
            bool noQuoteError;
            var  equity = WalletManager.CalculateAccountEquityWithShares(conn, accountShared, accountSharedOwner.ID,
                                                                         Contract.Util.BL.QuoteStorage.Instance.ReceiveAllData(),
                                                                         out shares, out noQuoteError);

            Assert.Greater(equity, 0, "CalculateAccountEquityWithShares() - equity должна быть больше 0");
            Assert.AreEqual(2, shares.Count, "CalculateAccountEquityWithShares() - должно быть два владельца");
            var sumShare = shares.Sum(s => s.ShareMoney);

            Assert.IsTrue(sumShare.RoughCompares(equity, 0.01M), "CalculateAccountEquityWithShares() - сумма средств {0} должна равняться балансу {1}",
                          sumShare, equity);
        }
Пример #2
0
        public void TestInvestInPAMM()
        {
            // PAMM-инвестор
            var pammInvestor = new PLATFORM_USER
            {
                Email            = "*****@*****.**",
                Login            = "******",
                Password         = "******",
                RegistrationDate = DateTime.Now,
                RoleMask         = (int)UserRole.Trader,
                Title            = "trader"
            };

            conn.PLATFORM_USER.Add(pammInvestor);
            conn.SaveChanges();
            var wallet = new WALLET
            {
                User     = pammInvestor.ID,
                Balance  = 160000,
                Currency = "USD",
                Password = "******"
            };

            conn.WALLET.Add(wallet);
            conn.SaveChanges();

            // посчитать, что было ДО инвестирования в ПАММ
            List <AccountShare> shares;
            bool noQuoteError;

            WalletManager.CalculateAccountEquityWithShares(conn, accountShared, accountSharedOwner.ID,
                                                           Contract.Util.BL.QuoteStorage.Instance.ReceiveAllData(),
                                                           out shares, out noQuoteError);

            // инвестировать в ПАММ
            const decimal amountToInvest = 10000;
            var           oldBalance     = accountShared.Balance;
            var           status         = walletManager.InvestInPAMM(ProtectedOperationContext.MakeServerSideContext(),
                                                                      pammInvestor.Login, accountShared.ID, amountToInvest);

            Assert.AreEqual(RequestStatus.OK, status, "InvestInPAMM - должно быть ОК");
            accountShared = conn.ACCOUNT.First(a => a.ID == accountShared.ID);

            var shouldBeBalance = oldBalance + amountToInvest;

            Assert.IsTrue(shouldBeBalance.RoughCompares(accountShared.Balance, 0.1M),
                          "InvestInPAMM - баланс счета должен увеличиться на сумму вложения");

            var newShares = conn.ACCOUNT_SHARE.Where(s => s.Account == accountShared.ID).ToList();

            Assert.AreEqual(shares.Count + 1, newShares.Count, "InvestInPAMM - добавился один пай");
            var sumSharesPercent = newShares.Sum(s => s.Share);

            Assert.IsTrue(100M.RoughCompares(sumSharesPercent, 0.000001M),
                          "InvestInPAMM - сумма паев осталась 100%");
            Assert.IsTrue(newShares.Any(s => s.ShareOwner == pammInvestor.ID),
                          "InvestInPAMM - новый владелец должен быть в списке пайщиков");
            Assert.IsTrue(conn.SUBSCRIPTION.Any(s => s.User == pammInvestor.ID),
                          "InvestInPAMM - должна появиться подписка");

            // инвестировать еще денег
            const decimal moreMoney = 145201.55M;

            status = walletManager.InvestInPAMM(ProtectedOperationContext.MakeServerSideContext(),
                                                pammInvestor.Login, accountShared.ID, moreMoney);
            Assert.AreEqual(RequestStatus.OK, status, "InvestInPAMM (повторно) - должно быть ОК");
            var updatedNewShares = conn.ACCOUNT_SHARE.Where(s => s.Account == accountShared.ID).ToList();

            Assert.AreEqual(newShares.Count, updatedNewShares.Count, "InvestInPAMM (повторно) - количество паев не должно меняться");
            sumSharesPercent = updatedNewShares.Sum(s => s.Share);
            Assert.IsTrue(100M.RoughCompares(sumSharesPercent, 0.000001M),
                          "InvestInPAMM (повторно) - сумма паев осталась 100%");

            status = walletManager.InvestInPAMM(ProtectedOperationContext.MakeServerSideContext(),
                                                pammInvestor.Login, accountShared.ID, moreMoney);
            Assert.AreEqual(RequestStatus.MarginOrLeverageExceeded, status,
                            "InvestInPAMM (превышение баланса) - должно быть MarginOrLeverageExceeded");

            // вывести из ПАММа кусочек
            const decimal withdrawnMoney   = 50.25M;
            var           balanceBeforeWth = conn.WALLET.First(w => w.User == pammInvestor.ID).Balance;

            status = walletManager.WithdrawFromPAMM(ProtectedOperationContext.MakeServerSideContext(),
                                                    pammInvestor.Login, accountShared.ID, withdrawnMoney, false);
            Assert.AreEqual(RequestStatus.OK, status, "InvestInPAMM (вывод средств) - должно быть OK");
            var sharesAfterWithdraw = conn.ACCOUNT_SHARE.Where(s => s.Account == accountShared.ID).ToList();
            var balanceAfterWth     = conn.WALLET.First(w => w.User == pammInvestor.ID).Balance;

            Assert.IsTrue(balanceBeforeWth.RoughCompares(balanceAfterWth - withdrawnMoney, 0.005M),
                          "баланс должен увеличиться на сумму вывода");
            Assert.AreEqual(updatedNewShares.Count, sharesAfterWithdraw.Count,
                            "InvestInPAMM (вывод средств) - количество паёв не должно измениться");
            Assert.IsTrue(conn.SUBSCRIPTION.Any(s => s.User == pammInvestor.ID),
                          "InvestInPAMM (вывод средств) - должна остаться подписка");

            // попробовать вывести слишком много
            status = walletManager.WithdrawFromPAMM(ProtectedOperationContext.MakeServerSideContext(),
                                                    pammInvestor.Login, accountShared.ID, 1000000, false);
            Assert.AreEqual(RequestStatus.BadRequest, status,
                            "InvestInPAMM (вывод средств) - должно быть BadRequest");

            // вывести остаток
            status = walletManager.WithdrawFromPAMM(ProtectedOperationContext.MakeServerSideContext(),
                                                    pammInvestor.Login, accountShared.ID, 0, true);
            Assert.AreEqual(RequestStatus.OK, status, "InvestInPAMM (вывод всех средств) - должно быть OK");
            Assert.IsFalse(conn.SUBSCRIPTION.Any(s => s.User == pammInvestor.ID),
                           "InvestInPAMM (вывод всех средств) - должна удалиться подписка");
            Assert.IsFalse(conn.ACCOUNT_SHARE.Any(s => s.ShareOwner == pammInvestor.ID),
                           "InvestInPAMM (вывод всех средств) - должна удалиться долька нашего пайщика");
        }