public void Will_populate_actual_bank_record_cells() { // Arrange var actual_bank_record = new ActualBankRecord { Date = new DateTime(year: 2018, month: 7, day: 1), Type = "Chq", Description = "New description which will overwrite what's normally there.", Amount = 6666.66, LastTransactionMarker = ReconConsts.LastOnlineTransaction + "x" }; var cells = _spreadsheet.Current_cells(TestSheetNames.Bank); var last_row_number = _spreadsheet.Last_row_number(TestSheetNames.Bank); var previous_record = new ActualBankRecord(); previous_record.Read_from_spreadsheet_row(_spreadsheet.Read_last_row(TestSheetNames.Bank)); // Act actual_bank_record.Populate_spreadsheet_row(cells, last_row_number); var new_row = _spreadsheet.Read_last_row(TestSheetNames.Bank); // Assert Assert.AreEqual(actual_bank_record.LastTransactionMarker, (String)new_row.Read_cell(ActualBankRecord.LastTransactionMarkerSpreadsheetIndex)); Assert.AreEqual(actual_bank_record.Date, DateTime.FromOADate((double)new_row.Read_cell(ActualBankRecord.DateSpreadsheetIndex))); Assert.AreEqual(actual_bank_record.Type, (String)new_row.Read_cell(ActualBankRecord.TypeSpreadsheetIndex)); Assert.AreEqual(actual_bank_record.Description, (String)new_row.Read_cell(ActualBankRecord.DescriptionSpreadsheetIndex)); Assert.AreEqual(actual_bank_record.Amount, (Double)new_row.Read_cell(ActualBankRecord.AmountSpreadsheetIndex)); // Clean up previous_record.Populate_spreadsheet_row(cells, last_row_number); }
public void Will_create_new_expenses_record_to_match_balance() { // Arrange var income_file_io = new Mock <IFileIO <ExpectedIncomeRecord> >(); var income_records = new List <ExpectedIncomeRecord>(); income_file_io.Setup(x => x.Load(It.IsAny <List <string> >(), null)).Returns(income_records); var income_file = new CSVFile <ExpectedIncomeRecord>(income_file_io.Object); income_file.Load(); var expected_income_file = new ExpectedIncomeFile(income_file); var actual_bank_record = new ActualBankRecord { Date = DateTime.Today, Amount = 50 }; double balance = actual_bank_record.Amount - 10; // Act expected_income_file.Create_new_expenses_record_to_match_balance(actual_bank_record, balance); // Assert Assert.AreEqual(1, expected_income_file.File.Records.Count); Assert.AreEqual(ReconConsts.UnknownExpense, expected_income_file.File.Records[0].Description); Assert.AreEqual(balance, expected_income_file.File.Records[0].Unreconciled_amount); Assert.AreEqual(actual_bank_record, expected_income_file.File.Records[0].Match); Assert.AreEqual(true, expected_income_file.File.Records[0].Matched); Assert.AreEqual(actual_bank_record.Date, expected_income_file.File.Records[0].Date); Assert.AreEqual(actual_bank_record.Date, expected_income_file.File.Records[0].Date_paid); Assert.AreEqual(actual_bank_record.Amount, expected_income_file.File.Records[0].Total_paid); Assert.AreEqual(Codes.Expenses, expected_income_file.File.Records[0].Code); }
public void M_WhenReconcilingExpenses_WillNotMatchOnASingleDifferentAmount() { // Arrange var mock_bank_and_bank_in_loader = new Mock <IBankAndBankInLoader>(); var expense_amount = 10.00; List <BankRecord> expected_in_rows = new List <BankRecord> { new BankRecord { Unreconciled_amount = expense_amount } }; var bank_in_file_io = new Mock <IFileIO <BankRecord> >(); bank_in_file_io.Setup(x => x.Load(It.IsAny <List <string> >(), null)).Returns(expected_in_rows); var bank_in_file = new CSVFile <BankRecord>(bank_in_file_io.Object); bank_in_file.Load(); ActualBankRecord expense_transaction = new ActualBankRecord { Amount = expense_amount - 1 }; var matcher = new BankAndBankInMatcher(this, new FakeSpreadsheetRepoFactory(), mock_bank_and_bank_in_loader.Object); // Act var result = matcher.Standby_find_expense_matches(expense_transaction, bank_in_file).ToList(); // Assert Assert.AreEqual(0, result.Count); }
public void When_copying_cred_card2_record_will_create_new_object() { // Arrange var original_date = DateTime.Today; var original_amount = 12.34; var original_description = "Description"; var original_type = "Type"; var actual_bank_record = new ActualBankRecord { Date = original_date, Amount = original_amount, Description = original_description, Type = original_type }; actual_bank_record.Update_source_line_for_output(','); var original_source_line = actual_bank_record.Source_line; // Act var copied_record = (ActualBankRecord)actual_bank_record.Copy(); copied_record.Date = copied_record.Date.AddDays(1); copied_record.Amount = copied_record.Amount + 1; copied_record.Description = copied_record.Description + "something else"; copied_record.Type = copied_record.Type + "something else"; copied_record.Update_source_line_for_output(','); // Assert Assert.AreEqual(original_date, actual_bank_record.Date); Assert.AreEqual(original_amount, actual_bank_record.Amount); Assert.AreEqual(original_description, actual_bank_record.Description); Assert.AreEqual(original_type, actual_bank_record.Type); Assert.AreEqual(original_source_line, actual_bank_record.Source_line); }
private void Match_records(ActualBankRecord source, BankRecord match) { match.Matched = true; source.Matched = true; match.Match = source; source.Match = match; }
public IEnumerable <IPotentialMatch> Find_expense_matches(ActualBankRecord source_record, ICSVFile <BankRecord> owned_file) { var generic_matcher = new MultipleAmountMatcher <ActualBankRecord, BankRecord>(); generic_matcher.DateTolerance = 200; return(generic_matcher.Find_matches(source_record, owned_file)); }
public void M_WhenMatchingSpecifiedRecords_AndMultipleMatchesExist_WillRemoveOriginalMatchesFromOwnedFile() { // Arrange var mock_bank_and_bank_in_loader = new Mock <IBankAndBankInLoader>(); var matcher = new BankAndBankInMatcher(this, new FakeSpreadsheetRepoFactory(), mock_bank_and_bank_in_loader.Object); var source_record = new ActualBankRecord { Date = DateTime.Today, Amount = 34.56, Match = null, Matched = false }; var bank_records = new List <BankRecord> { new BankRecord { Description = "Match 01", Unreconciled_amount = 20.22, Type = "Type" }, new BankRecord { Description = "Match 02", Unreconciled_amount = 30.33 }, new BankRecord { Description = "Match 02", Unreconciled_amount = 40.44 } }; var mock_bank_in_file_io = new Mock <IFileIO <BankRecord> >(); mock_bank_in_file_io.Setup(x => x.Load(It.IsAny <List <string> >(), null)).Returns(bank_records); var bank_in_file = new CSVFile <BankRecord>(mock_bank_in_file_io.Object); bank_in_file.Load(); var potential_matches = new List <IPotentialMatch> { new PotentialMatch { Actual_records = new List <ICSVRecord>() } }; potential_matches[0].Actual_records.Add(bank_records[0]); potential_matches[0].Actual_records.Add(bank_records[1]); potential_matches[0].Actual_records.Add(bank_records[2]); var index = 0; var record_for_matching = new RecordForMatching <ActualBankRecord>(source_record, potential_matches); foreach (var bank_record in bank_records) { Assert.IsTrue(bank_in_file.Records.Contains(bank_record)); } // Act matcher.Match_specified_records(record_for_matching, index, bank_in_file); // Assert foreach (var bank_record in bank_records) { Assert.IsFalse(bank_in_file.Records.Contains(bank_record)); } }
public void Can_cope_with_empty_balance() { // Arrange var actual_bank_record = new ActualBankRecord(); string csv_line = String.Format("06/03/2017,BAC,\"'99999999-BFGH\",261.40,,\"'Envelope\",\"'228822-99933422\","); // Act actual_bank_record.Load(csv_line); // Assert Assert.AreEqual(0, actual_bank_record.Balance); }
private IEnumerable <IPotentialMatch> Debug_find_expense_matches(ActualBankRecord source_record, ICSVFile <BankRecord> owned_file) { var result = new List <IPotentialMatch>(); var random_number_generator = new Random(); Add_set_of_overlapping_matches(random_number_generator, owned_file, result, 3); Add_set_of_overlapping_matches(random_number_generator, owned_file, result, 2); Add_set_of_overlapping_matches(random_number_generator, owned_file, result, 2); Add_set_of_overlapping_matches(random_number_generator, owned_file, result, 3); return(result); }
public void Should_be_able_to_cope_with_empty_input() { // Arrange var actual_bank_record = new ActualBankRecord(); string csv_line = String.Empty; // Act actual_bank_record.Load(csv_line); // Assert Assert.AreEqual(0, actual_bank_record.Amount); }
public void Can_cope_with_empty_description() { // Arrange var actual_bank_record = new ActualBankRecord(); string csv_line = String.Format("06/03/2017,BAC,,261.40,4273.63,\"'Envelope\",\"'228822-99933422\","); // Act actual_bank_record.Load(csv_line); // Assert Assert.AreEqual("", actual_bank_record.Description); }
public void Can_cope_with_empty_date() { // Arrange var actual_bank_record = new ActualBankRecord(); var expected_date = new DateTime(9999, 9, 9); string csv_line = String.Format(",BAC,\"'99999999-BFGH\",261.40,4273.63,\"'Envelope\",\"'228822-99933422\","); // Act actual_bank_record.Load(csv_line); // Assert Assert.AreEqual(expected_date, actual_bank_record.Date); }
public void Can_cope_with_bad_amount() { // Arrange var actual_bank_record = new ActualBankRecord(); var bad_amount = "not an amount"; string csv_line = String.Format("06/03/2017,BAC,\"'99999999-BFGH\",{0},4273.63,\"'Envelope\",\"'228822-99933422\",", bad_amount); // Act actual_bank_record.Load(csv_line); // Assert Assert.AreEqual(0, actual_bank_record.Amount); }
public void Commas_in_input_are_replaced_by_semi_colons() { // Arrange var actual_bank_record = new ActualBankRecord(); string text_containing_commas = "\"something, something, something else\""; string csv_line = String.Format("06/03/2017,BAC,{0},261.40,12.35,\"'Envelope\",\"'228822-99933422\",", text_containing_commas); // Act actual_bank_record.Load(csv_line); // Assert Assert.AreEqual("\"something; something; something else\"", actual_bank_record.Description); }
public void Can_read_balance_from_csv_without_pound_sign() { // Arrange var actual_bank_record = new ActualBankRecord(); var expected_amount = 4273.63; string csv_line = String.Format("06/03/2017,BAC,\"'99999999-BFGH\",261.40,{0},\"'Envelope\",\"'228822-99933422\",", expected_amount); // Act actual_bank_record.Load(csv_line); // Assert Assert.AreEqual(expected_amount, actual_bank_record.Balance); }
public void Can_read_description_from_csv() { // Arrange var actual_bank_record = new ActualBankRecord(); var expected_description = "\"'99999999-BFGH\""; string csv_line = String.Format("06/03/2017,BAC,{0},261.40,4273.63,\"'Envelope\",\"'228822-99933422\",", expected_description); // Act actual_bank_record.Load(csv_line); // Assert Assert.AreEqual(expected_description, actual_bank_record.Description); }
public void Can_cope_with_input_containing_commas_preceded_by_spaces() { // Arrange var actual_bank_record = new ActualBankRecord(); double expected_balance = 12.35; string text_containing_commas = "\"'0363 23MAR17 C ,TFL.GOV.UK/CP ,TFL TRAVEL CH GB\""; string csv_line = String.Format("06/03/2017,BAC,{0},261.40,{1},\"'Envelope\",\"'228822-99933422\",", text_containing_commas, expected_balance); // Act actual_bank_record.Load(csv_line); // Assert Assert.AreEqual(expected_balance, actual_bank_record.Balance); }
public void M_WhenMatchingSpecifiedRecords_WillUpdateExpectedIncomeRecordForEachOriginalMatch() { // Arrange var mock_bank_and_bank_in_loader = new Mock <IBankAndBankInLoader>(); var mock_owned_file = new Mock <ICSVFile <BankRecord> >(); mock_owned_file.Setup(x => x.Records).Returns(new List <BankRecord>()); var matcher = new BankAndBankInMatcher(this, new FakeSpreadsheetRepoFactory(), mock_bank_and_bank_in_loader.Object); var desc0 = "Source 01"; var source_record = new ActualBankRecord { Date = DateTime.Today.AddDays(10), Amount = 40.44, Description = desc0 }; var desc1 = "Match 01"; var desc2 = "Match 02"; var amount1 = 20.22; var amount2 = 30.33; var date1 = DateTime.Today; var date2 = DateTime.Today.AddDays(1); var potential_matches = new List <IPotentialMatch> { new PotentialMatch { Actual_records = new List <ICSVRecord> { new BankRecord { Description = desc1, Unreconciled_amount = amount1, Date = date1 }, new BankRecord { Description = desc2, Unreconciled_amount = amount2, Date = date2 } } } }; var index = 0; var record_for_matching = new RecordForMatching <ActualBankRecord>(source_record, potential_matches); Assert.AreEqual(0, matcher.MatchedExpectedIncomeRecords.Count); // Act matcher.Match_specified_records(record_for_matching, index, mock_owned_file.Object); // Assert mock_bank_and_bank_in_loader.Verify(x => x.Update_expected_income_record_when_matched( It.Is <ICSVRecord>(y => y.Description == desc0), It.Is <ICSVRecord>(y => y.Description == desc1))); mock_bank_and_bank_in_loader.Verify(x => x.Update_expected_income_record_when_matched( It.Is <ICSVRecord>(y => y.Description == desc0), It.Is <ICSVRecord>(y => y.Description == desc2))); }
public void Can_read_date_from_csv() { // Arrange var actual_bank_record = new ActualBankRecord(); string expected_date_as_string = "06/03/2017"; string csv_line = string.Format("{0},BAC,\"'99999999-BFGH\",261.40,4273.63,\"'Envelope\",\"'228822-99933422\",", expected_date_as_string); var expected_date = Convert.ToDateTime(expected_date_as_string, StringHelper.Culture()); // Act actual_bank_record.Load(csv_line); // Assert Assert.AreEqual(expected_date, actual_bank_record.Date); }
public void M_WhenMatchingSpecifiedRecords_WillMatchRecordWithSpecifiedIndex() { // Arrange var mock_bank_and_bank_in_loader = new Mock <IBankAndBankInLoader>(); var mock_owned_file = new Mock <ICSVFile <BankRecord> >(); mock_owned_file.Setup(x => x.Records).Returns(new List <BankRecord>()); var matcher = new BankAndBankInMatcher(this, new FakeSpreadsheetRepoFactory(), mock_bank_and_bank_in_loader.Object); var source_record = new ActualBankRecord { Amount = 34.56, Match = null, Matched = false }; var potential_matches = new List <IPotentialMatch> { new PotentialMatch { Actual_records = new List <ICSVRecord> { new BankRecord { Matched = false } } }, new PotentialMatch { Actual_records = new List <ICSVRecord> { new BankRecord { Matched = false } } }, new PotentialMatch { Actual_records = new List <ICSVRecord> { new BankRecord { Matched = false } } } }; var record_for_matching = new RecordForMatching <ActualBankRecord>(source_record, potential_matches); var index = 1; // Act matcher.Match_specified_records(record_for_matching, index, mock_owned_file.Object); // Assert Assert.AreEqual(false, record_for_matching.Matches[0].Actual_records[0].Matched, "first record not matched"); Assert.AreEqual(true, record_for_matching.Matches[1].Actual_records[0].Matched, "second record matched"); Assert.AreEqual(false, record_for_matching.Matches[2].Actual_records[0].Matched, "third record not matched"); }
public void Csv_is_constructed_correctly() { // Arrange var actual_bank_record = new ActualBankRecord(); string csv_line = String.Format("06/03/2017,BAC,\"'Some , description\",127.69,261.40,\"'Envelope\",\"'228822-99933422\","); actual_bank_record.Load(csv_line); actual_bank_record.Matched = false; // Act string constructed_csv_line = actual_bank_record.To_csv(); // Assert Assert.AreEqual("06/03/2017,£127.69,BAC,\"'Some ; description\"", constructed_csv_line); }
public void Can_make_main_amount_positive() { // Arrange var actual_bank_record = new ActualBankRecord(); var negative_amount = -23.23; string csv_line = String.Format("06/03/2017,BAC,\"'0363 23MAR17 C , TFL.GOV.UK/CP , TFL TRAVEL CH GB\",{0},261.40,\"'Envelope\",\"'228822-99933422\",", negative_amount); actual_bank_record.Load(csv_line); // Act actual_bank_record.Make_main_amount_positive(); // Assert Assert.AreEqual(negative_amount * -1, actual_bank_record.Amount); }
public void If_main_amount_already_positive_then_making_it_positive_has_no_effect() { // Arrange var actual_bank_record = new ActualBankRecord(); var positive_amount = 23.23; string csv_line = String.Format("06/03/2017,BAC,\"'0363 23MAR17 C , TFL.GOV.UK/CP , TFL TRAVEL CH GB\",{0},261.40,\"'Envelope\",\"'228822-99933422\",", positive_amount); actual_bank_record.Load(csv_line); // Act actual_bank_record.Make_main_amount_positive(); // Assert Assert.AreEqual(positive_amount, actual_bank_record.Amount); }
public void Will_update_expected_income_record_when_matched() { // Arrange var match_desc = "matchDesc"; var match_date = DateTime.Today.AddDays(2); var match_amount = 22.22; var source_date = DateTime.Today; var source_amount = 22.22; var income_file_io = new Mock <IFileIO <ExpectedIncomeRecord> >(); var income_records = new List <ExpectedIncomeRecord> { new ExpectedIncomeRecord { Description = match_desc, Date = match_date, Unreconciled_amount = match_amount } }; income_file_io.Setup(x => x.Load(It.IsAny <List <string> >(), null)).Returns(income_records); var income_file = new CSVFile <ExpectedIncomeRecord>(income_file_io.Object); income_file.Load(); var expected_income_file = new ExpectedIncomeFile(income_file); var actual_bank_record = new ActualBankRecord { Date = source_date, Amount = source_amount }; var bank_record = new BankRecord { Description = match_desc, Date = match_date, Unreconciled_amount = match_amount }; // Act expected_income_file.Update_expected_income_record_when_matched(actual_bank_record, bank_record); // Assert Assert.AreEqual(match_desc, income_records[0].Description); Assert.AreEqual(match_amount, income_records[0].Unreconciled_amount); Assert.AreEqual(actual_bank_record, income_records[0].Match); Assert.AreEqual(true, income_records[0].Matched); Assert.AreEqual(match_date, income_records[0].Date); Assert.AreEqual(source_date, income_records[0].Date_paid); Assert.AreEqual(source_amount, income_records[0].Total_paid); }
public void Amounts_should_be_written_using_pound_signs() { // Arrange var actual_bank_record = new ActualBankRecord(); var amount = "123.55"; var amount_with_pound_sign = "£" + amount; string csv_line = String.Format("06/03/2017,BAC,\"description\",{0},261.40,\"'Envelope\",\"'228822-99933422\",", amount); actual_bank_record.Load(csv_line); // Act string constructed_csv_line = actual_bank_record.To_csv(); // Assert string expected_csv_line = String.Format("06/03/2017,{0},BAC,\"description\"", amount_with_pound_sign); Assert.AreEqual(expected_csv_line, constructed_csv_line); }
public void Amounts_containing_commas_should_be_encased_in_quotes() { // Arrange var actual_bank_record = new ActualBankRecord(); var amount = 1234.55; var amount_containing_comma = "£1,234.55"; string csv_line = String.Format("06/03/2017,BAC,\"description\",{0},261.40,\"'Envelope\",\"'228822-99933422\",", amount); actual_bank_record.Load(csv_line); // Act string constructed_csv_line = actual_bank_record.To_csv(); // Assert string expected_csv_line = String.Format("06/03/2017,\"{0}\",BAC,\"description\"", amount_containing_comma); Assert.AreEqual(expected_csv_line, constructed_csv_line); }
public void If_input_is_encased_in_quotes_then_output_only_has_one_encasing_set_of_quotes() { // Arrange var actual_bank_record = new ActualBankRecord(); var description_encased_in_one_set_of_quotes = "\"'Some description\""; string csv_line = String.Format("06/03/2017,BAC,{0},127.69,261.40,\"'Envelope\",\"'228822-99933422\",", description_encased_in_one_set_of_quotes); actual_bank_record.Load(csv_line); actual_bank_record.Matched = false; // Act string constructed_csv_line = actual_bank_record.To_csv(); // Assert var expected_csv_line = String.Format("06/03/2017,£127.69,BAC,{0}", description_encased_in_one_set_of_quotes); Assert.AreEqual(expected_csv_line, constructed_csv_line); }
public void M_WhenMatchingSpecifiedRecords_AndMultipleMatchesExist_WillCreateNewRecordWithAllAmountsAddedTogether() { // Arrange var mock_bank_and_bank_in_loader = new Mock <IBankAndBankInLoader>(); var mock_owned_file = new Mock <ICSVFile <BankRecord> >(); mock_owned_file.Setup(x => x.Records).Returns(new List <BankRecord>()); var matcher = new BankAndBankInMatcher(this, new FakeSpreadsheetRepoFactory(), mock_bank_and_bank_in_loader.Object); var source_record = new ActualBankRecord { Date = DateTime.Today, Amount = 34.56, Match = null, Matched = false }; var potential_matches = new List <IPotentialMatch> { new PotentialMatch { Actual_records = new List <ICSVRecord> { new BankRecord { Description = "Match 01", Unreconciled_amount = 20.22 }, new BankRecord { Description = "Match 02", Unreconciled_amount = 30.33 }, new BankRecord { Description = "Match 02", Unreconciled_amount = 40.44 } } } }; var index = 0; var matches = potential_matches[index].Actual_records; var expected_amount = matches[0].Main_amount() + matches[1].Main_amount() + matches[2].Main_amount(); var record_for_matching = new RecordForMatching <ActualBankRecord>(source_record, potential_matches); // Act matcher.Match_specified_records(record_for_matching, index, mock_owned_file.Object); // Assert Assert.AreEqual(expected_amount, record_for_matching.Matches[index].Actual_records[0].Main_amount()); }
public void M_WhenMatchingSpecifiedRecords_SourceAndMatchWillHaveMatchPropertiesPointingAtEachOther() { // Arrange var mock_bank_and_bank_in_loader = new Mock <IBankAndBankInLoader>(); var mock_owned_file = new Mock <ICSVFile <BankRecord> >(); mock_owned_file.Setup(x => x.Records).Returns(new List <BankRecord>()); var matcher = new BankAndBankInMatcher(this, new FakeSpreadsheetRepoFactory(), mock_bank_and_bank_in_loader.Object); var source_record = new ActualBankRecord { Date = DateTime.Today, Amount = 34.56, Match = null, Matched = false }; var potential_matches = new List <IPotentialMatch> { new PotentialMatch { Actual_records = new List <ICSVRecord> { new BankRecord { Description = "Match 01", Unreconciled_amount = 20.22, Type = "Type" }, new BankRecord { Description = "Match 02", Unreconciled_amount = 30.33 }, new BankRecord { Description = "Match 02", Unreconciled_amount = 40.44 } } } }; var index = 0; var record_for_matching = new RecordForMatching <ActualBankRecord>(source_record, potential_matches); // Act matcher.Match_specified_records(record_for_matching, index, mock_owned_file.Object); // Assert Assert.AreEqual(record_for_matching.SourceRecord, record_for_matching.Matches[index].Actual_records[0].Match, "match is pointing at source"); Assert.AreEqual(record_for_matching.Matches[index].Actual_records[0], record_for_matching.SourceRecord.Match, "source is pointing at match"); }
public void Csv_is_constructed_correctly_with_matched_record() { // Arrange var bank_record = new BankRecord(); string csv_line = String.Format("01/04/2017^£13.95^^POS^Purchase^1234^£14.22^^^"); bank_record.Load(csv_line); bank_record.Matched = true; string matched_record_csv_line = String.Format("06/03/2017,BAC,'Some , description,127.69,261.40,'Envelope,'228822-99933422,"); var matched_record = new ActualBankRecord(); matched_record.Load(matched_record_csv_line); bank_record.Match = matched_record; // Act string constructed_csv_line = bank_record.To_csv(); // Assert Assert.AreEqual("01/04/2017,£13.95,x,POS,\"Purchase\",1234,£14.22,,,,,06/03/2017,£127.69,BAC,'Some ; description", constructed_csv_line); }