# -*- coding: utf-8 -*- # This file is part of the investment-module from m-ds for Tryton. # The COPYRIGHT file at the top level of this repository contains the # full copyright notices and license terms. from trytond.tests.test_tryton import ModuleTestCase, with_transaction from trytond.pool import Pool from trytond.modules.company.tests import create_company from trytond.transaction import Transaction from decimal import Decimal from datetime import time, date class AssetTestCase(ModuleTestCase): 'Test asset module' module = 'investment' def prep_asset_company(self): """ get/create company """ Company = Pool().get('company.company') company = Company.search([]) if len(company) > 0: company = company[0] else : company = create_company(name='m-ds') return company def prep_asset_product(self, name='Product 1', description=None, unit='u', unit_name='Units'): """ create product """ pool = Pool() Product = pool.get('product.template') Uom = pool.get('product.uom') uom, = Uom.search([('symbol', '=', unit)]) prod_templ, = Product.create([{ 'name': name, 'type': 'assets', 'list_price': Decimal('1.0'), 'default_uom': uom.id, 'products': [('create', [{ 'description': description, }])], }]) self.assertEqual(prod_templ.default_uom.symbol, unit) self.assertEqual(prod_templ.products[0].description, description) return prod_templ.products[0] def prep_asset_item(self, company, product): """ create asset """ pool = Pool() Asset = pool.get('investment.asset') asset, = Asset.create([{ 'company': company.id, 'product': product.id, 'currency': company.currency.id, 'currency_digits': 4, 'uom': product.default_uom.id, }]) self.assertEqual(asset.rec_name, product.name) self.assertEqual(asset.currency.rec_name, 'usd') self.assertEqual(asset.currency_digits, 4) self.assertEqual(asset.product.rec_name, product.name) self.assertEqual(asset.uom.symbol, product.default_uom.symbol) return asset @with_transaction() def test_asset_create(self): """ create asset """ company = self.prep_asset_company() product = self.prep_asset_product( name='Product 1', description='some asset') asset = self.prep_asset_item( company=company, product = product) @with_transaction() def test_asset_check_onlinesource_onoff(self): """ create asset, switch online-source on/off """ pool = Pool() OnlineSource = pool.get('investment.source') Asset = pool.get('investment.asset') company = self.prep_asset_company() product = self.prep_asset_product( name='Product 1', description='some asset') asset = self.prep_asset_item( company=company, product = product) o_source, = OnlineSource.create([{ 'name': 'Source 1', }]) self.assertEqual(asset.updtsource, None) self.assertEqual(asset.updttime, None) asset.updtsource = o_source asset.updttime = time(10, 45) asset.save() self.assertEqual(asset.updtsource.rec_name, 'Source 1') self.assertEqual(asset.updttime, time(10, 45)) asset.updtsource = None asset.on_change_updtsource() self.assertEqual(asset.updtsource, None) self.assertEqual(asset.updttime, None) @with_transaction() def test_asset_check_update_select(self): """ create asset, add online-source, check selection of assets to update """ pool = Pool() OnlineSource = pool.get('investment.source') Asset = pool.get('investment.asset') company = self.prep_asset_company() product = self.prep_asset_product( name='Product 1', description='some asset') asset = self.prep_asset_item( company=company, product = product) o_source, = OnlineSource.create([{ 'name': 'Source 1', }]) Asset.write(*[ [asset], { 'updtsource': o_source.id, 'updttime': time(10, 45), }]) self.assertEqual(asset.updtsource.rec_name, 'Source 1') self.assertEqual(asset.updttime, time(10, 45)) self.assertEqual(len(asset.rates), 0) with Transaction().set_context({ 'qdate': date(2022, 10, 15), 'qtime': time(10, 30), }): # no rates exists - wait for 10:45 self.assertEqual(asset.updtneeded, True) self.assertEqual( Asset.search_count([('updtneeded', '=', True)]), 0) with Transaction().set_context({ 'qdate': date(2022, 10, 15), 'qtime': time(10, 46), }): # no rates exists - run at 10:46 self.assertEqual(asset.updtneeded, True) self.assertEqual( Asset.search_count([('updtneeded', '=', True)]), 1) # add rate at yesterday Asset.write(*[ [asset], { 'rates': [('create', [{ 'date': date(2022, 10, 14), 'rate': Decimal('1.5'), }])], }]) self.assertEqual(len(asset.rates), 1) with Transaction().set_context({ 'qdate': date(2022, 10, 15), 'qtime': time(10, 30), }): # 1x rate exists - run at 10:30 self.assertEqual(asset.updtneeded, True) self.assertEqual( Asset.search_count([('updtneeded', '=', True)]), 0) with Transaction().set_context({ 'qdate': date(2022, 10, 15), 'qtime': time(10, 46), }): # 1x rate exists yesterday - run at 10:46 self.assertEqual(asset.updtneeded, True) self.assertEqual( Asset.search_count([('updtneeded', '=', True)]), 1) # add rate at today Asset.write(*[ [asset], { 'rates': [('create', [{ 'date': date(2022, 10, 15), 'rate': Decimal('1.5'), }])], }]) self.assertEqual(len(asset.rates), 2) with Transaction().set_context({ 'qdate': date(2022, 10, 15), 'qtime': time(10, 47), }): # 1x rate exists today - run at 10:47 self.assertEqual(asset.updtneeded, True) self.assertEqual( Asset.search_count([('updtneeded', '=', True)]), 0) @with_transaction() def test_asset_indentifiers(self): """ create asset, add identifiers """ pool = Pool() Product = pool.get('product.product') Asset = pool.get('investment.asset') company = self.prep_asset_company() product1 = self.prep_asset_product( name='Product unit', unit='u') product2 = self.prep_asset_product( name='Product gram', unit='g') asset1 = self.prep_asset_item( company=company, product = product1) asset2 = self.prep_asset_item( company=company, product = product2) Product.write(*[ [product1], { 'identifiers': [('create', [{ 'type': 'wkn', 'code': '965515', }, { 'type': 'secsymb', 'code': '1472977', }, { 'type': 'isin', 'code': 'XC0009655157', }, ])], }, [product2], { 'identifiers': [('create', [{ 'type': 'wkn', 'code': '965310', }, { 'type': 'secsymb', 'code': '1431157', }, { 'type': 'isin', 'code': 'XC0009653103', }, ])], }, ]) self.assertEqual(asset1.wkn, '965515') self.assertEqual(asset1.isin, 'XC0009655157') self.assertEqual(asset1.secsymb, '1472977') self.assertEqual(Asset.search_count([('wkn', '=', '965515')]), 1) self.assertEqual(Asset.search_count([('isin', '=', 'XC0009655157')]), 1) self.assertEqual(Asset.search_count([('secsymb', '=', '1472977')]), 1) self.assertEqual(Asset.search_count([ ('wkn', 'ilike', '9655%'), ]), 1) self.assertEqual(Asset.search_count([ ('wkn', 'ilike', '965%'), ]), 2) self.assertEqual(asset2.wkn, '965310') self.assertEqual(asset2.isin, 'XC0009653103') self.assertEqual(asset2.secsymb, '1431157') @with_transaction() def test_asset_check_product_update(self): """ check update of product on asset """ company = self.prep_asset_company() product1 = self.prep_asset_product( name='Product unit', unit='u') product2 = self.prep_asset_product( name='Product gram', unit='g') self.assertEqual(product2.default_uom.digits, 2) asset = self.prep_asset_item( company=company, product = product1) self.assertEqual(asset.product.rec_name, 'Product unit') self.assertEqual(asset.product.default_uom.rec_name, 'Unit') self.assertEqual(asset.uom.rec_name, 'Unit') self.assertEqual(asset.currency_digits, 4) asset.product = product2 asset.on_change_product() asset.save() self.assertEqual(asset.product.rec_name, 'Product gram') self.assertEqual(asset.product.default_uom.rec_name, 'Gram') self.assertEqual(asset.uom.rec_name, 'Gram') asset.on_change_currency() asset.save() self.assertEqual(asset.currency_digits, 2) # end AssetTestCase