def test_update_currency_prices(self, book_basic): if not is_inmemory_sqlite(book_basic): print("skipping test for {}".format(book_basic)) return EUR = book_basic.default_currency with pytest.raises(GncPriceError): EUR.update_prices() USD = book_basic.currencies(mnemonic="USD") USD.update_prices() assert len(list(USD.prices)) < 7 assert (USD.prices.first() is None) or (USD.prices.first().commodity is USD) CAD = book_basic.currencies(mnemonic="CAD") CAD.update_prices() assert len(list(CAD.prices)) < 7 assert (CAD.prices.first() is None) or (CAD.prices.first().commodity is CAD) # redo update prices which should not bring new prices l = len(list(USD.prices)) USD.update_prices() assert len(list(USD.prices)) == l book_basic.validate() assert len(book_basic.prices) < 14
def test_update_currency_prices(self, book_basic): if not is_inmemory_sqlite(book_basic) or is_not_on_web(): print("skipping test for {}".format(book_basic)) return EUR = book_basic.default_currency with pytest.raises(GncPriceError): EUR.update_prices() USD = book_basic.currencies(mnemonic="USD") USD.update_prices() assert len(list(USD.prices)) < 7 assert (USD.prices.first() is None) or (USD.prices.first().commodity is USD) CAD = book_basic.currencies(mnemonic="CAD") CAD.update_prices() assert len(list(CAD.prices)) < 7 assert (CAD.prices.first() is None) or (CAD.prices.first().commodity is CAD) # redo update prices which should not bring new prices l = len(list(USD.prices)) USD.update_prices() assert len(list(USD.prices)) == l assert len(book_basic.prices) < 14
def test_base_currency_commodity(self, book_basic): cdty = Commodity(namespace="AMEX", mnemonic="APPLE", fullname="Apple", book=book_basic) with pytest.raises(GnucashException): cdty.base_currency # should trigger creation of USD currency cdty["quoted_currency"] = "USD" assert cdty.base_currency.mnemonic == 'USD' book_basic.flush() assert cdty.base_currency == book_basic.currencies(mnemonic="USD") cdty["quoted_currency"] = "EUR" assert cdty.base_currency == book_basic.currencies(mnemonic="EUR")
def test_create_cdtytransaction(self, book_basic): EUR = book_basic.commodities(namespace="CURRENCY") racc = book_basic.root_account a = book_basic.accounts(name="asset") s = book_basic.accounts(name="broker") tr = Transaction( currency=EUR, description="buy stock", notes="on St-Eugène day", post_date=date(2014, 1, 2), enter_date=datetime(2014, 1, 3), splits=[ Split(account=a, value=100, memo="mémo asset"), Split(account=s, value=-90, memo="mémo brok"), ], ) # check issue with quantity for broker split not defined with pytest.raises(GncValidationError): book_basic.validate() sb = tr.splits(account=s) sb.quantity = 15 # check issue with quantity not same sign as value with pytest.raises(GncValidationError): book_basic.validate() sb.quantity = -15 # verify imbalance issue with pytest.raises(GncImbalanceError): book_basic.validate() # adjust balance Split(account=a, value=-10, memo="missing asset corr", transaction=tr) book_basic.save() assert str(sb) assert str(sb) # changing currency of an existing transaction is not allowed tr.currency = book_basic.currencies(mnemonic="USD") with pytest.raises(GncValidationError): book_basic.validate() book_basic.cancel() # check sum of quantities are not balanced per commodity but values are d = defaultdict(lambda: Decimal(0)) for sp in tr.splits: assert sp.quantity == sp.value or sp.account != a d[sp.account.commodity] += sp.quantity d["cur"] += sp.value assert d["cur"] == 0 assert all([v != 0 for k, v in d.items() if k != "cur"])
def test_create_duplicateprice_different_source(self, book_basic): EUR = book_basic.commodities(namespace="CURRENCY") USD = book_basic.currencies(mnemonic="USD") p = Price(commodity=USD, currency=EUR, date=date(2014, 2, 22), value=Decimal('0.54321'), source="user:price") p1 = Price(commodity=USD, currency=EUR, date=date(2014, 2, 22), value=Decimal('0.12345'), source="other:price") book_basic.flush() assert USD.prices.filter_by(value=Decimal('0')).all() == [] assert USD.prices.filter_by(value=Decimal('0.12345')).one() == p1 # validation should work as different sources book_basic.validate()
def test_create_duplicateprice(self, book_basic): EUR = book_basic.commodities(namespace="CURRENCY") USD = book_basic.currencies(mnemonic="USD") p = Price(commodity=USD, currency=EUR, date=date(2014, 2, 22), value=Decimal('0.54321')) p1 = Price(commodity=USD, currency=EUR, date=date(2014, 2, 22), value=Decimal('0.12345')) book_basic.flush() assert USD.prices.filter_by(value=Decimal('0')).all() == [] assert USD.prices.filter_by(value=Decimal('0.12345')).one() == p1 with pytest.raises(ValueError): book_basic.validate()
def test_create_cdtytransaction(self, book_basic): EUR = book_basic.commodities(namespace="CURRENCY") racc = book_basic.root_account a = book_basic.accounts(name="asset") s = book_basic.accounts(name="broker") tr = Transaction(currency=EUR, description="buy stock", notes=u"on St-Eugène day", post_date=datetime(2014, 1, 2), enter_date=datetime(2014, 1, 3), splits=[ Split(account=a, value=100, memo=u"mémo asset"), Split(account=s, value=-90, memo=u"mémo brok"), ]) # check issue with quantity for broker split not defined with pytest.raises(GncValidationError): book_basic.flush() sb = tr.splits(account=s) sb.quantity = 15 # check issue with quantity not same sign as value with pytest.raises(GncValidationError): book_basic.flush() sb.quantity = -15 # verify imbalance issue with pytest.raises(GncImbalanceError): book_basic.flush() # adjust balance Split(account=a, value=-10, memo="missing asset corr", transaction=tr) book_basic.flush() book_basic.save() assert str(sb) assert str(sb) # changing currency of an existing transaction is not allowed tr.currency = book_basic.currencies(mnemonic="USD") with pytest.raises(GncValidationError): book_basic.flush() book_basic.cancel() # check sum of quantities are not balanced per commodity but values are d = defaultdict(lambda: Decimal(0)) for sp in tr.splits: assert sp.quantity == sp.value or sp.account != a d[sp.account.commodity] += sp.quantity d["cur"] += sp.value assert d["cur"] == 0 assert all([v != 0 for k, v in d.items() if k != "cur"])
def test_create_duplicateprice(self, book_basic): EUR = book_basic.commodities(namespace="CURRENCY") USD = book_basic.currencies(mnemonic="USD") p = Price(commodity=USD, currency=EUR, date=datetime(2014, 2, 22), value=Decimal('0.54321')) p1 = Price(commodity=USD, currency=EUR, date=datetime(2014, 2, 22), value=Decimal('0.12345')) book_basic.flush() assert USD.prices.filter_by(value=Decimal('0')).all() == [] assert USD.prices.filter_by(value=Decimal('0.12345')).one() == p1 from sqlalchemy.orm.exc import NoResultFound with pytest.raises(NoResultFound): USD.prices.filter_by(value=Decimal('0.123')).one()
def test_create_basicprice(self, book_basic): EUR = book_basic.commodities(namespace="CURRENCY") USD = book_basic.currencies(mnemonic="USD") p = Price(commodity=USD, currency=EUR, date=date(2014, 2, 22), value=Decimal('0.54321')) # check price exist np = USD.prices.first() assert np is p assert repr(p) == "Price<2014-02-22 : 0.54321 EUR/USD>" p2 = Price(commodity=USD, currency=EUR, date=date(2014, 2, 21), value=Decimal('0.12345')) book_basic.flush() assert p.value + p2.value == Decimal("0.66666") assert len(USD.prices.all()) == 2
def test_create_basicprice(self, book_basic): EUR = book_basic.commodities(namespace="CURRENCY") USD = book_basic.currencies(mnemonic="USD") p = Price(commodity=USD, currency=EUR, date=datetime(2014, 2, 22), value=Decimal('0.54321')) # check price exist np = USD.prices.first() assert np is p assert repr(p) == "Price<2014-02-22 : 0.54321 EUR/USD>" p2 = Price(commodity=USD, currency=EUR, date=datetime(2014, 2, 21), value=Decimal('0.12345')) book_basic.flush() assert p.value + p2.value == Decimal("0.66666") assert len(USD.prices.all()) == 2
def test_base_currency_currency(self, book_basic): cdty = book_basic.currencies(mnemonic="USD") assert cdty.base_currency.mnemonic == "EUR"