def testRunEnterDaysLessThanOne(self): schedulefiledata = FileTester.read_file( FileTester.test_enter_lessthan1 ) tempschedulefile = FileTester.write_to_temp_file( FileTester.test_enter_lessthan1, schedulefiledata ) schedulefile = ScheduleFile(tempschedulefile) templedgerfile = FileTester.create_temp_file('') ledgerfile = LedgerFile(templedgerfile) scheduler = Scheduler(ledgerfile, schedulefile) scheduler.run() ledgerfile.write_file() schedulefile.write_file() schedulefile_actual = FileTester.read_file(tempschedulefile) schedulefile_expected = FileTester.read_file( FileTester.test_enter_lessthan1 ) os.remove(templedgerfile) os.remove(tempschedulefile) self.assertEqual( schedulefile_expected, schedulefile_actual )
def test_init_things(self): with FileTester.temp_input(testdata) as tempfilename: ledgerfile = LedgerFile(tempfilename, 'cash') recon = Reconciler(ledgerfile) self.verify_equal_floats(-15, recon.total_cleared) self.verify_equal_floats(-32.12, recon.total_pending) payees = { thing.payee for thing in recon.open_transactions } # all open transactions, including the future: self.assertEqual( ({'two', 'two pt five', 'three', 'four'}), payees ) payees = { thing.payee for k, thing in recon.current_listing.iteritems() } # future items included only if pending ('three') self.assertEqual( ({'two', 'two pt five', 'three'}), payees ) self.assertEqual(date.today(), recon.ending_date) self.assertIsNone(recon.ending_balance) self.assertEqual(3, len(recon.current_listing)) self.assertEqual( 'a: cash', ledgerfile.get_reconciliation_account() )
def test_parsed_file_unchanged_via_print(self): """file output after parsing should be identical to input""" expected = FileTester.read_file(FileTester.testfile) ledgerfile = LedgerFile(FileTester.testfile) ledgerfile.print_file() self.redirect.seek(0) self.assertEqual(expected, self.redirect.read()) self.assertIsNone(ledgerfile.get_reconciliation_account())
def test_parsed_file_unchanged_via_write(self): """file output after parsing should be identical to input""" expected = FileTester.read_file(FileTester.testfile) tempfile = FileTester.copy_to_temp_file(FileTester.testfile) ledgerfile = LedgerFile(tempfile) ledgerfile.write_file() actual = FileTester.read_file(tempfile) remove(tempfile) self.assertEqual(expected, actual)
def test_already_sorted_file_unchanged(self): """file output after sorting is identical to sorted input""" expected = FileTester.read_file(FileTester.sortedfile) tempfile = FileTester.copy_to_temp_file(FileTester.sortedfile) ledgerfile = LedgerFile(tempfile) ledgerfile.sort() ledgerfile.write_file() actual = FileTester.read_file(tempfile) remove(tempfile) self.assertEqual(expected, actual)
def test_initial_non_transaction_date(self): """1st thing in file is a non-transaction, has default date""" tempfile = FileTester.create_temp_file('blah\nblah blah blah') ledgerfile = LedgerFile(tempfile) # non-transaction dates are only populated with sort ledgerfile.sort() remove(tempfile) self.assertEqual( LedgerFile.STARTING_DATE, ledgerfile.get_things()[0].thing_date )
def test_sorting(self): """test sorting""" expected = FileTester.read_file(FileTester.alpha_sortedfile) tempfile = FileTester.copy_to_temp_file( FileTester.alpha_unsortedfile ) ledgerfile = LedgerFile(tempfile) ledgerfile.sort() ledgerfile.write_file() actual = FileTester.read_file(tempfile) remove(tempfile) self.assertEqual(expected, actual)
def run_it(self, before_date, after_date, schedule, enter_days=7): schedulefiledata = self.get_schedule_file( util.get_date_string(before_date), schedule, enter_days ) tempschedulefile = FileTester.write_to_temp_file( FileTester.testdir + 'run_it_schedule_file', schedulefiledata ) schedulefile = ScheduleFile(tempschedulefile) templedgerfile = FileTester.write_to_temp_file( FileTester.testdir + 'run_it_ledger_file', '' ) ledgerfile = LedgerFile(templedgerfile) scheduler = Scheduler(ledgerfile, schedulefile) scheduler.run() ledgerfile.write_file() schedulefile.write_file() schedulefile_actual = FileTester.read_file(tempschedulefile) schedulefile_expected = self.get_schedule_file( util.get_date_string(after_date), schedule, enter_days ) os.remove(templedgerfile) os.remove(tempschedulefile) self.assertEqual(schedulefile_expected, schedulefile_actual)
def test_assigned_thing_numbers(self): """thing numbers added in sequence starting at one""" testdata = '''; blah ; blah blah blah 2013/05/06 payee name expenses: misc liabilities: credit card $-50 ''' tempfile = FileTester.create_temp_file(testdata) ledgerfile = LedgerFile(tempfile) remove(tempfile) thing = LedgerThing([ '2011/01/01 beezlebub', ' assets: soul', ' liabilities: credit card $666', ]) ledgerfile.add_thing(thing) expected = '012' actual = '' for thing in ledgerfile.get_things(): actual += str(thing.thing_number) self.assertEquals(actual, expected)
def process_file(self): if self.args.next_scheduled_date: if not self.args.schedule_file: print('error: -S/--schedule-file is required') return 8 schedule_file = ScheduleFile(self.args.schedule_file) print(schedule_file.next_scheduled_date()) return 0 if not self.args.file: print('error: -f/--file is required') return 16 try: ledgerfile = LedgerFile(self.args.file, self.args.reconcile) except LdgReconcilerMoreThanOneMatchingAccount as e: print('Reconcile error. More than one matching account:') for account in e.message: print(' ' + account) return 2 except LdgReconcilerMultipleStatuses as e: print(str(e)) return 4 if self.args.schedule_file: schedule_file = ScheduleFile(self.args.schedule_file) scheduler = Scheduler(ledgerfile, schedule_file) scheduler.run() schedule_file.write_file() ledgerfile.write_file() if self.args.sort: ledgerfile.sort() ledgerfile.write_file() if self.args.reconcile: if ledgerfile.rec_account_matches: # pragma: no cover reconciler = Reconciler(ledgerfile) reconciler.cmdloop() else: print('No matching account found for "{acct}"'.format( acct=self.args.reconcile )) return 0
def test_later_non_transaction_date(self): """later non-transaction things inherit preceding thing date""" testdata = '''2013/05/06 payee name expenses: misc liabilities: credit card $-1 2013/05/07 payee name expenses: misc liabilities: credit card $-2 ''' tempfile = FileTester.create_temp_file(testdata) ledgerfile = LedgerFile(tempfile) ledgerfile._add_thing_from_lines( ['; blah blah blah', '; and so on...'] ) # non-transaction dates are only populated with sort ledgerfile.sort() remove(tempfile) self.assertEqual( ledgerfile.get_things()[1].thing_date, ledgerfile.get_things()[2].thing_date )