usawa

Signed, immutable accounting.
Info | Log | Files | Refs | Submodules | LICENSE

ledger.py (5539B)


      1 import logging
      2 import datetime
      3 import unittest
      4 import os
      5 import copy
      6 
      7 import lxml.etree
      8 from whee.mem import MemStore
      9 
     10 from usawa import Ledger, UnitIndex, EntryPart, Entry, DemoWallet, ACL, schema_path
     11 from usawa.ledger import CallbackType
     12 from usawa.store import LedgerStore
     13 from usawa.error import VerifyError
     14 
     15 logging.basicConfig(level=logging.DEBUG)
     16 logg = logging.getLogger()
     17 
     18 testdir = os.path.realpath(os.path.dirname(__file__))
     19 
     20 
     21 def cb_no(self):
     22     return False
     23 
     24 
     25 def cb_yes(self):
     26     return True
     27 
     28 
     29 class TestLedger(unittest.TestCase):
     30     
     31     def setUp(self):
     32         self.store = MemStore()
     33 
     34 
     35     def test_ledger_create(self):
     36         uidx = UnitIndex('FOO')
     37         wallet = DemoWallet()
     38         o = Ledger(uidx, wallet=wallet)
     39         store = LedgerStore(self.store, ledger=o)
     40         store.start()
     41         print(o.to_string())
     42 
     43 
     44     def test_ledger_xml(self):
     45         uidx = UnitIndex('USD')
     46     
     47         xml_file = os.path.join(testdir, 'test.xml')
     48         tree = lxml.etree.parse(xml_file)
     49         with self.assertRaises(Exception):
     50             logg.warning("fix the signature in test.xml")
     51             ledger = Ledger.from_tree(tree, uidx)
     52 
     53 
     54     def test_ledger_firstfew(self):
     55         s = 'FOO'
     56         uidx = UnitIndex(s)
     57         uidx.add('USD')
     58         wallet = DemoWallet()
     59         o = Ledger(uidx, wallet=wallet)
     60         store = LedgerStore(self.store, ledger=o)
     61         store.start()
     62         print(o.to_string())
     63 
     64         x = EntryPart(s, 'income', 'foo', 1337, debit=True)
     65         y = EntryPart(s, 'asset', 'foo', 1337)
     66         v = Entry(o.peek(), datetime.datetime.now(), parent=o.current())
     67         v.add_part(x, debit=True)
     68         v.add_part(y)
     69         v.sign(wallet)
     70         o.add_entry(v)
     71 
     72         x = EntryPart(s, 'expense', 'bar̈́', 42, debit=True)
     73         y = EntryPart(s, 'liability', 'bar', 42)
     74         v = Entry(o.peek(), datetime.datetime.now(), parent=o.current())
     75         v.add_part(x, debit=True)
     76         v.add_part(y)
     77         v.sign(wallet)
     78         o.add_entry(v)
     79 
     80 
     81     def test_serialize(self):
     82         wallet = DemoWallet()
     83         acl = ACL.from_wallet(wallet)
     84 
     85         s = 'FOO'
     86         uidx = UnitIndex(s)
     87         o = Ledger(uidx, acl=acl, wallet=wallet)
     88         #b = o.serialize()
     89         r = o.sign()
     90 
     91 
     92     def test_validate(self):
     93         s = 'FOO'
     94         uidx = UnitIndex(s)
     95         uidx.add('USD')
     96         o = Ledger(uidx)
     97         store = LedgerStore(self.store, ledger=o)
     98         store.start()
     99     
    100         wallet = DemoWallet()
    101         o.set_wallet(wallet)
    102         x = EntryPart(s, 'income', 'foo', 1337, debit=True)
    103         y = EntryPart(s, 'asset', 'foo', 1337)
    104         v = Entry(o.peek(), datetime.datetime.now(), parent=o.current())
    105         v.add_part(x, debit=True)
    106         v.add_part(y)
    107         v.sign(wallet)
    108         o.add_entry(v)
    109 
    110         x = EntryPart(s, 'expense', 'bar̈́', 42, debit=True)
    111         y = EntryPart(s, 'liability', 'bar', 42)
    112         v = Entry(o.peek(), datetime.datetime.now(), parent=o.current())
    113         v.add_part(x, debit=True)
    114         v.add_part(y)
    115         v.sign(wallet)
    116         o.add_entry(v)
    117 
    118         o.sign()
    119         v = o.to_string()
    120 
    121         logg.debug('schema checking xml string {}'.format(v))
    122 
    123         f = open(schema_path, 'r')
    124         b = f.read()
    125         f.close()
    126         o = lxml.etree.XML(b)
    127         schema = lxml.etree.XMLSchema(o)
    128         parser = lxml.etree.XMLParser(schema=schema)
    129         lxml.etree.fromstring(v, parser)
    130 
    131 
    132     def test_ledger_truncate(self):
    133         s = 'FOO'
    134         uidx = UnitIndex(s)
    135         uidx.add('USD')
    136         ledger = Ledger(uidx)
    137         store = LedgerStore(self.store, ledger=ledger)
    138         store.start()
    139     
    140         wallet = DemoWallet()
    141         ledger.set_wallet(wallet)
    142         x = EntryPart(s, 'income', 'foo', 1337, debit=True)
    143         y = EntryPart(s, 'asset', 'foo', 1337)
    144         v = Entry(ledger.peek(), datetime.datetime.now(), parent=ledger.current())
    145         v.add_part(x, debit=True)
    146         v.add_part(y)
    147         v.sign(wallet)
    148         ledger.add_entry(v)
    149 
    150         x = EntryPart(s, 'expense', 'bar̈́', 42, debit=True)
    151         y = EntryPart(s, 'liability', 'bar', 42)
    152         v = Entry(ledger.peek(), datetime.datetime.now(), parent=ledger.current())
    153         v.add_part(x, debit=True)
    154         v.add_part(y)
    155         v.sign(wallet)
    156         ledger.add_entry(v)
    157         ledger.sign()
    158 
    159         ledger.truncate()
    160         self.assertEqual(ledger.serial, 2)
    161 
    162 
    163     def test_ledger_callback(self):
    164         s = 'FOO'
    165         uidx = UnitIndex(s)
    166         uidx.add('USD')
    167         ledger = Ledger(uidx)
    168         ledger.register_callback(cb_yes)
    169         ledger.register_callback(cb_yes, CallbackType.PRE)
    170         store = LedgerStore(self.store, ledger=ledger)
    171         store.start()
    172     
    173         wallet = DemoWallet()
    174         ledger.set_wallet(wallet)
    175         x = EntryPart(s, 'income', 'foo', 1337, debit=True)
    176         y = EntryPart(s, 'asset', 'foo', 1337)
    177         v = Entry(ledger.peek(), datetime.datetime.now(), parent=ledger.current())
    178         v.add_part(x, debit=True)
    179         v.add_part(y)
    180         v.sign(wallet)
    181         ledger.add_entry(v)
    182 
    183         ledger.register_callback(cb_no, CallbackType.POST)
    184         x = EntryPart(s, 'income', 'foo', 1337, debit=True)
    185         y = EntryPart(s, 'asset', 'foo', 1337)
    186         v = Entry(ledger.peek(), datetime.datetime.now(), parent=ledger.current())
    187         v.add_part(x, debit=True)
    188         v.add_part(y)
    189         v.sign(wallet)
    190         with self.assertRaises(VerifyError):
    191             ledger.add_entry(v)
    192 
    193 if __name__ == '__main__':
    194     unittest.main()