예제 #1
0
    def test_cash_flow_filter_example_simple_predicate(self, transactions):

        assume(all(not math.isnan(t.value) for t in transactions))
        assume(all(transaction.value > 0 for transaction in transactions))

        cf = cashflow.CashFlow(transactions=transactions)

        assert len(cf.filter(lambda t: t.value > 0)) == len(transactions)
예제 #2
0
    def test_net_value(self, transactions):

        assume(all(not math.isnan(t.value) for t in transactions))

        cf = cashflow.CashFlow(transactions=transactions)

        self.assertAlmostEqual(
            cf.net_value, sum(t.value for t in transactions)
        )
예제 #3
0
    def test_create_an_empty_cashflow(self):

        cf = cashflow.CashFlow()

        assert len(cf) == 0

        assert list(cf.transactions) == []

        assert cf.net_value == decimal.Decimal(0)
예제 #4
0
    def test_seriaize_cash_flow(self, transactions):

        cf = cashflow.CashFlow(transactions=transactions)

        expected_data = {'cashflow': [t.serialize() for t in transactions]}

        self.assertDictEqual(cf.serialize(), expected_data)

        self.assertEqual(
            serialize_utils.json_dumps(cf.serialize()),
            serialize_utils.json_dumps(expected_data)
        )
예제 #5
0
    def test_append_duplicate_transaction(self, transaction):

        cf = cashflow.CashFlow()

        cf.append(transaction)

        with pytest.raises(ValueError) as cm:
            cf.append(transaction)

        expected_message = (
            '{} already added to the cash flow'.format(repr(transaction))
            )

        assert str(cm.value) == expected_message
예제 #6
0
    def test_cash_flow_with_one_transaction(self, transaction):

        assume(not math.isnan(transaction.value))

        cf = cashflow.CashFlow()

        cf.append(transaction)

        assert len(cf) == 1

        assert tuple(cf.transactions) == (transaction, )

        self.assertAlmostEqual(
            cf.net_value, sum(t.value for t in (transaction,))
        )
예제 #7
0
    def test_dunder_getitem(self, transactions):

        cf = cashflow.CashFlow()

        with pytest.raises(IndexError):
            cf[0]

        assert len(cf[0:100]) == 0

        for transaction in transactions:
            cf.append(transaction)

        assert tuple(cf[0].transactions)[0] == transactions[0]

        assert tuple(cf[0:5].transactions) == transactions[0:5]
        assert len(tuple(cf[0:5].transactions)) == len(transactions[0:5])

        assert tuple(cf[::-1].transactions) == tuple(reversed(transactions))
        assert len(tuple(cf[::-1].transactions)) == len(transactions[::-1])
예제 #8
0
    def test_cash_flow_filter_composition(self, transactions):

        assume(all(not math.isnan(t.value) for t in transactions))
        assume(all(0 < t.value <= 100 for t in transactions))

        cf = cashflow.CashFlow(transactions=transactions).filter(
            lambda t: t.value > 0
        )

        assert len(cf) == len(transactions)

        # Duplicate the filter to ensure the value keeps the same
        cf = cf.filter(lambda t: t.value > 0).filter(lambda t: t.value > 0)

        assert len(cf) == len(transactions)

        cf = cf.filter(lambda t: t.value == 100)

        transactions_values_greater_than_100 = tuple(
            t for t in transactions if t.value == 100
        )

        assert tuple(cf.transactions) == transactions_values_greater_than_100
예제 #9
0
    def test_dunder_contains(self, transactions):

        cf = cashflow.CashFlow(transactions=transactions)

        self.assertIn(transactions[0], cf)
예제 #10
0
    def test_dunder_iter(self, transactions):

        cf = cashflow.CashFlow(transactions=transactions)

        for transaction in cf:
            assert transaction in transactions
예제 #11
0
    def test_dunder_len(self, transactions):

        cf = cashflow.CashFlow(transactions=transactions)

        assert len(cf) == len(transactions)