Esempio n. 1
0
 def test_calculate_profit_return_exception_when_too_much_sell_quantity(self, mock_get):
     buy = Activity('CCC', 'BUY', Decimal(40), Decimal('0.4'))
     buy2 = Activity('CCC', 'BUY', Decimal(20), Decimal('0.2'))
     sell = Activity('CCC', 'SELL', Decimal(61), Decimal('0.3'))
     activities = [buy, buy2, sell]
     with self.assertRaises(AccountException):
         AccountStatement.calculate_profit(activities)
Esempio n. 2
0
 def test_create_from_pdf(self):
     months = [
         # Należy podać nazwy raportów w folderze test_data
         # Niestety posiadają one dane personalne i publiczne repozytorium nie jest dobrym miejscem dla nich
     ]
     statement = AccountStatement()
     for month in months:
         statement.create_from_pdf_file(f'test_data/{month}')
     self.assertEqual(106, len(statement._activity_data))
Esempio n. 3
0
    def test_calculate_profit_return_profit_from_avg_buy_price(self, mock_get):
        buy = Activity('CCC', 'BUY', Decimal(40), Decimal('0.4'))
        buy2 = Activity('CCC', 'BUY', Decimal(20), Decimal('0.2'))
        sell = Activity('CCC', 'SELL', Decimal(60), Decimal('0.3'))
        activities = [buy, buy2, sell]
        income, cost, _ = AccountStatement.calculate_profit(activities)
        avg_buy = (Decimal(40) * Decimal('0.4') + Decimal(20)
                   * Decimal('0.2')) / Decimal(60)

        self.assertAlmostEqual((Decimal('0.3') - avg_buy)
                               * Decimal(60), income - cost, places=6)
Esempio n. 4
0
 def test_calculate_income_error_data(self):
     months = [
         # Należy podać nazwy raportów w folderze test_data
         # Niestety posiadają one dane personalne i publiczne repozytorium nie jest dobrym miejscem dla nich
     ]
     statement = AccountStatement()
     
     for month in months:
         statement.create_from_pdf_file(f'test_data/{month}')
     activites = sorted(statement.parse_activities(), key=lambda x: x.settle_date)
     self.assertEqual(46, len([row for row in statement._activity_data if row[3] == 'BUY' or row[3] == 'SELL']))
     statement.calculate_profit(activites, test_only=True)
Esempio n. 5
0
 def test_calculate_income(self):
     months = [
         # Należy podać nazwy raportów w folderze test_data
         # Niestety posiadają one dane personalne i publiczne repozytorium nie jest dobrym miejscem dla nich
     ]
     statement = AccountStatement()
     
     for month in months:
         statement.create_from_pdf_file(f'test_data/{month}')
     activites = sorted(statement.parse_activities(), key=lambda x: x.settle_date)
     activites = [e for e in activites if e.symbol == 'RLGY']
     statement.calculate_profit(activites, test_only=True)
Esempio n. 6
0
    def test_calculate_profit_multiple_action_symbol(self, mock_get):
        buy_q = 40
        buy = Activity('CCC', 'BUY', buy_q, Decimal('0.4'))
        buy2_q = 20
        buy2 = Activity('INT', 'BUY', buy2_q, Decimal('0.2'))

        sell_q = 20
        sell = Activity('CCC', 'SELL', sell_q, Decimal('0.4'))
        sell2_q = 10
        sell2 = Activity('INT', 'SELL', sell2_q, Decimal('0.3'))

        activities = [buy, buy2, sell2, sell]
        income, cost, _ = AccountStatement.calculate_profit(activities)
        self.assertAlmostEqual((Decimal('0.4') - Decimal('0.4')) * sell_q +
                               (Decimal('0.3') - Decimal('0.2')) * sell2_q, income - cost)
Esempio n. 7
0
    def test_calculate_profit_include_buy_before_sell_only(self, mock_get):
        buy_q = 40
        buy = Activity('CCC', 'BUY', buy_q, Decimal('0.4'),
                       settle_date=datetime.strptime("2020/12/21", "%Y/%m/%d"))
        buy2_q = 20
        buy2 = Activity('CCC', 'BUY', buy2_q, Decimal('0.2'),
                        settle_date=datetime.strptime("2018/12/22", "%Y/%m/%d"))
        sell_q = 10
        sell = Activity('CCC', 'SELL', sell_q, Decimal('0.3'),
                        settle_date=datetime.strptime("2020/11/22", "%Y/%m/%d"))

        # activities are sorted by date in db
        activities = sorted([buy, buy2, sell], key=lambda x: x.settle_date)
        income, cost, _ = AccountStatement.calculate_profit(activities)
        self.assertAlmostEqual(
            (Decimal('0.3') - Decimal('0.2')) * sell_q, income - cost)
Esempio n. 8
0
    def test_calculate_profit_return_profit_only_for_last_year(self, mock_get):
        buy_q = 40
        buy = Activity('CCC', 'BUY', buy_q, Decimal('0.4'),
                       settle_date=datetime.strptime("2020/12/21", "%Y/%m/%d"))
        buy2_q = 20
        buy2 = Activity('CCC', 'BUY', buy2_q, Decimal('0.2'),
                        settle_date=datetime.strptime("2018/12/22", "%Y/%m/%d"))
        sell_q = 10
        sell = Activity('CCC', 'SELL', sell_q, Decimal('0.3'),
                        settle_date=datetime.strptime("2019/12/22", "%Y/%m/%d"))
        sell2_q = 30
        sell2 = Activity('CCC', 'SELL', sell2_q, Decimal('0.3'),
                         settle_date=datetime.strptime("2020/12/22", "%Y/%m/%d"))
        # activities are sorted by date in db
        activities = sorted([buy, buy2, sell2, sell],
                            key=lambda x: x.settle_date)

        avg_buy = ((buy2_q - sell_q) * Decimal('0.2') + buy_q * Decimal('0.4')) / \
            (buy2_q - sell_q + buy_q)
        income, cost, _ = AccountStatement.calculate_profit(activities)
        self.assertAlmostEqual((Decimal('0.3') - avg_buy)
                               * sell2_q, income - cost)
Esempio n. 9
0
 def test_calculate_profit_return_profit_only_for_sold_quantity(self, mock_get):
     buy = Activity('CCC', 'BUY', Decimal(40), Decimal('0.4'))
     sell = Activity('CCC', 'SELL', Decimal(20), Decimal('0.3'))
     activities = [buy, sell]
     income, cost, _ = AccountStatement.calculate_profit(activities)
     self.assertEqual(Decimal(-2.0), income - cost)
Esempio n. 10
0
 def test_create_from_pdf_with_strange_ending(self):
     statement = AccountStatement()
     statement.create_from_pdf_file('test_data/sie.pdf')
     activities = statement.parse_activities()
     activities = [e for e in activities if e.type == 'SELL']
     self.assertEqual(12, len(activities))
Esempio n. 11
0
 def test_create_from_pdf_multiple_pages(self):
     statement = AccountStatement()
     statement.create_from_pdf_file('test_data/april.pdf')
     self.assertEqual(Decimal(108), len(statement._activity_data))