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()