From 95a3095d9c11d7929d7d2bc91286825ef99b0ae2 Mon Sep 17 00:00:00 2001 From: valhuber Date: Mon, 7 Dec 2020 22:36:33 -0800 Subject: [PATCH] solar - no engine. Simplified test setUp/tearDown --- logic_bank/exec_row_logic/logic_row.py | 4 +- logic_bank/logic_bank.py | 17 +++-- logic_bank/rule_bank/rule_bank_setup.py | 6 +- nw/basic_web_app/app/__init__.py | 32 ++------- nw/db/__init__.py | 24 +++++++ nw/logic/__init__.py | 68 ------------------ nw/tests/__init__.py | 72 ++++++++++++++++--- nw/tests/test_add_cust.py | 26 +++---- nw/tests/test_add_order.py | 40 +++++------ nw/tests/test_dlt_order.py | 48 ++++++------- nw/tests/test_upd_employee_salary.py | 20 +++--- nw/tests/test_upd_order_customer.py | 34 ++++----- nw/tests/test_upd_order_required.py | 26 +++---- nw/tests/test_upd_order_reuse.py | 46 ++++++------ nw/tests/test_upd_order_shipped.py | 26 +++---- .../test_upd_order_shipped_auto_commit.py | 26 +++---- nw/tests/test_upd_orderclass_required.py | 26 +++---- 17 files changed, 275 insertions(+), 266 deletions(-) diff --git a/logic_bank/exec_row_logic/logic_row.py b/logic_bank/exec_row_logic/logic_row.py index b71b0b1..419f397 100644 --- a/logic_bank/exec_row_logic/logic_row.py +++ b/logic_bank/exec_row_logic/logic_row.py @@ -54,8 +54,8 @@ def __init__(self, row: base, old_row: base, ins_upd_dlt: str, nest_level: int, rb = RuleBank() self.rb = rb - self.session = rb._session - # solar no engine self.engine = rb._engine + self.session = a_session + # solar no engine self.session = rb.session; self.engine = rb._engine self.some_base = declarative_base() self.name = type(self.row).__name__ # class name (not table name) diff --git a/logic_bank/logic_bank.py b/logic_bank/logic_bank.py index 2fc2fd8..c417972 100644 --- a/logic_bank/logic_bank.py +++ b/logic_bank/logic_bank.py @@ -4,7 +4,7 @@ from sqlalchemy.orm import session from logic_bank.rule_bank import rule_bank_withdraw # reduce circular imports -from logic_bank.rule_bank.rule_bank_setup import setup, compute_formula_execution_order +import logic_bank.rule_bank.rule_bank_setup as rule_bank_setup from logic_bank.rule_type.constraint import Constraint from logic_bank.rule_type.copy import Copy from logic_bank.rule_type.count import Count @@ -17,24 +17,27 @@ class LogicBank: """ Logic consists of Rules, and Python. - Activate your logic, - providing a function that declares your rules and Python. + Activate your logic by calling + + activate(session: session, activator: my_logic) + + where myLogic is a function that declares your rules and Python. """ def activate(session: session, activator: callable): """ - load rules - executed on commit + load rules - later executed on commit raises exception if cycles detected :param session: SQLAlchemy session :param activator: function that declares rules (e.g., Rule.sum...) - :return: """ + # solar engine = session.bind.engine - setup(session) # solar , engine) + rule_bank_setup.setup(session) # solar , engine) activator() - compute_formula_execution_order() # solar session, engine) + rule_bank_setup.compute_formula_execution_order() # solar session, engine) class Rule: diff --git a/logic_bank/rule_bank/rule_bank_setup.py b/logic_bank/rule_bank/rule_bank_setup.py index 98c9765..3ad84c9 100644 --- a/logic_bank/rule_bank/rule_bank_setup.py +++ b/logic_bank/rule_bank/rule_bank_setup.py @@ -11,11 +11,13 @@ def setup(a_session: session): # solar , an_engine: Engine): """ - Initialize the RuleBank + Create the RuleBank + + Register before_flush listeners """ rules_bank = RuleBank() - rules_bank._session = a_session + # rules_bank._session = a_session """ solar no rb.session... """ event.listen(a_session, "before_flush", before_flush) event.listen(a_session, "before_commit", before_commit) diff --git a/nw/basic_web_app/app/__init__.py b/nw/basic_web_app/app/__init__.py index 4c143ec..514b3b0 100644 --- a/nw/basic_web_app/app/__init__.py +++ b/nw/basic_web_app/app/__init__.py @@ -1,6 +1,4 @@ import logging -import os -import sys from flask import Flask from flask_appbuilder import AppBuilder, SQLA @@ -10,35 +8,15 @@ use_rules = True if use_rules: - cwd = os.getcwd() # eg, /Users/val/python/pycharm/logic-bank/basic_web_app - required_path_python_rules = cwd # seeking /Users/val/python/pycharm/logic-bank - required_path_python_rules = required_path_python_rules.replace("/nw/basic_web_app", "") - required_path_python_rules = required_path_python_rules.replace("\\nw\\basic_web_app", "") - required_path_python_rules = required_path_python_rules.replace("\\\\", "\\") # you cannot be serious - - sys_path = "" - required_path_present = False - for each_node in sys.path: - sys_path += each_node + "\n" - if each_node == required_path_python_rules: - required_path_present = True - print("\n sys.path...\n" + sys_path) - if not required_path_present: - print("basic_web_app/app/__init__.py fixing path (so can run from terminal) with: " + - required_path_python_rules) - sys.path.append(required_path_python_rules) - print("sys_path: " + str(sys.path)) - else: - pass - print("NOT Fixing path (default PyCharm, set in VSC Launch Config): " + - required_path_python_rules) + import logic_bank_utils.util as logic_bank_utils + (did_fix_path, sys_env_info) = \ + logic_bank_utils.add_python_path(project_dir="LogicBank", my_file=__file__) import nw.db.models as models # FIXME design prevents circular imports - from logic_bank.rule_bank import rule_bank_setup - from nw.logic import declare_logic + from nw.logic.rules_bank import declare_logic - from logic_bank.logic_bank import LogicBank + from logic_bank.logic_bank import LogicBank # activate rules (calls declare_logic) """ Logging configuration diff --git a/nw/db/__init__.py b/nw/db/__init__.py index e69de29..e792ef8 100644 --- a/nw/db/__init__.py +++ b/nw/db/__init__.py @@ -0,0 +1,24 @@ +import os +import sqlalchemy +from sqlalchemy.orm import session + + +class DB: + """ + Opens the database + + Sets instance variables session, engine + """ + def __init__(self): + # def open_database() -> (sqlalchemy.orm.session.Session, sqlalchemy.engine.base.Engine): + basedir = os.path.abspath(os.path.dirname(__file__)) + basedir = os.path.dirname(basedir) + + nw_loc = os.path.join(basedir, "db/database.db") + + conn_string = "sqlite:///" + nw_loc + self.engine = sqlalchemy.create_engine(conn_string, echo=False) # sqlalchemy sqls... + + session_maker = sqlalchemy.orm.sessionmaker() + session_maker.configure(bind=self.engine) + self.session = session_maker() diff --git a/nw/logic/__init__.py b/nw/logic/__init__.py index 6065468..e69de29 100644 --- a/nw/logic/__init__.py +++ b/nw/logic/__init__.py @@ -1,68 +0,0 @@ -import os - -import sqlalchemy -from sqlalchemy.orm import session - -from logic_bank.logic_bank import LogicBank -from nw.logic.rules_bank import declare_logic - -import nw.logic.legacy.setup as legacy_setup - -from logic_bank.util import prt - -""" Initialization -1 - Connect -2 - Register listeners (either hand-coded ones above, or the logic-engine listeners). -""" - -print("\n") -print("*********************") -print(prt("BEGIN - setup logging, connect to db, register listeners")) -print("*********************") - -# Initialize Logging -import logging -import sys - -logic_logger = logging.getLogger('logic_logger') # for debugging user logic -logic_logger.setLevel(logging.DEBUG) -handler = logging.StreamHandler(sys.stdout) -handler.setLevel(logging.DEBUG) -formatter = logging.Formatter('%(message)s - %(asctime)s - %(name)s - %(levelname)s') -handler.setFormatter(formatter) -logic_logger.addHandler(handler) - -do_engine_logging = False -engine_logger = logging.getLogger('engine_logger') # for internals -if do_engine_logging: - engine_logger.setLevel(logging.DEBUG) - handler = logging.StreamHandler(sys.stdout) - handler.setLevel(logging.DEBUG) - formatter = logging.Formatter('%(message)s - %(asctime)s - %(name)s - %(levelname)s') - handler.setFormatter(formatter) - engine_logger.addHandler(handler) - -basedir = os.path.abspath(os.path.dirname(__file__)) -basedir = os.path.dirname(basedir) - -nw_loc = os.path.join(basedir, "db/database.db") - -conn_string = "sqlite:///" + nw_loc -engine = sqlalchemy.create_engine(conn_string, echo=False) # sqlalchemy sqls... - -session_maker = sqlalchemy.orm.sessionmaker() -session_maker.configure(bind=engine) -session = session_maker() - -by_rules = True # True => use rules, False => use legacy hand code (for comparison) -rule_list = None -db = None -if by_rules: - LogicBank.activate(session=session, activator=declare_logic) -else: - legacy_setup.setup(session) # ignore test asserts that fail due to (unimplemenmted) counts (else ok) - -print("\n") -print("*********************") -print(prt("END - connected, session created, listeners registered")) -print("*********************") diff --git a/nw/tests/__init__.py b/nw/tests/__init__.py index 6d00330..682cc37 100644 --- a/nw/tests/__init__.py +++ b/nw/tests/__init__.py @@ -10,6 +10,9 @@ def copy_gold_over_db(): """ copy db/database-gold.db over db/database.db""" + # import time + # time.sleep(1) + basedir = os.path.abspath(os.path.dirname(__file__)) basedir = os.path.dirname(basedir) @@ -22,32 +25,85 @@ def copy_gold_over_db(): nw_source = os.path.join(basedir, "db/database-gold.db") copyfile(src=nw_source, dst=nw_loc) +def setup_logging(): + # Initialize Logging + import logging + import sys + + logic_logger = logging.getLogger('logic_logger') # for debugging user logic + logic_logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler(sys.stdout) + handler.setLevel(logging.DEBUG) + formatter = logging.Formatter('%(message)s - %(asctime)s - %(name)s - %(levelname)s') + handler.setFormatter(formatter) + logic_logger.addHandler(handler) + + do_engine_logging = False + engine_logger = logging.getLogger('engine_logger') # for internals + if do_engine_logging: + engine_logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler(sys.stdout) + handler.setLevel(logging.DEBUG) + formatter = logging.Formatter('%(message)s - %(asctime)s - %(name)s - %(levelname)s') + handler.setFormatter(formatter) + engine_logger.addHandler(handler) + + +def setUp(test: object, file: str): + """ + SETUP - logging, connect to db, register listeners, activate logic + """ + + print("\n") + print("*********************") + print("BEGIN SETUP - logging, connect to db, register listeners, activate logic") + print("*********************") -def setUp(file: str): copy_gold_over_db() + setup_logging() + + from logic_bank.logic_bank import LogicBank + from nw.logic.rules_bank import declare_logic + + import nw.logic.legacy.setup as legacy_setup + + import nw.db as open_db + test.db = open_db.DB() + test.session = test.db.session + test.engine = test.db.engine + + by_rules = True # True => use rules, False => use legacy hand code (for comparison) + if by_rules: + LogicBank.activate(session=test.session, activator=declare_logic) + else: + legacy_setup.setup(test.session) # ignore test asserts that fail due to (unimplemented) counts (else ok) + print("\n") print("**********************") - print("** Setup complete - test execution begins for: " + file) + print("** END SETUP - logging, database and logic are setup") + print("** Test execution begins for: " + file) + print("** Session: " + str(test.session)) print("** Started: " + str(datetime.now())) print("** Following log best viewed without word wrap") print("**********************") + print("\n") -def tearDown(file: str, started_at: str, engine: sqlalchemy.engine.base.Engine, session: sqlalchemy.orm.session.Session): +def tearDown(file: str, started_at: str, test: object): """ close session & engine, banner :param file: caller, usually __file__ :param started_at: eg, str(datetime.now()) - :param engine: eg, nw.logic import session, engine - :param session: from nw.logic import session, engine + :param test: test instance :return: """ - session.close() - engine.dispose() + test.session.close() + test.engine.dispose() print("\n") print("**********************") - print("** Test complete, SQLAlchemy session/engine closed for: " + file) + print("** Test tearDown complete, SQLAlchemy session/engine closed for: " + file) + print("** Session: " + str(test.session)) print("** Started: " + started_at + " Ended: " + str(datetime.now())) print("**********************") diff --git a/nw/tests/test_add_cust.py b/nw/tests/test_add_cust.py index 54c8d65..172b821 100644 --- a/nw/tests/test_add_cust.py +++ b/nw/tests/test_add_cust.py @@ -14,13 +14,11 @@ print("Started from unittest: " + __name__) import nw.tests as tests # careful - this must follow add_python_path, above - tests.copy_gold_over_db() - import nw.db.models as models - from nw.logic import session, engine # opens db, activates rules <-- from logic_bank.exec_row_logic.logic_row import LogicRow # must follow import of models - from logic_bank.util import prt, row_prt + from logic_bank.util import prt, row_prt, ConstraintException + print("\n" + sys_env_info + "\n\n") @@ -28,28 +26,32 @@ class Test(unittest.TestCase): def setUp(self): # banner self.started_at = str(datetime.now()) - tests.setUp(file=__file__) + self.session = None + self.engine = None + + tests.setUp(test=self, file=__file__) + pass def tearDown(self): - tests.tearDown(file=__file__, started_at=self.started_at, engine=engine, session=session) + tests.tearDown(file=__file__, started_at=self.started_at, test=self) def test_run(self): # first delete, so can add - delete_cust = session.query(models.Customer).filter(models.Customer.Id == "$$New Cust").delete() + delete_cust = self.session.query(models.Customer).filter(models.Customer.Id == "$$New Cust").delete() print("\nadd_cust, deleting: " + str(delete_cust) + "\n\n") - session.commit() + self.session.commit() # Add a Customer - works new_cust = models.Customer(Id="$$New Cust", Balance=0, CreditLimit=0) - session.add(new_cust) - session.commit() + self.session.add(new_cust) + self.session.commit() - verify_cust = session.query(models.Customer).filter(models.Customer.Id == "$$New Cust").one() + verify_cust = self.session.query(models.Customer).filter(models.Customer.Id == "$$New Cust").one() print("\nadd_cust, verified: " + str(verify_cust) + "\n\n") from sqlalchemy.sql import func - qry = session.query(models.Order.CustomerId, func.sum(models.Order.AmountTotal))\ + qry = self.session.query(models.Order.CustomerId, func.sum(models.Order.AmountTotal))\ .filter(models.Order.CustomerId == "ALFKI", models.Order.ShippedDate == None) qry = qry.group_by(models.Order.CustomerId) for _res in qry.all(): diff --git a/nw/tests/test_add_order.py b/nw/tests/test_add_order.py index e163a3f..66c7c39 100644 --- a/nw/tests/test_add_order.py +++ b/nw/tests/test_add_order.py @@ -14,10 +14,7 @@ print("Started from unittest: " + __name__) import nw.tests as tests # careful - this must follow add_python_path, above - tests.copy_gold_over_db() - import nw.db.models as models - from nw.logic import session, engine # opens db, activates rules <-- from logic_bank.exec_row_logic.logic_row import LogicRow # must follow import of models from logic_bank.util import prt, row_prt, ConstraintException @@ -29,15 +26,18 @@ class Test(unittest.TestCase): def setUp(self): # banner self.started_at = str(datetime.now()) - tests.setUp(file=__file__) + self.session = None + self.engine = None + + tests.setUp(test=self, file=__file__) + pass def tearDown(self): - tests.tearDown(file=__file__, started_at=self.started_at, engine=engine, session=session) + tests.tearDown(file=__file__, started_at=self.started_at, test=self) def test_run(self): - pre_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - session.expunge(pre_cust) - + pre_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + self.session.expunge(pre_cust) """ Test 1 - should fail due to credit limit exceeded @@ -45,7 +45,7 @@ def test_run(self): bad_order = models.Order(AmountTotal=0, CustomerId="ALFKI", ShipCity="Richmond", EmployeeId=6, Freight=1) - session.add(bad_order) + self.session.add(bad_order) # OrderDetails - https://docs.sqlalchemy.org/en/13/orm/backref.html bad_item1 = models.OrderDetail(ProductId=1, Amount=0, @@ -58,10 +58,10 @@ def test_run(self): bad_order.OrderDetailList.append(bad_item2) did_fail_as_expected = False try: - session.commit() + self.session.commit() except ConstraintException as ce: print("Expected constraint: " + str(ce)) - session.rollback() + self.session.rollback() did_fail_as_expected = True except: self.fail("Unexpected Exception Type") @@ -77,9 +77,8 @@ def test_run(self): bad_order = models.Order(AmountTotal=0, CustomerId="ALFKI", ShipCity="Richmond", EmployeeId=2, Freight=1) - session.add(bad_order) + self.session.add(bad_order) - # OrderDetails - https://docs.sqlalchemy.org/en/13/orm/backref.html bad_item1 = models.OrderDetail(ProductId=1, Amount=0, Quantity=1, UnitPrice=18, Discount=0) @@ -90,9 +89,9 @@ def test_run(self): bad_order.OrderDetailList.append(bad_item2) did_fail_as_expected = False try: - session.commit() + self.session.commit() except ConstraintException: - session.rollback() + self.session.rollback() did_fail_as_expected = True except: print("Unexpected Exception Type") @@ -109,9 +108,8 @@ def test_run(self): new_order = models.Order(AmountTotal=0, CustomerId="ALFKI", ShipCity="Richmond", EmployeeId=6, Freight=1) - session.add(new_order) + self.session.add(new_order) - # OrderDetails - https://docs.sqlalchemy.org/en/13/orm/backref.html new_item1 = models.OrderDetail(ProductId=1, Amount=0, Quantity=1, UnitPrice=18, Discount=0) @@ -120,9 +118,9 @@ def test_run(self): Quantity=2, UnitPrice=18, Discount=0) new_order.OrderDetailList.append(new_item2) - session.commit() + self.session.commit() - post_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + post_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() print("\nadd_order, update completed - analyzing results..\n\n") @@ -133,7 +131,7 @@ def test_run(self): row_prt(new_item1, "\nnew Order Detail 1 Result") # 1 Chai @ $18 row_prt(new_item2, "\nnew Order Detail 2 Result") # 2 Chang @ $19 = $38 - logic_row = LogicRow(row=post_cust, old_row=pre_cust, ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + logic_row = LogicRow(row=post_cust, old_row=pre_cust, ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) if post_cust.Balance == pre_cust.Balance + 56: logic_row.log("Correct adjusted Customer Result") assert True @@ -147,7 +145,7 @@ def test_run(self): self.fail(logic_row.log("Error - unexpected OrderCounts - did not increase by 1")) from sqlalchemy.sql import func - qry = session.query(models.Order.CustomerId, + qry = self.session.query(models.Order.CustomerId, func.sum(models.Order.AmountTotal).label('sql_balance'))\ .filter(models.Order.CustomerId == "ALFKI", models.Order.ShippedDate == None) qry = qry.group_by(models.Order.CustomerId).one() diff --git a/nw/tests/test_dlt_order.py b/nw/tests/test_dlt_order.py index 7b3dde9..fd2028f 100644 --- a/nw/tests/test_dlt_order.py +++ b/nw/tests/test_dlt_order.py @@ -13,16 +13,12 @@ exit(0) else: print("Started from unittest: " + __name__) - import nw.tests as tests # careful - this must follow add_python_path, above - tests.copy_gold_over_db() - import nw.db.models as models - from nw.logic import session, engine # opens db, activates rules <-- from logic_bank.exec_row_logic.logic_row import LogicRow # must follow import of models - from logic_bank.util import prt, row_prt + from logic_bank.util import prt, row_prt, ConstraintException print("\n" + sys_env_info + "\n\n") @@ -31,24 +27,28 @@ class Test(unittest.TestCase): def setUp(self): # banner self.started_at = str(datetime.now()) - tests.setUp(file=__file__) + self.session = None + self.engine = None + + tests.setUp(test=self, file=__file__) + pass def tearDown(self): - tests.tearDown(file=__file__, started_at=self.started_at, engine=engine, session=session) + tests.tearDown(file=__file__, started_at=self.started_at, test=self) def test_run(self): self.toggle_order_shipped() - pre_adjusted_product = session.query(models.Product).filter(models.Product.Id == 58).one() - session.expunge(pre_adjusted_product) + pre_adjusted_product = self.session.query(models.Product).filter(models.Product.Id == 58).one() + self.session.expunge(pre_adjusted_product) print("\ndlt_order, shipped... now delete") - delete_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - session.delete(delete_cust) - session.commit() + delete_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + self.session.delete(delete_cust) + self.session.commit() - post_adjusted_product = session.query(models.Product).filter(models.Product.Id == 58).one() + post_adjusted_product = self.session.query(models.Product).filter(models.Product.Id == 58).one() logic_row = LogicRow(row=post_adjusted_product, old_row=pre_adjusted_product, ins_upd_dlt="*", nest_level=0, - a_session=session, row_sets=None) + a_session=self.session, row_sets=None) if post_adjusted_product.UnitsShipped == pre_adjusted_product.UnitsShipped - 40: logic_row.log("Product adjusted properly on delete customer") else: @@ -61,24 +61,24 @@ def test_run(self): def toggle_order_shipped(self): """ toggle Shipped Date, to trigger balance adjustment """ - pre_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - pre_adjusted_product = session.query(models.Product).filter(models.Product.Id == 58).one() - session.expunge(pre_cust) - session.expunge(pre_adjusted_product) + pre_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + pre_adjusted_product = self.session.query(models.Product).filter(models.Product.Id == 58).one() + self.session.expunge(pre_cust) + self.session.expunge(pre_adjusted_product) print("") - test_order = session.query(models.Order).filter(models.Order.Id == 11011).join(models.Employee).one() + test_order = self.session.query(models.Order).filter(models.Order.Id == 11011).join(models.Employee).one() if test_order.ShippedDate is None or test_order.ShippedDate == "": test_order.ShippedDate = str(datetime.now()) print(prt("Shipping order - ShippedDate: ['' -> " + test_order.ShippedDate + "]")) else: test_order.ShippedDate = None print(prt("Returning order - ShippedDate: [ -> None]")) - session.commit() + self.session.commit() print("") - post_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - logic_row = LogicRow(row=post_cust, old_row=pre_cust, ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + post_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + logic_row = LogicRow(row=post_cust, old_row=pre_cust, ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) if abs(post_cust.Balance - pre_cust.Balance) == 960: logic_row.log("Correct adjusted Customer Result") @@ -96,9 +96,9 @@ def toggle_order_shipped(self): else: self.fail(logic_row.log("Error - UnpaidOrderCount should be 2")) - post_adjusted_product = session.query(models.Product).filter(models.Product.Id == 58).one() + post_adjusted_product = self.session.query(models.Product).filter(models.Product.Id == 58).one() logic_row = LogicRow(row=post_adjusted_product, old_row=pre_adjusted_product, ins_upd_dlt="*", nest_level=0, - a_session=session, row_sets=None) + a_session=self.session, row_sets=None) if post_adjusted_product.UnitsShipped == pre_adjusted_product.UnitsShipped + 40: logic_row.log("Product adjusted properly on ship order") else: diff --git a/nw/tests/test_upd_employee_salary.py b/nw/tests/test_upd_employee_salary.py index f132a56..55b4133 100644 --- a/nw/tests/test_upd_employee_salary.py +++ b/nw/tests/test_upd_employee_salary.py @@ -15,13 +15,11 @@ print("Started from unittest: " + __name__) import nw.tests as tests # careful - this must follow add_python_path, above - tests.copy_gold_over_db() - import nw.db.models as models - from nw.logic import session, engine # opens db, activates rules <-- from logic_bank.exec_row_logic.logic_row import LogicRow # must follow import of models - from logic_bank.util import prt, row_prt + from logic_bank.util import prt, row_prt, ConstraintException + print("\n" + sys_env_info + "\n\n") @@ -29,10 +27,14 @@ class Test(unittest.TestCase): def setUp(self): # banner self.started_at = str(datetime.now()) - tests.setUp(file=__file__) + self.session = None + self.engine = None + + tests.setUp(test=self, file=__file__) + pass def tearDown(self): - tests.tearDown(file=__file__, started_at=self.started_at, engine=engine, session=session) + tests.tearDown(file=__file__, started_at=self.started_at, test=self) def test_run(self): @@ -41,15 +43,15 @@ def test_run(self): should fail due to credit limit exceeded (catch exception to verify) """ - bad_employee_raise = session.query(models.Employee).filter(models.Employee.Id == 1).one() + bad_employee_raise = self.session.query(models.Employee).filter(models.Employee.Id == 1).one() bad_employee_raise.Salary = bad_employee_raise.Salary * Decimal('1.1') did_fail_as_expected = False try: - session.commit() + self.session.commit() except: - session.rollback() + self.session.rollback() did_fail_as_expected = True if not did_fail_as_expected: diff --git a/nw/tests/test_upd_order_customer.py b/nw/tests/test_upd_order_customer.py index b00335d..3aaea5c 100644 --- a/nw/tests/test_upd_order_customer.py +++ b/nw/tests/test_upd_order_customer.py @@ -14,13 +14,11 @@ print("Started from unittest: " + __name__) import nw.tests as tests # careful - this must follow add_python_path, above - tests.copy_gold_over_db() - import nw.db.models as models - from nw.logic import session, engine # opens db, activates rules <-- from logic_bank.exec_row_logic.logic_row import LogicRow # must follow import of models - from logic_bank.util import prt, row_prt + from logic_bank.util import prt, row_prt, ConstraintException + print("\n" + sys_env_info + "\n\n") @@ -28,34 +26,38 @@ class Test(unittest.TestCase): def setUp(self): # banner self.started_at = str(datetime.now()) - tests.setUp(file=__file__) + self.session = None + self.engine = None + + tests.setUp(test=self, file=__file__) + pass def tearDown(self): - tests.tearDown(file=__file__, started_at=self.started_at, engine=engine, session=session) + tests.tearDown(file=__file__, started_at=self.started_at, test=self) def test_run(self): - pre_alfki = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - pre_anatr = session.query(models.Customer).filter(models.Customer.Id == "ANATR").one() - session.expunge(pre_alfki) - session.expunge(pre_anatr) + pre_alfki = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + pre_anatr = self.session.query(models.Customer).filter(models.Customer.Id == "ANATR").one() + self.session.expunge(pre_alfki) + self.session.expunge(pre_anatr) if pre_alfki.Balance != 1016: self.fail("pre_alfki balance not 1016 (database-gold not copied?), value: " + str(pre_alfki.Balance)) print("") - test_order = session.query(models.Order).filter(models.Order.Id == 11011).one() # type : Order + test_order = self.session.query(models.Order).filter(models.Order.Id == 11011).one() # type : Order amount_total = test_order.AmountTotal if test_order.CustomerId == "ALFKI": test_order.CustomerId = "ANATR" else: test_order.CustomerId = "ALFKI" print(prt("Reparenting order - new CustomerId: " + test_order.CustomerId)) - session.commit() + self.session.commit() print("") - post_alfki = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - logic_row = LogicRow(row=post_alfki, old_row=pre_alfki, ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + post_alfki = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + logic_row = LogicRow(row=post_alfki, old_row=pre_alfki, ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) if abs(post_alfki.Balance - pre_alfki.Balance) == 960: logic_row.log("Correct adjusted Customer Result") @@ -63,8 +65,8 @@ def test_run(self): else: self.fail(logic_row.log("Incorrect adjusted Customer Result - expected 960 difference")) - post_anatr = session.query(models.Customer).filter(models.Customer.Id == "ANATR").one() - logic_row = LogicRow(row=post_anatr, old_row=pre_anatr, ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + post_anatr = self.session.query(models.Customer).filter(models.Customer.Id == "ANATR").one() + logic_row = LogicRow(row=post_anatr, old_row=pre_anatr, ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) if abs(post_anatr.Balance - pre_anatr.Balance) == 960: logic_row.log("Correct adjusted Customer Result") diff --git a/nw/tests/test_upd_order_required.py b/nw/tests/test_upd_order_required.py index 4cedb06..f95b70e 100644 --- a/nw/tests/test_upd_order_required.py +++ b/nw/tests/test_upd_order_required.py @@ -15,13 +15,11 @@ print("Started from unittest: " + __name__) import nw.tests as tests # careful - this must follow add_python_path, above - tests.copy_gold_over_db() - import nw.db.models as models - from nw.logic import session, engine # opens db, activates rules <-- from logic_bank.exec_row_logic.logic_row import LogicRow # must follow import of models - from logic_bank.util import prt, row_prt + from logic_bank.util import prt, row_prt, ConstraintException + print("\n" + sys_env_info + "\n\n") @@ -29,10 +27,14 @@ class Test(unittest.TestCase): def setUp(self): # banner self.started_at = str(datetime.now()) - tests.setUp(file=__file__) + self.session = None + self.engine = None + + tests.setUp(test=self, file=__file__) + pass def tearDown(self): - tests.tearDown(file=__file__, started_at=self.started_at, engine=engine, session=session) + tests.tearDown(file=__file__, started_at=self.started_at, test=self) def test_run(self): @@ -41,22 +43,22 @@ def test_run(self): session.query(Customer).join(Invoice).filter(Invoice.amount == 8500).all() """ - pre_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - session.expunge(pre_cust) + pre_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + self.session.expunge(pre_cust) print("") - test_order = session.query(models.Order).filter(models.Order.Id == 11011).join(models.Employee).one() + test_order = self.session.query(models.Order).filter(models.Order.Id == 11011).join(models.Employee).one() if test_order.RequiredDate is None or test_order.RequiredDate == "": test_order.RequiredDate = str(datetime.now()) print(prt("Shipping order - RequiredDate: ['' -> " + test_order.RequiredDate + "]")) else: test_order.RequiredDate = None print(prt("Returning order - RequiredDate: [ -> None]")) - session.commit() + self.session.commit() print("") - post_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - logic_row = LogicRow(row=pre_cust, old_row=post_cust, ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + post_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + logic_row = LogicRow(row=pre_cust, old_row=post_cust, ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) # logic_row.row.Balance = 0 # force error (for debug) if abs(post_cust.Balance - pre_cust.Balance) == 0: diff --git a/nw/tests/test_upd_order_reuse.py b/nw/tests/test_upd_order_reuse.py index 5040563..db5af40 100644 --- a/nw/tests/test_upd_order_reuse.py +++ b/nw/tests/test_upd_order_reuse.py @@ -15,13 +15,11 @@ print("Started from unittest: " + __name__) import nw.tests as tests # careful - this must follow add_python_path, above - tests.copy_gold_over_db() - import nw.db.models as models - from nw.logic import session, engine # opens db, activates rules <-- from logic_bank.exec_row_logic.logic_row import LogicRow # must follow import of models - from logic_bank.util import prt, row_prt + from logic_bank.util import prt, row_prt, ConstraintException + print("\n" + sys_env_info + "\n\n") @@ -29,10 +27,14 @@ class Test(unittest.TestCase): def setUp(self): # banner self.started_at = str(datetime.now()) - tests.setUp(file=__file__) + self.session = None + self.engine = None + + tests.setUp(test=self, file=__file__) + pass def tearDown(self): - tests.tearDown(file=__file__, started_at=self.started_at, engine=engine, session=session) + tests.tearDown(file=__file__, started_at=self.started_at, test=self) def test_run(self): @@ -44,28 +46,28 @@ def test_run(self): b. A different Quantity """ - pre_alfki = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - pre_anatr = session.query(models.Customer).filter(models.Customer.Id == "ANATR").one() + pre_alfki = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + pre_anatr = self.session.query(models.Customer).filter(models.Customer.Id == "ANATR").one() logic_row = LogicRow(row=pre_alfki, old_row=pre_alfki, - ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) logic_row.log("starting") logic_row = LogicRow(row=pre_anatr, old_row=pre_anatr, - ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) logic_row.log("starting") - pre_order = session.query(models.Order).filter(models.Order.Id == 11011).one() # type : Order + pre_order = self.session.query(models.Order).filter(models.Order.Id == 11011).one() # type : Order logic_row = LogicRow(row=pre_order, old_row=pre_order, - ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) logic_row.log("starting") - session.expunge(pre_alfki) - session.expunge(pre_anatr) - session.expunge(pre_order) + self.session.expunge(pre_alfki) + self.session.expunge(pre_anatr) + self.session.expunge(pre_order) print("") - test_order = session.query(models.Order).filter(models.Order.Id == 11011).one() # type : Order + test_order = self.session.query(models.Order).filter(models.Order.Id == 11011).one() # type : Order test_order_details = test_order.OrderDetailList changed_order_detail = None for each_order_detail in test_order_details: @@ -84,21 +86,21 @@ def test_run(self): print("\n" + prt("Reparenting *altered* order - new CustomerId: " + test_order.CustomerId)) print(f'order amount {pre_amount_total} projected to be {post_amount_total}') - session.commit() + self.session.commit() print('') msg = 'Committed... order.amountTotal ' + \ str(pre_amount_total) + ' -> ' + \ str(post_amount_total) logic_row = LogicRow(row=test_order, old_row=pre_order, - ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) logic_row.log(msg) print("\n") - post_alfki = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + post_alfki = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() logic_row = LogicRow(row=post_alfki, old_row=pre_alfki, - ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) if post_alfki.Balance == 56: logic_row.log("Correct non-adjusted Customer Result") @@ -107,9 +109,9 @@ def test_run(self): msg = "ERROR - incorrect adjusted Customer Result, " + "should be 56" self.fail(logic_row.log(msg)) - post_anatr = session.query(models.Customer).filter(models.Customer.Id == "ANATR").one() + post_anatr = self.session.query(models.Customer).filter(models.Customer.Id == "ANATR").one() logic_row = LogicRow(row=post_anatr, old_row=pre_anatr, - ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) if post_anatr.Balance == 557.50: logic_row.log("Correct non-adjusted Customer Result") diff --git a/nw/tests/test_upd_order_shipped.py b/nw/tests/test_upd_order_shipped.py index 3c6df68..0a15f41 100644 --- a/nw/tests/test_upd_order_shipped.py +++ b/nw/tests/test_upd_order_shipped.py @@ -15,13 +15,11 @@ print("Started from unittest: " + __name__) import nw.tests as tests # careful - this must follow add_python_path, above - tests.copy_gold_over_db() - import nw.db.models as models - from nw.logic import session, engine # opens db, activates rules <-- from logic_bank.exec_row_logic.logic_row import LogicRow # must follow import of models - from logic_bank.util import prt, row_prt + from logic_bank.util import prt, row_prt, ConstraintException + print("\n" + sys_env_info + "\n\n") @@ -29,10 +27,14 @@ class Test(unittest.TestCase): def setUp(self): # banner self.started_at = str(datetime.now()) - tests.setUp(file=__file__) + self.session = None + self.engine = None + + tests.setUp(test=self, file=__file__) + pass def tearDown(self): - tests.tearDown(file=__file__, started_at=self.started_at, engine=engine, session=session) + tests.tearDown(file=__file__, started_at=self.started_at, test=self) def test_run(self): self.toggle_order_shipped() @@ -48,22 +50,22 @@ def toggle_order_shipped(self): also test join """ - pre_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - session.expunge(pre_cust) + pre_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + self.session.expunge(pre_cust) print("") - test_order = session.query(models.Order).filter(models.Order.Id == 11011).join(models.Employee).one() + test_order = self.session.query(models.Order).filter(models.Order.Id == 11011).join(models.Employee).one() if test_order.ShippedDate is None or test_order.ShippedDate == "": test_order.ShippedDate = str(datetime.now()) print(prt("Shipping order - ShippedDate: ['' -> " + test_order.ShippedDate + "]")) else: test_order.ShippedDate = None print(prt("Returning order - ShippedDate: [ -> None]")) - session.commit() + self.session.commit() print("") - post_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - logic_row = LogicRow(row=post_cust, old_row=pre_cust, ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + post_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + logic_row = LogicRow(row=post_cust, old_row=pre_cust, ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) if abs(post_cust.Balance - pre_cust.Balance) == 960: logic_row.log("Correct adjusted Customer Result") diff --git a/nw/tests/test_upd_order_shipped_auto_commit.py b/nw/tests/test_upd_order_shipped_auto_commit.py index bc3057a..ed1ef48 100644 --- a/nw/tests/test_upd_order_shipped_auto_commit.py +++ b/nw/tests/test_upd_order_shipped_auto_commit.py @@ -15,13 +15,11 @@ print("Started from unittest: " + __name__) import nw.tests as tests # careful - this must follow add_python_path, above - tests.copy_gold_over_db() - import nw.db.models as models - from nw.logic import session, engine # opens db, activates rules <-- from logic_bank.exec_row_logic.logic_row import LogicRow # must follow import of models - from logic_bank.util import prt, row_prt + from logic_bank.util import prt, row_prt, ConstraintException + print("\n" + sys_env_info + "\n\n") @@ -29,13 +27,17 @@ class Test(unittest.TestCase): def setUp(self): # banner self.started_at = str(datetime.now()) - tests.setUp(file=__file__) + self.session = None + self.engine = None + + tests.setUp(test=self, file=__file__) + pass def tearDown(self): - tests.tearDown(file=__file__, started_at=self.started_at, engine=engine, session=session) + tests.tearDown(file=__file__, started_at=self.started_at, test=self) def test_run(self): - with engine.connect().execution_options(autocommit=True) as conn: + with self.engine.connect().execution_options(autocommit=True) as conn: self.toggle_order_shipped() print("\nupd_order_shipped_auto_commit, ran to completion") @@ -45,11 +47,11 @@ def toggle_order_shipped(self): session.query(Customer).join(Invoice).filter(Invoice.amount == 8500).all() """ - pre_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - session.expunge(pre_cust) + pre_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + self.session.expunge(pre_cust) print("") - test_order = session.query(models.Order).filter(models.Order.Id == 11011).join(models.Employee).one() + test_order = self.session.query(models.Order).filter(models.Order.Id == 11011).join(models.Employee).one() if test_order.ShippedDate is None or test_order.ShippedDate == "": # with restored db, cust[ALFKI] has bal 960 & 3 unpaid orders, Order[11011) is 960, unshipped test_order.ShippedDate = str(datetime.now()) @@ -62,8 +64,8 @@ def toggle_order_shipped(self): # session.commit() print("") - post_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - logic_row = LogicRow(row=post_cust, old_row=pre_cust, ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + post_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + logic_row = LogicRow(row=post_cust, old_row=pre_cust, ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) if abs(post_cust.Balance - pre_cust.Balance) == 960: logic_row.log("Correct adjusted Customer Result") diff --git a/nw/tests/test_upd_orderclass_required.py b/nw/tests/test_upd_orderclass_required.py index 285b0bd..e80ee40 100644 --- a/nw/tests/test_upd_orderclass_required.py +++ b/nw/tests/test_upd_orderclass_required.py @@ -15,13 +15,11 @@ print("Started from unittest: " + __name__) import nw.tests as tests # careful - this must follow add_python_path, above - tests.copy_gold_over_db() - import nw.db.models as models - from nw.logic import session, engine # opens db, activates rules <-- from logic_bank.exec_row_logic.logic_row import LogicRow # must follow import of models - from logic_bank.util import prt, row_prt + from logic_bank.util import prt, row_prt, ConstraintException + print("\n" + sys_env_info + "\n\n") @@ -29,31 +27,35 @@ class Test(unittest.TestCase): def setUp(self): # banner self.started_at = str(datetime.now()) - tests.setUp(file=__file__) + self.session = None + self.engine = None + + tests.setUp(test=self, file=__file__) + pass def tearDown(self): - tests.tearDown(file=__file__, started_at=self.started_at, engine=engine, session=session) + tests.tearDown(file=__file__, started_at=self.started_at, test=self) def test_run(self): """ test class <> table name """ - pre_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - session.expunge(pre_cust) + pre_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + self.session.expunge(pre_cust) print("") - test_order = session.query(models.OrderClass).filter(models.OrderClass.Id == 11011).join(models.Employee).one() + test_order = self.session.query(models.OrderClass).filter(models.OrderClass.Id == 11011).join(models.Employee).one() if test_order.RequiredDate is None or test_order.RequiredDate == "": test_order.RequiredDate = str(datetime.now()) print(prt("Shipping order - RequiredDate: ['' -> " + test_order.RequiredDate + "]")) else: test_order.RequiredDate = None print(prt("Returning order - RequiredDate: [ -> None]")) - session.commit() + self.session.commit() print("") - post_cust = session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() - logic_row = LogicRow(row=pre_cust, old_row=post_cust, ins_upd_dlt="*", nest_level=0, a_session=session, row_sets=None) + post_cust = self.session.query(models.Customer).filter(models.Customer.Id == "ALFKI").one() + logic_row = LogicRow(row=pre_cust, old_row=post_cust, ins_upd_dlt="*", nest_level=0, a_session=self.session, row_sets=None) # logic_row.row.Balance = 10 # force failure if abs(post_cust.Balance - pre_cust.Balance) == 0: