Example #1
0
 def option(self):
     flag = True
     while flag:
         print("Choose one of the following options to continue:")
         print("1 - show all data")
         print("2 - show data for specific date")
         print("3 - show expenses, ordered by categories")
         print("4 - add new income")
         print("5 - add new expense")
         print("6 - exit")
         choice = input()
         if choice == '1':
             obj = MoneyTracker(self.AggregatedObject)
             obj.list_user_data()
         if choice == '2':
             date = input()
             obj = MoneyTracker(self.AggregatedObject)
             obj.show_user_data_per_date(date)
         if choice == '3':
             obj = MoneyTracker(self.AggregatedObject)
             print(obj.list_user_expenses_ordered_by_categories())
         if choice == '4':
             print("New income amount:")
             money = input()
             if int(money) < 0:
                 raise CustomError('enter a valid amount')
             print("New income type:")
             income_category = input()
             print("New income date:")
             date = input()
             obj = MoneyTracker(self.AggregatedObject)
             i = Income(int(money), income_category, date)
             obj.add_income(i)
             # for el in obj.AggregatedObject.incomes:
             #   print(el)
         if choice == '5':
             print("New expense amount:")
             money = input()
             if int(money) < 0:
                 raise CustomError('enter a valid amount')
             print("New expense type:")
             expense_category = input()
             print("New expense date:")
             date = input()
             obj = MoneyTracker(self.AggregatedObject)
             i = Expense(int(money), expense_category, date)
             obj.add_expense(i)
             # for el in obj.AggregatedObject.expenses:
             #   print(el)
         if choice == '6':
             flag = False
         if choice not in ('1', '2', '3', '4', '5', '6'):
             raise Exception('Invalid input')
class MoneyTrackerMenu:
    def __init__(self):
        os.system('clear')
        self._user_name = input('Enter user name:')
        self.initialize_file_and_money_tracker()
        self.initialize_options()
        self.date_message = '(Format of the date is DD,MM,YYYY)\nEnter date:'

    def initialize_file_and_money_tracker(self):
        information_entered = False
        while information_entered is False:
            try:
                self._file_with_data = input('Enter file to load:')
                self._money_tracker = MoneyTracker(self._file_with_data)
                information_entered = True
                os.system('clear')
            except Exception:
                print('The file name is incorect or its content is invalid!')

    def initialize_options(self):
        self.options = ['1', '2', '3', '4', '5', '6', '7']
        self.options_functions = [
            self.option_one, self.option_two, self.option_three,
            self.option_four, self.option_five, self.option_six,
            self.option_seven
        ]

    def start(self):
        self.working = True
        option_chosen = ''
        while self.working is True:
            self.print_menu_options()
            option_chosen = input()
            if option_chosen not in self.options:
                print('Invalid option, try again!')
            else:
                self.options_functions[int(option_chosen) - 1]()
            if self.working is True:
                input('Press enter to continue:')
            os.system('clear')

    def print_menu_options(self):
        print(f'Hello, {self._user_name}!\n'
              'Choose one of the following options to continue:\n'
              '1 - show all data\n'
              '2 - show data for specific date\n'
              '3 - show expenses, ordered by categories\n'
              '4 - add new income\n'
              '5 - add new expense\n'
              '6 - exit without saving\n'
              '7 - exit and save\n')

    def option_one(self):
        print(self._money_tracker.list_user_data())

    def option_two(self):
        try:
            day, month, year = self.date_parser(input(self.date_message))
            print(self._money_tracker.show_user_data_per_date(
                day, month, year))
        except ValueError as ex:
            print(f'\nError!\n{ex}\n')

    def option_three(self):
        print(self._money_tracker.list_user_exepences_ordered_by_categories())

    def option_four(self):
        try:
            day, month, year = self.date_parser(input(self.date_message))
            category = input('Category of income:')
            amount = self.amount_parser(input('Amount of income:'))
            self._money_tracker.add_income(day, month, year, category, amount)
        except ValueError as ex:
            print(f'\nError!\n{ex}\n')

    def option_five(self):
        try:
            day, month, year = self.date_parser(input(self.date_message))
            category = input('Category of expence:')
            amount = self.amount_parser(input('Amount of expense:'))
            self._money_tracker.add_expence(day, month, year, category, amount)
        except ValueError as ex:
            print(f'\nError!\n{ex}\n')

    def option_six(self):
        self.working = False

    def option_seven(self):
        self.working = False
        self.save_data_in_a_file()

    def save_data_in_a_file(self):
        with open(self._file_with_data, 'w') as f:
            f.write(self._money_tracker.list_user_data())

    @staticmethod
    def date_parser(date):
        if re.match(r'\d{1,2},\d{1,2},\d{4}', date) is None:
            raise ValueError('The date is invalid!')
        parts = date.split(',')
        return int(parts[0]), int(parts[1]), int(parts[2])

    @staticmethod
    def amount_parser(amount):
        try:
            checked_amount = float(amount)
            return checked_amount
        except Exception:
            raise ValueError('The amount should be a number!')
Example #3
0
class TestsMoneyTracker(unittest.TestCase):
    def setUp(self):
        agr_money_tracker = AgregatedMoneyTracker()
        agr_money_tracker._data = {
            '2018,11,12': {
                'income': [],
                'expence': [Expense('food', 5)]
            },
            '2018,11,15': {
                'income': [Income('salary', 50)],
                'expence': [Expense('shoes', 100)]
            },
            '2018,11,17': {
                'income': [Income('clothes', 20)],
                'expence': []
            }
        }
        self.money_tracker = MoneyTracker()
        self.money_tracker._data_base = agr_money_tracker

    def test_list_user_data(self):
        expected_result = ('=== 12-11-2018 ===\n'
                           '5, food, New Expense\n'
                           '=== 15-11-2018 ===\n'
                           '50, salary, New Income\n'
                           '100, shoes, New Expense\n'
                           '=== 17-11-2018 ===\n'
                           '20, clothes, New Income\n')
        self.assertEqual(self.money_tracker.list_user_data(), expected_result)

    def test_get_string_with_empty_data(self):
        self.assertEqual(MoneyTracker.get_string([]), '')

    def test_get_string_with_data(self):
        self.assertEqual(MoneyTracker.get_string([1, 2, 3]), '123')
        self.assertEqual(
            MoneyTracker.get_string(
                [Income('salary', 50),
                 Expense('shoes', 100)]), ('50, salary, New Income\n'
                                           '100, shoes, New Expense\n'))

    def test_show_user_data_per_date_no_data_for_the_date(self):
        self.assertEqual(
            self.money_tracker.show_user_data_per_date(5, 5, 2010), '')

    def test_show_user_data_per_date(self):
        self.assertEqual(
            self.money_tracker.show_user_data_per_date(15, 11, 2018),
            '50, salary, New Income\n'
            '100, shoes, New Expense\n')

    def test_get_user_income_no_income(self):
        self.assertEqual(MoneyTracker().get_user_incomes(), [])

    def test_get_user_income(self):
        self.assertEqual(
            self.money_tracker.get_user_incomes(),
            [Income('salary', 50), Income('clothes', 20)])

    def test_get_user_expences_no_income(self):
        self.assertEqual(MoneyTracker().get_user_expences(), [])

    def test_get_user_expences(self):
        self.assertEqual(
            self.money_tracker.get_user_expences(),
            [Expense('food', 5), Expense('shoes', 100)])

    def test_show_user_income(self):
        self.assertEqual(
            self.money_tracker.show_user_incomes(), '50, salary, New Income\n'
            '20, clothes, New Income\n')

    def test_show_user_expences(self):
        self.assertEqual(self.money_tracker.show_user_expences(),
                         '5, food, New Expense\n'
                         '100, shoes, New Expense\n')

    def test_list_income_categories_with_no_categories(self):
        self.assertEqual(MoneyTracker().list_income_categories(), '')

    def test_list_income_categories(self):
        self.assertEqual(self.money_tracker.list_income_categories(),
                         'salary\n'
                         'clothes\n')

    def test_list_expence_categories_with_no_categories(self):
        self.assertEqual(MoneyTracker().list_expence_categories(), '')

    def test_list_expece_categories(self):
        self.assertEqual(self.money_tracker.list_expence_categories(), 'food\n'
                         'shoes\n')

    def test_list_user_exepences_ordered_by_categories(self):
        self.money_tracker._data_base.set_record_for_date(
            '2018,11,17', '10, book, '
            'New Expense\n')
        exp = self.money_tracker.list_user_exepences_ordered_by_categories()
        self.assertEqual(
            exp, '10, book, New Expense\n'
            '5, food, New Expense\n'
            '100, shoes, New Expense\n')
class MoneyTrackerTests(unittest.TestCase):
    def setUp(self):
        self.categories = [
            Income('760', 'Salary'),
            Expense('5.5', 'Eating Out'),
            Expense('34', 'Clothes'),
            Income('50', 'Savings')
        ]
        self.strings = [
            '760, Salary, New Income', '5.5, Eating Out, New Expense',
            '34, Clothes, New Expense', '50, Savings, New Income'
        ]

        self.strings1 = [
            '50, Savings, New Income', '15, Food, New Expense',
            '200, Deposit, New Income', '5, Sports, New Expense'
        ]

        self.categories1 = [
            Income('50', 'Savings'),
            Expense('15', 'Food'),
            Income('200', 'Deposit'),
            Expense('5', 'Sports')
        ]
        self.aggregator1 = AggregateData({
            '=== 22-03-2018 ===': self.strings,
            '=== 23-03-2018 ===': self.strings1
        })
        self.tracker1 = MoneyTracker(self.aggregator1)

    def test_list_user_expenses_ordered_by_categories(self):
        result = [
            self.categories[2], self.categories[1], self.categories1[1],
            self.categories1[3]
        ]
        self.assertEqual(
            self.tracker1.list_user_expenses_ordered_by_categories(), result)

    def test_list_income_categories(self):
        result = [
            self.categories[0], self.categories[3], self.categories1[0],
            self.categories1[2]
        ]
        self.assertEqual(self.tracker1.list_income_categories(), result)

    def test_list_expense(self):
        result = [
            self.categories[1], self.categories[2], self.categories1[1],
            self.categories1[3]
        ]
        self.assertEqual(self.tracker1.list_expense_categories(), result)

    def test_add_income(self):
        with self.subTest("with new date"):
            data = self.tracker1.list_user_data()
            self.tracker1.add_income("Stipendiq", 100, '22-03-2018')
            self.assertTrue(
                Income(100, "Stipendiq") in data['=== 22-03-2018 ==='])

        with self.subTest("with old date"):
            data = self.tracker1.list_user_data()
            self.tracker1.add_expense("Tototo", 1.5, '22-03-2018')
            self.assertTrue(
                Income(1.5, "Tototo") in data['=== 22-03-2018 ==='])

    def test_add_expense(self):
        with self.subTest("with new date"):
            data = self.tracker1.list_user_data()
            self.tracker1.add_expense("Kniga", 17, '22-03-9999')
            self.assertTrue(Expense(17, "Kniga") in data['=== 22-03-9999 ==='])

        with self.subTest("with old date"):
            data = self.tracker1.list_user_data()
            self.tracker1.add_expense("Kola", 155.5, '22-03-2018')
            self.assertTrue(
                Expense(155.5, "Kola") in data['=== 22-03-2018 ==='])