summaryrefslogtreecommitdiffstats
path: root/tests/unit/test_commands_account.py
blob: 2c077801e9fbbfa3b4efdcdfbac53581605eb625 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import unittest
from unittest.mock import MagicMock
from firefly_cli.commands import account as acct
from firefly_cli.context import Context
from firefly_cli.errors import FireflyError

def make_ctx():
    client = MagicMock()
    resolver = MagicMock()
    return Context(client=client, resolver=resolver, human=False), client, resolver

class TestAccountCmd(unittest.TestCase):
    def test_list_passes_type_filter(self):
        ctx, client, _ = make_ctx()
        client.request.return_value = {"data": []}
        args = MagicMock(type="asset")
        acct.cmd_list(args, ctx)
        client.request.assert_called_once_with(
            "GET", "/api/v1/accounts", params={"type": "asset"})

    def test_balance_resolves_name_and_returns_balance(self):
        ctx, client, resolver = make_ctx()
        resolver.account.return_value = {"id": "3", "name": "Checking",
                                         "current_balance": "100.00"}
        args = MagicMock(account="Checking")
        rc = acct.cmd_balance(args, ctx)
        resolver.account.assert_called_once_with("Checking")
        self.assertEqual(rc, 0)

class TestAccountCreate(unittest.TestCase):
    def _args(self, **kw):
        base = dict(name=None, type=None, opening_balance=None, currency=None)
        base.update(kw)
        m = MagicMock()
        m.configure_mock(**base)  # 'name' is reserved in MagicMock ctor, not configure_mock
        return m

    def test_asset_posts_with_default_role(self):
        ctx, client, _ = make_ctx()
        client.request.return_value = {"data": {"id": "9", "attributes": {}}}
        rc = acct.cmd_create(self._args(name="Savings", type="asset"), ctx)
        self.assertEqual(rc, 0)
        method, path = client.request.call_args[0][:2]
        body = client.request.call_args[1]["body"]
        self.assertEqual((method, path), ("POST", "/api/v1/accounts"))
        self.assertEqual(body["name"], "Savings")
        self.assertEqual(body["type"], "asset")
        self.assertEqual(body["account_role"], "defaultAsset")

    def test_expense_has_no_role(self):
        ctx, client, _ = make_ctx()
        client.request.return_value = {"data": {"id": "9", "attributes": {}}}
        acct.cmd_create(self._args(name="Rent", type="expense"), ctx)
        body = client.request.call_args[1]["body"]
        self.assertNotIn("account_role", body)

    def test_opening_balance_adds_date(self):
        ctx, client, _ = make_ctx()
        client.request.return_value = {"data": {"id": "9", "attributes": {}}}
        acct.cmd_create(
            self._args(name="Savings", type="asset", opening_balance="500"), ctx)
        body = client.request.call_args[1]["body"]
        self.assertEqual(body["opening_balance"], "500")
        self.assertIn("opening_balance_date", body)  # required_with by Firefly

    def test_currency_passed_through(self):
        ctx, client, _ = make_ctx()
        client.request.return_value = {"data": {"id": "9", "attributes": {}}}
        acct.cmd_create(
            self._args(name="Savings", type="asset", currency="EUR"), ctx)
        self.assertEqual(client.request.call_args[1]["body"]["currency_code"], "EUR")

    def test_bad_type_is_hard_error_no_request(self):
        ctx, client, _ = make_ctx()
        with self.assertRaises(FireflyError):
            acct.cmd_create(self._args(name="X", type="bogus"), ctx)
        client.request.assert_not_called()