Esempio n. 1
0
        public void Test_Transaction_SplitDetails_UserObsolete()
        {
            var(account, _)          = this.context.GenerateAccount();
            var(splitwiseAccount, _) = this.context.GenerateAccount(AccountType.Splitwise);
            var category = this.context.GenerateCategory();

            var user1 = this.SplitwiseContextMock.GenerateUser(1, "User1");

            var transaction = this.context.GenerateTransaction(
                account,
                TransactionType.Expense,
                "Description",
                DateTime.Today.ToLocalDate(),
                -50,
                category,
                splitDetails: new List <SplitDetailEntity>
            {
                new SplitDetailEntity
                {
                    SplitwiseUserId = user1.Id,
                    Amount          = 20,
                },
                new SplitDetailEntity
                {
                    SplitwiseUserId = 2,
                    Amount          = 15,
                },
            });

            this.context.SaveChanges();

            Wv8Assert.Throws <IsObsoleteException>(
                () => this.TransactionProcessor.ProcessAll(),
                "Splitwise user is obsolete.");
        }
Esempio n. 2
0
        public void Test_ImportFromSplitwise_Update_NotPaid_NoShare()
        {
            this.GenerateSplitwiseUser();

            var splitwiseTransaction = this.context.GenerateSplitwiseTransaction(
                1,
                "Description",
                DateTime.Today.ToLocalDate(),
                false,
                DateTime.UtcNow.AddHours(-1),
                0,
                10);

            // Add update to expense where user is no longer part of it.
            var expense = this.SplitwiseContextMock.GenerateExpense(
                1,
                "Description",
                DateTime.Today.ToLocalDate(),
                false,
                DateTime.UtcNow,
                0,
                0);

            this.SplitwiseManager.ImportFromSplitwise();

            this.RefreshContext();

            Wv8Assert.IsNone(
                this.context.SplitwiseTransactions.SingleOrNone(st => st.Id == splitwiseTransaction.Id));
        }
Esempio n. 3
0
        public void Test_ImportFromSplitwise_Removed_Paid()
        {
            // Add processed Splitwise transaction to database.
            this.GenerateSplitwiseUser();
            var user2 = this.SplitwiseContextMock.GenerateUser(2, "USER2");
            var user3 = this.SplitwiseContextMock.GenerateUser(3, "USER3");

            var(account, _) = this.context.GenerateAccount();
            var split1 = this.context.GenerateSplitDetail(user2.Id, 15);
            var split2 = this.context.GenerateSplitDetail(user3.Id, 25);
            var splits = new List <SplitDetailEntity> {
                split1, split2
            };

            var(splitwiseAccount, _) = this.context.GenerateAccount(AccountType.Splitwise);
            var category             = this.context.GenerateCategory();
            var splitwiseTransaction = this.context.GenerateSplitwiseTransaction(
                1,
                updatedAt: DateTime.Now.AddDays(-7),
                paidAmount: 50,
                personalAmount: 10,
                date: DateTime.Today.ToLocalDate(),
                description: "Description",
                imported: true,
                splits: splits);

            this.context.GenerateTransaction(
                splitwiseAccount,
                TransactionType.Expense,
                splitwiseTransaction.Description,
                splitwiseTransaction.Date,
                splitwiseTransaction.PaidAmount,
                category,
                splitwiseTransaction: splitwiseTransaction,
                splitDetails: splits);
            this.SaveAndProcess();

            // Add new version to mock. Deleted.
            var expense = this.SplitwiseContextMock.GenerateExpense(
                1,
                updatedAt: DateTime.UtcNow,
                paidAmount: splitwiseTransaction.PaidAmount,
                personalAmount: splitwiseTransaction.PersonalAmount,
                date: splitwiseTransaction.Date,
                description: splitwiseTransaction.Description,
                splits: splitwiseTransaction.SplitDetails.Select(sd => sd.AsSplit()).ToList(),
                isDeleted: true);

            this.SplitwiseManager.ImportFromSplitwise();

            // Verify revert
            this.RefreshContext();
            var accountBalance = this.context.Accounts.Single(a => a.Id == splitwiseAccount.Id).CurrentBalance;

            Assert.Equal(0, accountBalance);

            splitwiseTransaction = this.context.SplitwiseTransactions.Single(st => st.Id == splitwiseTransaction.Id);
            Assert.True(splitwiseTransaction.IsDeleted);
            Assert.False(splitwiseTransaction.Imported);

            Wv8Assert.IsNone(this.context.Transactions.SingleOrNone(t => t.SplitwiseTransactionId == splitwiseTransaction.Id));
        }
        public void Test_CreateRecurringTransaction_SplitwiseSplits()
        {
            this.SplitwiseContextMock.GenerateUser(1, "Wouter", "van Acht");
            this.SplitwiseContextMock.GenerateUser(2, "Jeroen");

            var(account, _) = this.context.GenerateAccount();
            var splitwiseAccount = this.context.GenerateAccount(AccountType.Splitwise);
            var category         = this.context.GenerateCategory();

            this.context.SaveChanges();

            var input = new InputRecurringTransaction
            {
                AccountId          = account.Id,
                Description        = "Transaction",
                StartDateString    = DateTime.Today.ToDateString(),
                EndDateString      = null,
                Amount             = -300,
                CategoryId         = category.Id,
                ReceivingAccountId = Maybe <int> .None,
                NeedsConfirmation  = false,
                Interval           = 1,
                IntervalUnit       = IntervalUnit.Months,
                PaymentRequests    = new List <InputPaymentRequest>(),
                SplitwiseSplits    = new List <InputSplitwiseSplit>
                {
                    new InputSplitwiseSplit
                    {
                        Amount = 100,
                        UserId = 1,
                    },
                    new InputSplitwiseSplit
                    {
                        Amount = 150,
                        UserId = 2,
                    },
                },
            };

            var recurringTransaction = this.RecurringTransactionManager.CreateRecurringTransaction(input);

            this.RefreshContext();

            var transaction = this.context.Transactions.IncludeAll()
                              .Single(t => t.RecurringTransactionId == recurringTransaction.Id);
            var expense =
                this.SplitwiseContextMock.Expenses.Single(e => e.Id == transaction.SplitwiseTransaction.Id);

            account = this.context.Accounts.GetEntity(account.Id);

            Wv8Assert.IsSome(transaction.SplitwiseTransaction.ToMaybe());
            Assert.True(transaction.SplitwiseTransaction.Imported);
            Assert.Equal(250, transaction.SplitwiseTransaction.OwedByOthers);
            Assert.Equal(50, transaction.SplitwiseTransaction.PersonalAmount);
            Assert.Equal(300, transaction.SplitwiseTransaction.PaidAmount);
            Assert.Equal(-50, transaction.PersonalAmount);
            Assert.Equal(-50, recurringTransaction.PersonalAmount);

            Assert.Equal(transaction.SplitwiseTransactionId.Value, expense.Id);
            Assert.Equal(transaction.SplitwiseTransaction.PaidAmount, expense.PaidAmount);
            Assert.Equal(transaction.SplitwiseTransaction.PersonalAmount, expense.PersonalAmount);
            Assert.Equal(transaction.Date, expense.Date);
            Assert.False(expense.IsDeleted);

            Assert.Equal(2, recurringTransaction.SplitDetails.Count);
            Assert.Contains(recurringTransaction.SplitDetails, sd => sd.SplitwiseUserId == 1 && sd.Amount == 100);
            Assert.Contains(recurringTransaction.SplitDetails, sd => sd.SplitwiseUserId == 2 && sd.Amount == 150);
            Assert.Equal(2, transaction.SplitDetails.Count);
            Assert.Contains(transaction.SplitDetails, sd => sd.SplitwiseUserId == 1 && sd.Amount == 100);
            Assert.Contains(transaction.SplitDetails, sd => sd.SplitwiseUserId == 2 && sd.Amount == 150);

            Assert.Equal(-300, account.CurrentBalance);
        }
        public void Test_CreateRecurringTransaction_SplitwiseValidation()
        {
            var(account, _) = this.context.GenerateAccount();
            var splitwiseAccount = this.context.GenerateAccount(AccountType.Splitwise);
            var category         = this.context.GenerateCategory();

            var splitwiseUser = this.SplitwiseContextMock.GenerateUser(1, "User1");

            this.context.SaveChanges();

            // Wrong transaction type
            var input = this.GetInputRecurringTransaction(
                account.Id,
                TransactionType.Income,
                categoryId: category.Id,
                amount: 50,
                splitwiseSplits: new InputSplitwiseSplit {
                Amount = 25, UserId = 1
            }.Singleton());

            Wv8Assert.Throws <ValidationException>(
                () => this.RecurringTransactionManager.CreateRecurringTransaction(input),
                "Payment requests and Splitwise splits can only be specified on expenses.");

            // Splits greater than amount
            input.Amount = -10;
            Wv8Assert.Throws <ValidationException>(
                () => this.RecurringTransactionManager.CreateRecurringTransaction(input),
                "The amount split can not exceed the total amount of the transaction.");

            input.Amount = -100;

            // Split without amount
            input.SplitwiseSplits = new InputSplitwiseSplit {
                Amount = 0, UserId = 1
            }.Singleton();
            Wv8Assert.Throws <ValidationException>(
                () => this.RecurringTransactionManager.CreateRecurringTransaction(input),
                "Splits must have an amount greater than 0.");

            // 2 splits for same user
            input.SplitwiseSplits = new List <InputSplitwiseSplit>
            {
                new InputSplitwiseSplit {
                    Amount = 10, UserId = 1
                },
                new InputSplitwiseSplit {
                    Amount = 20, UserId = 1
                },
            };
            Wv8Assert.Throws <ValidationException>(
                () => this.RecurringTransactionManager.CreateRecurringTransaction(input),
                "A user can only be linked to a single split.");

            // Unknown Splitwise user
            input.SplitwiseSplits = new InputSplitwiseSplit {
                Amount = 10, UserId = 2
            }.Singleton();
            Wv8Assert.Throws <ValidationException>(
                () => this.RecurringTransactionManager.CreateRecurringTransaction(input),
                "Unknown Splitwise user(s) specified.");
        }