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."); }
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)); }
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."); }