From d40a45fcbdbcc176478aa72b6837e2ee06ec0183 Mon Sep 17 00:00:00 2001 From: wiIliu Date: Mon, 9 Mar 2026 13:11:01 -0400 Subject: [PATCH 01/15] testing - crud unit tests CREATE --- orders_service/tests/conftest.py | 60 +++++++++++++ .../tests/crud/orders_table_test.py | 39 +++++++++ .../tests/factories/order_factory.py | 8 +- .../tests/integration_tests/conftest.py | 85 +++++++++---------- 4 files changed, 142 insertions(+), 50 deletions(-) create mode 100644 orders_service/tests/conftest.py create mode 100644 orders_service/tests/crud/orders_table_test.py diff --git a/orders_service/tests/conftest.py b/orders_service/tests/conftest.py new file mode 100644 index 0000000..158f0d6 --- /dev/null +++ b/orders_service/tests/conftest.py @@ -0,0 +1,60 @@ +import os + +os.environ.setdefault( + "DATABASE_URL", + "postgresql+psycopg://test1:test1@localhost:5432/orders_TEST" +) + +import pytest +from pathlib import Path +from alembic import command +from alembic.config import Config +from sqlalchemy import create_engine +from sqlalchemy.orm import Session, sessionmaker +from orders_service.tests.factories.order_factory import OrderFactory +from orders_service.app.core.config import settings +from orders_service.app.models.order import Order + + +@pytest.fixture(scope="session", autouse=True) +def migrate_db(): + base_dir = Path(__file__).resolve().parents[1] + alembic_path = base_dir / "alembic.ini" + + alembic_cfg = Config(str(alembic_path)) + # alembic_cfg = Config("orders_service/alembic.ini") + command.upgrade(alembic_cfg, "head") + print("[TEST] Database migrated") + + yield + + +engine = create_engine(settings.DATABASE_URL, pool_pre_ping=True) +TestingSession = sessionmaker( + autocommit=False, + autoflush=False, + bind=engine, +) + + +@pytest.fixture(scope="function", autouse=True) +def db(): + connection = engine.connect() + transaction = connection.begin() + session = TestingSession(bind=connection) + + yield session + + session.close() + transaction.rollback() + connection.close() + + +@pytest.fixture(autouse=True) +def set_session_for_factories(db: Session): + OrderFactory._meta.sqlalchemy_session = db + + +@pytest.fixture() +def fixture_order(db: Session): + return OrderFactory() diff --git a/orders_service/tests/crud/orders_table_test.py b/orders_service/tests/crud/orders_table_test.py new file mode 100644 index 0000000..0eb3474 --- /dev/null +++ b/orders_service/tests/crud/orders_table_test.py @@ -0,0 +1,39 @@ +from sqlalchemy.orm import Session # type: ignore + +from faker import Faker + +from orders_service.app.db_logic import crud +from orders_service.app.models.order import Order +from orders_service.app.schemas.order import OrderCreate +from orders_service.tests.factories.order_factory import OrderFactory + +def test_create_order(db: Session) -> None: + data: Order = OrderFactory.build(name="testFactory") + new_order = OrderCreate(**{ + "name": data.name, + "product": data.product, + "count": data.count, + "price": data.price, + }) + result = crud.create_order(db=db, new_order=new_order) + + # Assertions + orders = db.query(Order).all() + assert len(orders) == 1 + assert result.id is not None + assert result.name == data.name + + +def test_get_order_by_id(db: Session, fixture_order: Order) -> None: + stored_order = crud.get_order_by_id(db=db, order_id=fixture_order.id) + assert stored_order + assert fixture_order.id == stored_order.id + + +# def test_delete_todo(db: Session, todo: Todo) -> None: +# todo2 = crud.todo.remove(db=db, id=todo.id) +# todo3 = crud.todo.get(db=db, id=todo.id) +# assert todo3 is None +# assert todo2.id == todo.id +# assert todo2.title == todo.title +# assert todo2.owner_id == todo.owner_id \ No newline at end of file diff --git a/orders_service/tests/factories/order_factory.py b/orders_service/tests/factories/order_factory.py index fe126ab..0b030a2 100644 --- a/orders_service/tests/factories/order_factory.py +++ b/orders_service/tests/factories/order_factory.py @@ -8,9 +8,9 @@ class Meta: model = order.Order sqlalchemy_session_persistence = "flush" - id = uuid4 + # id = factory.LazyFunction(uuid4) name = factory.Faker("name") - product = "item" - count = random.randint(1, 100) - price = print(round(random.uniform(1.00, 1000.0), 2)) + product = factory.Sequence(lambda n: 'item %d' % n) + count = factory.Faker("random_int", min=1, max=100) + price = factory.Faker("pyfloat", left_digits=3, right_digits=2, positive=True) \ No newline at end of file diff --git a/orders_service/tests/integration_tests/conftest.py b/orders_service/tests/integration_tests/conftest.py index e2d7bf1..f950dcc 100644 --- a/orders_service/tests/integration_tests/conftest.py +++ b/orders_service/tests/integration_tests/conftest.py @@ -1,47 +1,40 @@ -import os - -os.environ.setdefault( - "DATABASE_URL", - "postgresql+psycopg://test1:test1@localhost:5432/orders_TEST" -) - import pytest -from pathlib import Path -from alembic import command -from alembic.config import Config -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker, Session +# from pathlib import Path +# from alembic import command +# from alembic.config import Config +# from sqlalchemy import create_engine +from sqlalchemy.orm import Session, sessionmaker from fastapi.testclient import TestClient from orders_service.app.main import create_app -from ..factories.order_factory import OrderFactory -from orders_service.app.core.config import settings +# from ..factories.order_factory import OrderFactory +# from orders_service.app.core.config import settings from orders_service.app.dependencies.db import get_db -print("\n[TEST] SQLAlchemy settings.DATABASE_URL =", settings.DATABASE_URL) -# print("[TEST] Alembic sqlalchemy.url =", alembic_cfg.get_main_option("sqlalchemy.url")) +# print("\n[TEST] SQLAlchemy settings.DATABASE_URL =", settings.DATABASE_URL) + -#TODO: path change - alembic.ini -@pytest.fixture(scope="session", autouse=True) -def migrate_db(): - base_dir = Path(__file__).resolve().parents[2] - alembic_path = base_dir / "alembic.ini" +# #TODO: path change - alembic.ini +# @pytest.fixture(scope="session", autouse=True) +# def migrate_db(): +# base_dir = Path(__file__).resolve().parents[2] +# alembic_path = base_dir / "alembic.ini" - alembic_cfg = Config(str(alembic_path)) - # alembic_cfg = Config("orders_service/alembic.ini") - command.upgrade(alembic_cfg, "head") +# alembic_cfg = Config(str(alembic_path)) +# # alembic_cfg = Config("orders_service/alembic.ini") +# command.upgrade(alembic_cfg, "head") +# print("[TEST] Database migrated") - yield +# yield -print("\n[TEST] SQLAlchemy settings.DATABASE_URL =", settings.DATABASE_URL) -# print("[TEST] Alembic sqlalchemy.url =", alembic_cfg.get_main_option("sqlalchemy.url")) +# print("\n[TEST] SQLAlchemy settings.DATABASE_URL =", settings.DATABASE_URL) -#TODO: put in function? -engine = create_engine(settings.DATABASE_URL) -TestingSession = sessionmaker( - autocommit=False, - autoflush=False, - bind=engine, -) +# #TODO: put in function? +# engine = create_engine(settings.DATABASE_URL) +# TestingSession = sessionmaker( +# autocommit=False, +# autoflush=False, +# bind=engine, +# ) @pytest.fixture @@ -56,19 +49,19 @@ def override_get_db(): app.dependency_overrides.clear() -@pytest.fixture(scope="function", autouse=True) -def db(): - connection = engine.connect() - transaction = connection.begin() - session = TestingSession(bind=connection) +# @pytest.fixture(scope="function", autouse=True) +# def db(): +# connection = engine.connect() +# transaction = connection.begin() +# session = TestingSession(bind=connection) - yield session +# yield session - session.close() - transaction.rollback() - connection.close() +# session.close() +# transaction.rollback() +# connection.close() -@pytest.fixture(autouse=True) -def set_session_for_factories(db: Session): - OrderFactory._meta.sqlalchemy_session = db +# @pytest.fixture(autouse=True) +# def set_session_for_factories(db: Session): +# OrderFactory._meta.sqlalchemy_session = db From b16a0e13af2f663ab38fe950413254a6afad4580 Mon Sep 17 00:00:00 2001 From: wiIliu Date: Mon, 9 Mar 2026 14:24:10 -0400 Subject: [PATCH 02/15] TESTS - CRUD Retrieve unit tests --- .../tests/crud/orders_table_test.py | 80 ++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/orders_service/tests/crud/orders_table_test.py b/orders_service/tests/crud/orders_table_test.py index 0eb3474..b9f510d 100644 --- a/orders_service/tests/crud/orders_table_test.py +++ b/orders_service/tests/crud/orders_table_test.py @@ -7,6 +7,8 @@ from orders_service.app.schemas.order import OrderCreate from orders_service.tests.factories.order_factory import OrderFactory + +### CREATE TESTS ### def test_create_order(db: Session) -> None: data: Order = OrderFactory.build(name="testFactory") new_order = OrderCreate(**{ @@ -23,11 +25,77 @@ def test_create_order(db: Session) -> None: assert result.id is not None assert result.name == data.name - +### RETRIEVE TESTS ### def test_get_order_by_id(db: Session, fixture_order: Order) -> None: stored_order = crud.get_order_by_id(db=db, order_id=fixture_order.id) assert stored_order assert fixture_order.id == stored_order.id + assert fixture_order.name == stored_order.name + +def test_get_order_by_id_not_found(db: Session) -> None: + OrderFactory.create_batch(5) + order = crud.get_order_by_id(db=db, order_id=9999) + assert order is None + + +def test_get_orders_all(db: Session) -> None: + OrderFactory.create_batch(50) + retrieved_orders = crud.get_orders(db=db) + assert len(retrieved_orders) == 50 + +def test_get_orders_empty_db(db: Session) -> None: + retrieved_orders = crud.get_orders(db=db) + assert retrieved_orders == [] + +def test_get_orders_by_name(db: Session) -> None: + target = "target_customer" + OrderFactory.create_batch(15, name="buffer customer") + OrderFactory.create_batch(10, name=target) + + retrieved_orders = crud.get_orders(db=db, name=target) + assert len(retrieved_orders) == 10 + assert all(order.name == target for order in retrieved_orders) + +def test_get_orders_by_product(db: Session) -> None: + target = "target_product" + OrderFactory.create_batch(15, product="buffer product") + OrderFactory.create_batch(10, product=target) + + retrieved_orders = crud.get_orders(db=db, product=target) + assert len(retrieved_orders) == 10 + assert all(order.product == target for order in retrieved_orders) + +def test_get_orders_by_all_filters(db: Session) -> None: + target_name = "target_customer" + target_product = "target_product" + + OrderFactory.create_batch(5, name="temp customer", product="temp product") + OrderFactory.create_batch(10, name=target_name, product="temp product 2") + OrderFactory.create_batch(12, name="temp customer 2", product=target_product) + OrderFactory.create_batch(6, name=target_name, product=target_product) + + retrieved_orders = crud.get_orders(db=db, name=target_name, product=target_product) + assert len(retrieved_orders) == 6 + assert all(order.name == target_name for order in retrieved_orders) + assert all(order.product == target_product for order in retrieved_orders) + +def test_get_orders_by_filters_no_match(db: Session) -> None: + target_name = "target_customer" + target_product = "target_product" + + OrderFactory.create_batch(5, name="temp customer", product="temp product") + OrderFactory.create_batch(10, name=target_name, product="temp product 2") + OrderFactory.create_batch(12, name="temp customer 2", product=target_product) + + retrieved_orders = crud.get_orders(db=db, name=target_name, product=target_product) + assert retrieved_orders == [] + + +### UPDATE TESTS ### + + + +### DELETE TESTS ### # def test_delete_todo(db: Session, todo: Todo) -> None: @@ -36,4 +104,12 @@ def test_get_order_by_id(db: Session, fixture_order: Order) -> None: # assert todo3 is None # assert todo2.id == todo.id # assert todo2.title == todo.title -# assert todo2.owner_id == todo.owner_id \ No newline at end of file +# assert todo2.owner_id == todo.owner_id + + + +# orders = [ +# OrderFactory(name=f"user{i}", product="widget") +# for i in range(100) +# ] + From 4ce8fd021324377963c238565395ba2331dbbca4 Mon Sep 17 00:00:00 2001 From: wiIliu Date: Mon, 9 Mar 2026 14:41:06 -0400 Subject: [PATCH 03/15] TESTS - CRUD Delete unit tests --- orders_service/app/db_logic/crud.py | 2 +- .../tests/crud/orders_table_test.py | 30 ++++++++++++++----- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/orders_service/app/db_logic/crud.py b/orders_service/app/db_logic/crud.py index c5c9392..0421df2 100644 --- a/orders_service/app/db_logic/crud.py +++ b/orders_service/app/db_logic/crud.py @@ -34,7 +34,7 @@ def get_orders(db: Session, name: str | None = None, product: str | None = None) def delete_by_id(db: Session, order_id: int): try: - result = get_order_by_id(db, order_id) #catch for none? + result = get_order_by_id(db, order_id) if not result: return None db.delete(result) diff --git a/orders_service/tests/crud/orders_table_test.py b/orders_service/tests/crud/orders_table_test.py index b9f510d..43004e0 100644 --- a/orders_service/tests/crud/orders_table_test.py +++ b/orders_service/tests/crud/orders_table_test.py @@ -96,16 +96,32 @@ def test_get_orders_by_filters_no_match(db: Session) -> None: ### DELETE TESTS ### +def test_delete_by_id(db: Session, fixture_order: Order) -> None: + result = crud.delete_by_id(db, order_id=fixture_order.id) + assert result + assert result.id == fixture_order.id + + deleted = db.query(Order).filter(Order.id == fixture_order.id).first() + assert deleted is None + +def test_delete_by_id_not_found(db: Session) -> None: + OrderFactory.create_batch(5) + order = crud.delete_by_id(db=db, order_id=9999) + assert order is None + +def test_delete_reduces_row_count(db: Session): + OrderFactory.create_batch(5) + order = db.query(Order).first() + crud.delete_by_id(db, order.id) + remaining = db.query(Order).count() + assert remaining == 4 -# def test_delete_todo(db: Session, todo: Todo) -> None: -# todo2 = crud.todo.remove(db=db, id=todo.id) -# todo3 = crud.todo.get(db=db, id=todo.id) -# assert todo3 is None -# assert todo2.id == todo.id -# assert todo2.title == todo.title -# assert todo2.owner_id == todo.owner_id +def test_delete_same_id_twice(db: Session, fixture_order: Order): + crud.delete_by_id(db, fixture_order.id) + result = crud.delete_by_id(db, fixture_order.id) + assert result is None # orders = [ From 5dd9b25b21d079377b5fad2c5af3140abe301620 Mon Sep 17 00:00:00 2001 From: wiIliu Date: Tue, 10 Mar 2026 12:43:28 -0400 Subject: [PATCH 04/15] TESTS - Schemas - Order test invalid entires --- orders_service/tests/unit/schemas/__init__.py | 0 .../tests/unit/schemas/order_schemas_test.py | 40 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 orders_service/tests/unit/schemas/__init__.py create mode 100644 orders_service/tests/unit/schemas/order_schemas_test.py diff --git a/orders_service/tests/unit/schemas/__init__.py b/orders_service/tests/unit/schemas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/orders_service/tests/unit/schemas/order_schemas_test.py b/orders_service/tests/unit/schemas/order_schemas_test.py new file mode 100644 index 0000000..932a8e1 --- /dev/null +++ b/orders_service/tests/unit/schemas/order_schemas_test.py @@ -0,0 +1,40 @@ +import pytest +from pydantic import ValidationError +from orders_service.app.schemas import order + + +def test_order_create_invalid_name(): + with pytest.raises(ValidationError): + order.OrderCreate( + name="", + product="apple", + count=1, + price=5.0, + ) + +def test_order_create_invalid_product(): + with pytest.raises(ValidationError): + order.OrderCreate( + name="test1", + product="a", + count=1, + price=5.0, + ) + +def test_order_create_invalid_count(): + with pytest.raises(ValidationError): + order.OrderCreate( + name="test1", + product="a", + count=0, + price=5.0, + ) + +def test_order_create_invalid_price(): + with pytest.raises(ValidationError): + order.OrderCreate( + name="test1", + product="a", + count=1, + price=-5.0, + ) From f2536252504578c22c5b48e6f321739e83a12a40 Mon Sep 17 00:00:00 2001 From: wiIliu Date: Tue, 10 Mar 2026 12:44:06 -0400 Subject: [PATCH 05/15] Misc - adjust test folder structure --- orders_service/tests/unit/crud/__init__.py | 0 .../tests/unit/crud/orders_table_test.py | 130 ++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 orders_service/tests/unit/crud/__init__.py create mode 100644 orders_service/tests/unit/crud/orders_table_test.py diff --git a/orders_service/tests/unit/crud/__init__.py b/orders_service/tests/unit/crud/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/orders_service/tests/unit/crud/orders_table_test.py b/orders_service/tests/unit/crud/orders_table_test.py new file mode 100644 index 0000000..ed02a9e --- /dev/null +++ b/orders_service/tests/unit/crud/orders_table_test.py @@ -0,0 +1,130 @@ +from sqlalchemy.orm import Session + +from orders_service.app.db_logic import crud +from orders_service.app.models.order import Order +from orders_service.app.schemas.order import OrderCreate +from orders_service.tests.factories.order_factory import OrderFactory + + +### CREATE TESTS ### +def test_create_order(db: Session) -> None: + data: Order = OrderFactory.build(name="testFactory") + new_order = OrderCreate(**{ + "name": data.name, + "product": data.product, + "count": data.count, + "price": data.price, + }) + result = crud.create_order(db=db, new_order=new_order) + + assert result.id is not None + assert result.name == data.name + orders = db.query(Order).all() + assert len(orders) == 1 + + + +### RETRIEVE TESTS ### +def test_get_order_by_id(db: Session, fixture_order: Order) -> None: + stored_order = crud.get_order_by_id(db=db, order_id=fixture_order.id) + assert stored_order + assert fixture_order.id == stored_order.id + assert fixture_order.name == stored_order.name + +def test_get_order_by_id_not_found(db: Session) -> None: + OrderFactory.create_batch(5) + order = crud.get_order_by_id(db=db, order_id=9999) + assert order is None + +def test_get_orders_all(db: Session) -> None: + OrderFactory.create_batch(50) + retrieved_orders = crud.get_orders(db=db) + assert len(retrieved_orders) == 50 + +def test_get_orders_empty_db(db: Session) -> None: + retrieved_orders = crud.get_orders(db=db) + assert retrieved_orders == [] + +def test_get_orders_by_name(db: Session) -> None: + target = "target_customer" + OrderFactory.create_batch(15, name="buffer customer") + OrderFactory.create_batch(10, name=target) + + retrieved_orders = crud.get_orders(db=db, name=target) + assert len(retrieved_orders) == 10 + assert all(order.name == target for order in retrieved_orders) + +def test_get_orders_by_product(db: Session) -> None: + target = "target_product" + OrderFactory.create_batch(15, product="buffer product") + OrderFactory.create_batch(10, product=target) + + retrieved_orders = crud.get_orders(db=db, product=target) + assert len(retrieved_orders) == 10 + assert all(order.product == target for order in retrieved_orders) + +def test_get_orders_by_all_filters(db: Session) -> None: + target_name = "target_customer" + target_product = "target_product" + + OrderFactory.create_batch(5, name="temp customer", product="temp product") + OrderFactory.create_batch(10, name=target_name, product="temp product 2") + OrderFactory.create_batch(12, name="temp customer 2", product=target_product) + OrderFactory.create_batch(6, name=target_name, product=target_product) + + retrieved_orders = crud.get_orders(db=db, name=target_name, product=target_product) + assert len(retrieved_orders) == 6 + assert all(order.name == target_name for order in retrieved_orders) + assert all(order.product == target_product for order in retrieved_orders) + +def test_get_orders_by_filters_no_match(db: Session) -> None: + target_name = "target_customer" + target_product = "target_product" + + OrderFactory.create_batch(5, name="temp customer", product="temp product") + OrderFactory.create_batch(10, name=target_name, product="temp product 2") + OrderFactory.create_batch(12, name="temp customer 2", product=target_product) + + retrieved_orders = crud.get_orders(db=db, name=target_name, product=target_product) + assert retrieved_orders == [] + + + +### UPDATE TESTS ### + + + +### DELETE TESTS ### +def test_delete_by_id(db: Session, fixture_order: Order) -> None: + result = crud.delete_by_id(db, order_id=fixture_order.id) + assert result + assert result.id == fixture_order.id + + deleted = db.query(Order).filter(Order.id == fixture_order.id).first() + assert deleted is None + +def test_delete_by_id_not_found(db: Session) -> None: + OrderFactory.create_batch(5) + order = crud.delete_by_id(db=db, order_id=9999) + assert order is None + +def test_delete_reduces_row_count(db: Session): + OrderFactory.create_batch(5) + order = db.query(Order).first() + crud.delete_by_id(db, order.id) + + remaining = db.query(Order).count() + assert remaining == 4 + +def test_delete_same_id_twice(db: Session, fixture_order: Order): + crud.delete_by_id(db, fixture_order.id) + result = crud.delete_by_id(db, fixture_order.id) + + assert result is None + + +# orders = [ +# OrderFactory(name=f"user{i}", product="widget") +# for i in range(100) +# ] + From b6593a63a491d2d09cd08872aa090df8288ec5fe Mon Sep 17 00:00:00 2001 From: wiIliu Date: Tue, 10 Mar 2026 12:44:18 -0400 Subject: [PATCH 06/15] Misc - adjust test folder structure --- orders_service/tests/crud/__init__.py | 0 .../tests/crud/orders_table_test.py | 131 ------------------ 2 files changed, 131 deletions(-) delete mode 100644 orders_service/tests/crud/__init__.py delete mode 100644 orders_service/tests/crud/orders_table_test.py diff --git a/orders_service/tests/crud/__init__.py b/orders_service/tests/crud/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/orders_service/tests/crud/orders_table_test.py b/orders_service/tests/crud/orders_table_test.py deleted file mode 100644 index 43004e0..0000000 --- a/orders_service/tests/crud/orders_table_test.py +++ /dev/null @@ -1,131 +0,0 @@ -from sqlalchemy.orm import Session # type: ignore - -from faker import Faker - -from orders_service.app.db_logic import crud -from orders_service.app.models.order import Order -from orders_service.app.schemas.order import OrderCreate -from orders_service.tests.factories.order_factory import OrderFactory - - -### CREATE TESTS ### -def test_create_order(db: Session) -> None: - data: Order = OrderFactory.build(name="testFactory") - new_order = OrderCreate(**{ - "name": data.name, - "product": data.product, - "count": data.count, - "price": data.price, - }) - result = crud.create_order(db=db, new_order=new_order) - - # Assertions - orders = db.query(Order).all() - assert len(orders) == 1 - assert result.id is not None - assert result.name == data.name - -### RETRIEVE TESTS ### -def test_get_order_by_id(db: Session, fixture_order: Order) -> None: - stored_order = crud.get_order_by_id(db=db, order_id=fixture_order.id) - assert stored_order - assert fixture_order.id == stored_order.id - assert fixture_order.name == stored_order.name - -def test_get_order_by_id_not_found(db: Session) -> None: - OrderFactory.create_batch(5) - order = crud.get_order_by_id(db=db, order_id=9999) - assert order is None - - -def test_get_orders_all(db: Session) -> None: - OrderFactory.create_batch(50) - retrieved_orders = crud.get_orders(db=db) - assert len(retrieved_orders) == 50 - -def test_get_orders_empty_db(db: Session) -> None: - retrieved_orders = crud.get_orders(db=db) - assert retrieved_orders == [] - -def test_get_orders_by_name(db: Session) -> None: - target = "target_customer" - OrderFactory.create_batch(15, name="buffer customer") - OrderFactory.create_batch(10, name=target) - - retrieved_orders = crud.get_orders(db=db, name=target) - assert len(retrieved_orders) == 10 - assert all(order.name == target for order in retrieved_orders) - -def test_get_orders_by_product(db: Session) -> None: - target = "target_product" - OrderFactory.create_batch(15, product="buffer product") - OrderFactory.create_batch(10, product=target) - - retrieved_orders = crud.get_orders(db=db, product=target) - assert len(retrieved_orders) == 10 - assert all(order.product == target for order in retrieved_orders) - -def test_get_orders_by_all_filters(db: Session) -> None: - target_name = "target_customer" - target_product = "target_product" - - OrderFactory.create_batch(5, name="temp customer", product="temp product") - OrderFactory.create_batch(10, name=target_name, product="temp product 2") - OrderFactory.create_batch(12, name="temp customer 2", product=target_product) - OrderFactory.create_batch(6, name=target_name, product=target_product) - - retrieved_orders = crud.get_orders(db=db, name=target_name, product=target_product) - assert len(retrieved_orders) == 6 - assert all(order.name == target_name for order in retrieved_orders) - assert all(order.product == target_product for order in retrieved_orders) - -def test_get_orders_by_filters_no_match(db: Session) -> None: - target_name = "target_customer" - target_product = "target_product" - - OrderFactory.create_batch(5, name="temp customer", product="temp product") - OrderFactory.create_batch(10, name=target_name, product="temp product 2") - OrderFactory.create_batch(12, name="temp customer 2", product=target_product) - - retrieved_orders = crud.get_orders(db=db, name=target_name, product=target_product) - assert retrieved_orders == [] - - -### UPDATE TESTS ### - - - -### DELETE TESTS ### -def test_delete_by_id(db: Session, fixture_order: Order) -> None: - result = crud.delete_by_id(db, order_id=fixture_order.id) - assert result - assert result.id == fixture_order.id - - deleted = db.query(Order).filter(Order.id == fixture_order.id).first() - assert deleted is None - -def test_delete_by_id_not_found(db: Session) -> None: - OrderFactory.create_batch(5) - order = crud.delete_by_id(db=db, order_id=9999) - assert order is None - -def test_delete_reduces_row_count(db: Session): - OrderFactory.create_batch(5) - order = db.query(Order).first() - crud.delete_by_id(db, order.id) - - remaining = db.query(Order).count() - assert remaining == 4 - -def test_delete_same_id_twice(db: Session, fixture_order: Order): - crud.delete_by_id(db, fixture_order.id) - result = crud.delete_by_id(db, fixture_order.id) - - assert result is None - - -# orders = [ -# OrderFactory(name=f"user{i}", product="widget") -# for i in range(100) -# ] - From 5da0b47ba5f21e369aea257a284b25147bf8cc42 Mon Sep 17 00:00:00 2001 From: wiIliu Date: Tue, 10 Mar 2026 13:54:40 -0400 Subject: [PATCH 07/15] TESTS - CRUD - Create and Update tests --- .../tests/unit/crud/orders_table_test.py | 98 ++++++++++++++++--- 1 file changed, 82 insertions(+), 16 deletions(-) diff --git a/orders_service/tests/unit/crud/orders_table_test.py b/orders_service/tests/unit/crud/orders_table_test.py index ed02a9e..5bbada6 100644 --- a/orders_service/tests/unit/crud/orders_table_test.py +++ b/orders_service/tests/unit/crud/orders_table_test.py @@ -2,23 +2,42 @@ from orders_service.app.db_logic import crud from orders_service.app.models.order import Order -from orders_service.app.schemas.order import OrderCreate +from orders_service.app.schemas.order import OrderCreate, OrderUpdate from orders_service.tests.factories.order_factory import OrderFactory ### CREATE TESTS ### def test_create_order(db: Session) -> None: - data: Order = OrderFactory.build(name="testFactory") - new_order = OrderCreate(**{ - "name": data.name, - "product": data.product, - "count": data.count, - "price": data.price, - }) + data: Order = OrderFactory.build() + new_order = OrderCreate( + name=data.name, + product=data.product, + count=data.count, + price=data.price, + ) + result = crud.create_order(db=db, new_order=new_order) - assert result.id is not None assert result.name == data.name + +def test_created_order_persists_correctly(db: Session) -> None: + data: Order = OrderFactory.build() + new_order = OrderCreate( + name=data.name, + product=data.product, + count=data.count, + price=data.price, + ) + + result = crud.create_order(db=db, new_order=new_order) + stored = db.query(Order).filter(Order.id == result.id).first() + + assert stored is not None + assert stored.name == data.name + assert stored.product == data.product + assert stored.count == data.count + assert stored.price == data.price + orders = db.query(Order).all() assert len(orders) == 1 @@ -91,6 +110,60 @@ def test_get_orders_by_filters_no_match(db: Session) -> None: ### UPDATE TESTS ### +def test_update_order(db: Session) -> None: + db_list = OrderFactory.create_batch(5, name="old name") + old_order = db_list[0] + old_name = old_order.name + old_count = old_order.count + old_price = old_order.price + old_product = old_order.product + order_id = old_order.id + + updated_data = OrderUpdate(name="new name", count=old_count + 1) + result = crud.update_order(db, order_id=order_id, data=updated_data) + + assert result + assert result.id == order_id + assert result.name != old_name + assert result.name == "new name" + assert result.count == old_count + 1 + assert result.price == old_price + assert result.product == old_product + + +def test_update_order_no_changes(db: Session) -> None: + db_list = OrderFactory.create_batch(5) + old_order = db_list[0] + old_name = old_order.name + old_count = old_order.count + old_price = old_order.price + old_product = old_order.product + order_id = old_order.id + + updated_data = OrderUpdate() + result = crud.update_order(db, order_id=order_id, data=updated_data) + + assert result + assert result.id == order_id + assert result.name == old_name + assert result.count == old_count + assert result.price == old_price + assert result.product == old_product + +def test_update_order_invalid_id(db: Session) -> None: + OrderFactory.create_batch(5) + data = OrderUpdate() + result = crud.update_order(db, order_id=9999, data=data) + assert not result + +def test_update_order_row_count_unchanged(db: Session): + db_list = OrderFactory.create_batch(5, name="old name") + updated_data = OrderUpdate(name="updated") + result = crud.update_order(db, order_id=db_list[0].id, data=updated_data) + + assert result + count = db.query(Order).count() + assert count == 5 @@ -121,10 +194,3 @@ def test_delete_same_id_twice(db: Session, fixture_order: Order): result = crud.delete_by_id(db, fixture_order.id) assert result is None - - -# orders = [ -# OrderFactory(name=f"user{i}", product="widget") -# for i in range(100) -# ] - From b1d7b801625df294ac189d321f4ade2abcbe7a0b Mon Sep 17 00:00:00 2001 From: wiIliu Date: Tue, 10 Mar 2026 13:54:57 -0400 Subject: [PATCH 08/15] Misc - removed unnecessary lines --- orders_service/tests/factories/order_factory.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/orders_service/tests/factories/order_factory.py b/orders_service/tests/factories/order_factory.py index 0b030a2..9e2bd38 100644 --- a/orders_service/tests/factories/order_factory.py +++ b/orders_service/tests/factories/order_factory.py @@ -1,5 +1,3 @@ -import random -from uuid import uuid4 import factory from orders_service.app.models import order @@ -8,7 +6,6 @@ class Meta: model = order.Order sqlalchemy_session_persistence = "flush" - # id = factory.LazyFunction(uuid4) name = factory.Faker("name") product = factory.Sequence(lambda n: 'item %d' % n) count = factory.Faker("random_int", min=1, max=100) From aee163ddcac4a8075fdf99df44dbee6e0867ff76 Mon Sep 17 00:00:00 2001 From: wiIliu Date: Tue, 10 Mar 2026 13:59:23 -0400 Subject: [PATCH 09/15] TESTS - CRUD - Update test added --- .../tests/unit/crud/orders_table_test.py | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/orders_service/tests/unit/crud/orders_table_test.py b/orders_service/tests/unit/crud/orders_table_test.py index 5bbada6..47b2618 100644 --- a/orders_service/tests/unit/crud/orders_table_test.py +++ b/orders_service/tests/unit/crud/orders_table_test.py @@ -111,13 +111,12 @@ def test_get_orders_by_filters_no_match(db: Session) -> None: ### UPDATE TESTS ### def test_update_order(db: Session) -> None: - db_list = OrderFactory.create_batch(5, name="old name") - old_order = db_list[0] - old_name = old_order.name - old_count = old_order.count - old_price = old_order.price - old_product = old_order.product - order_id = old_order.id + order = OrderFactory(name="old name") + old_name = order.name + old_count = order.count + old_price = order.price + old_product = order.product + order_id = order.id updated_data = OrderUpdate(name="new name", count=old_count + 1) result = crud.update_order(db, order_id=order_id, data=updated_data) @@ -130,15 +129,13 @@ def test_update_order(db: Session) -> None: assert result.price == old_price assert result.product == old_product - def test_update_order_no_changes(db: Session) -> None: - db_list = OrderFactory.create_batch(5) - old_order = db_list[0] - old_name = old_order.name - old_count = old_order.count - old_price = old_order.price - old_product = old_order.product - order_id = old_order.id + order = OrderFactory() + old_name = order.name + old_count = order.count + old_price = order.price + old_product = order.product + order_id = order.id updated_data = OrderUpdate() result = crud.update_order(db, order_id=order_id, data=updated_data) @@ -165,6 +162,15 @@ def test_update_order_row_count_unchanged(db: Session): count = db.query(Order).count() assert count == 5 +def test_update_persists_changes(db: Session): + order = OrderFactory() + updated_data = OrderUpdate(name="persisted") + + crud.update_order(db, order_id=order.id, data=updated_data) + stored = db.query(Order).filter(Order.id == order.id).first() + + assert stored.name == "persisted" + ### DELETE TESTS ### From c84145616aafd803e8c4fca478d0aa2954c81f89 Mon Sep 17 00:00:00 2001 From: wiIliu Date: Thu, 12 Mar 2026 15:00:13 -0400 Subject: [PATCH 10/15] TESTS - Integration - API enpoint tests --- orders_service/app/main.py | 2 +- .../tests/integration_tests/app_test.py | 20 +-- .../tests/integration_tests/health_test.py | 2 - .../tests/integration_tests/orders_test.py | 147 ++++++++++++++++++ .../tests/unit/crud/orders_table_test.py | 2 +- 5 files changed, 150 insertions(+), 23 deletions(-) create mode 100644 orders_service/tests/integration_tests/orders_test.py diff --git a/orders_service/app/main.py b/orders_service/app/main.py index d745e48..f4f80a4 100644 --- a/orders_service/app/main.py +++ b/orders_service/app/main.py @@ -10,7 +10,7 @@ def create_app(): ) @fastapi_app.get("/") async def root(): - return {"message": "Hello World"} + return {"message": "orders_service"} fastapi_app.include_router(orders.router) fastapi_app.include_router(health.router) diff --git a/orders_service/tests/integration_tests/app_test.py b/orders_service/tests/integration_tests/app_test.py index fcf6b0e..19877a2 100644 --- a/orders_service/tests/integration_tests/app_test.py +++ b/orders_service/tests/integration_tests/app_test.py @@ -1,26 +1,8 @@ from fastapi import status - - def test_root_endpoint(client): - """Test the root endpoint returns the expected response.""" response = client.get("/") assert response.status_code == status.HTTP_200_OK data = response.json() - # assert "app" in data assert "message" in data - # assert data["app"] == "Databricks FastAPI Example" - -def test_isolation(client): - client.post("/order", json={ - "id": 1, - "name": "A", - "product": "B", - "count": 1, - "price": 10.0 - }) - -def test_no_leak(client): - response = client.get("/order/1") - assert response.status_code == 404 - \ No newline at end of file + assert data["message"] == "orders_service" diff --git a/orders_service/tests/integration_tests/health_test.py b/orders_service/tests/integration_tests/health_test.py index c270d10..0f0319c 100644 --- a/orders_service/tests/integration_tests/health_test.py +++ b/orders_service/tests/integration_tests/health_test.py @@ -1,7 +1,6 @@ from fastapi import status def test_healthcheck(client): - """Test the healthcheck endpoint.""" response = client.get("/health") assert response.status_code == status.HTTP_200_OK data = response.json() @@ -10,7 +9,6 @@ def test_healthcheck(client): # assert "timestamp" in data def test_healthcheck_db(client): - """Test the healthcheck database endpoint.""" response = client.get("/health/db") assert response.status_code == status.HTTP_200_OK data = response.json() diff --git a/orders_service/tests/integration_tests/orders_test.py b/orders_service/tests/integration_tests/orders_test.py new file mode 100644 index 0000000..4260227 --- /dev/null +++ b/orders_service/tests/integration_tests/orders_test.py @@ -0,0 +1,147 @@ +from fastapi import status +from orders_service.tests.factories.order_factory import OrderFactory + +# def test_isolation(client): ? + + +def test_post_order_success(client): + response = client.post("/orders", json={ + "name": "test user", + "product": "test product", + "count": 2, + "price": 10.0 + }) + assert response.status_code == status.HTTP_201_CREATED + assert response.json()["name"] == "test user" + assert response.json()["total"] == 20.0 + +def test_post_order_invalid_payload(client): + response = client.post("/orders", json={ + "name": "test" + }) + + assert response.status_code == 422 + + + +def test_get_all(client): + OrderFactory.create_batch(2) + + response = client.get("/orders") + data = response.json() + + assert response.status_code == status.HTTP_200_OK + assert "items" in data + assert isinstance(data["items"], list) + assert len(data["items"]) == 2 + +def test_get_all_empty(client): + response = client.get("/orders") + assert response.status_code == status.HTTP_200_OK + assert response.json()["items"] == [] + +def test_get_by_name(client): + OrderFactory() + OrderFactory.create_batch(3, name="user") + + response = client.get("/orders/?name=user") + + assert response.status_code == status.HTTP_200_OK + + data = response.json() + assert isinstance(data["items"], list) + assert len(data["items"]) == 3 + assert all(order["name"] == "user" for order in data["items"]) + + +def test_get_by_product(client): + OrderFactory() + OrderFactory.create_batch(2, product="product") + + response = client.get("/orders?product=product") + + assert response.status_code == status.HTTP_200_OK + + data = response.json() + assert isinstance(data["items"], list) + assert len(data["items"]) == 2 + assert all(order["product"] == "product" for order in data["items"]) + +def test_get_by_all_filters(client): + target_name="target_customer" + target_product="target_product" + OrderFactory.create_batch(5, name="temp customer", product="temp product") + OrderFactory.create_batch(10, name=target_name, product="temp product 2") + OrderFactory.create_batch(12, name="temp customer 2", product=target_product) + OrderFactory.create_batch(6, name=target_name, product=target_product) + + response = client.get(f"/orders?name={target_name}&product={target_product}") + + assert response.status_code == status.HTTP_200_OK + + data = response.json() + assert isinstance(data["items"], list) + assert len(data["items"]) == 6 + assert all(order["name"] == target_name for order in data["items"]) + assert all(order["product"] == target_product for order in data["items"]) + +def test_get_by_filters_no_match(client): + target_name = "target_customer" + target_product = "target_product" + + OrderFactory.create_batch(5, name="temp customer", product="temp product") + OrderFactory.create_batch(10, name=target_name, product="temp product 2") + OrderFactory.create_batch(12, name="temp customer 2", product=target_product) + + response = client.get(f"/orders?name={target_name}&product={target_product}") + + assert response.status_code == status.HTTP_200_OK + + data = response.json() + assert isinstance(data["items"], list) + assert len(data["items"]) == 0 + +def test_get_by_id(client, fixture_order): + response = client.get(f"/orders/{fixture_order.id}") + assert response.status_code == status.HTTP_200_OK + data = response.json() + assert data['id'] == fixture_order.id + +def test_get_by_id_invalid_id(client, fixture_order): + response = client.get(f"/orders/{fixture_order.id + 1}") + + assert response.status_code == status.HTTP_404_NOT_FOUND + + + +def test_put_success(client, fixture_order): + response = client.put(f"/orders/{fixture_order.id}", json={"name": "new name"}) + assert response.status_code == status.HTTP_200_OK + data = response.json() + assert data["name"] == "new name" + +def test_put_invalid_id(client, fixture_order): + response = client.put(f"/orders/{fixture_order.id + 1}", json={"name": "new name"}) + assert response.status_code == status.HTTP_404_NOT_FOUND + +def test_put_invalid_data(client, fixture_order): + response = client.put(f"/orders/{fixture_order.id}", json={"name": "x"}) + assert response.status_code == status.HTTP_422_UNPROCESSABLE_CONTENT + + + +def test_delete_success(client, fixture_order): + response = client.delete(f"/orders/{fixture_order.id}") + + assert response.status_code == status.HTTP_204_NO_CONTENT + +def test_delete_persists(client, fixture_order): + client.delete(f"/orders/{fixture_order.id}") + + response = client.get(f"/orders/{fixture_order.id}") + assert response.status_code == 404 + +def test_delete_invalid(client, fixture_order): + response = client.delete(f"/orders/{fixture_order.id+1}") + + assert response.status_code == status.HTTP_404_NOT_FOUND diff --git a/orders_service/tests/unit/crud/orders_table_test.py b/orders_service/tests/unit/crud/orders_table_test.py index 47b2618..345ff2d 100644 --- a/orders_service/tests/unit/crud/orders_table_test.py +++ b/orders_service/tests/unit/crud/orders_table_test.py @@ -31,7 +31,7 @@ def test_created_order_persists_correctly(db: Session) -> None: result = crud.create_order(db=db, new_order=new_order) stored = db.query(Order).filter(Order.id == result.id).first() - + assert stored is not None assert stored.name == data.name assert stored.product == data.product From e4389790987d04fe38ba05d984e9e99a1f594bb7 Mon Sep 17 00:00:00 2001 From: wiIliu Date: Thu, 12 Mar 2026 15:01:17 -0400 Subject: [PATCH 11/15] Misc - renamed test files for clarity --- .../tests/integration_tests/{app_test.py => app_api_test.py} | 0 .../integration_tests/{health_test.py => health_api_test.py} | 0 .../integration_tests/{orders_test.py => orders_api_test.py} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename orders_service/tests/integration_tests/{app_test.py => app_api_test.py} (100%) rename orders_service/tests/integration_tests/{health_test.py => health_api_test.py} (100%) rename orders_service/tests/integration_tests/{orders_test.py => orders_api_test.py} (100%) diff --git a/orders_service/tests/integration_tests/app_test.py b/orders_service/tests/integration_tests/app_api_test.py similarity index 100% rename from orders_service/tests/integration_tests/app_test.py rename to orders_service/tests/integration_tests/app_api_test.py diff --git a/orders_service/tests/integration_tests/health_test.py b/orders_service/tests/integration_tests/health_api_test.py similarity index 100% rename from orders_service/tests/integration_tests/health_test.py rename to orders_service/tests/integration_tests/health_api_test.py diff --git a/orders_service/tests/integration_tests/orders_test.py b/orders_service/tests/integration_tests/orders_api_test.py similarity index 100% rename from orders_service/tests/integration_tests/orders_test.py rename to orders_service/tests/integration_tests/orders_api_test.py From 15aae30fa1b8050f93561df56cc030fc64aaa7df Mon Sep 17 00:00:00 2001 From: Willow Connelly <123427248+wiIliu@users.noreply.github.com> Date: Thu, 12 Mar 2026 15:29:56 -0400 Subject: [PATCH 12/15] Update integration-tests.yml --- .github/workflows/integration-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 637d14f..300bd0d 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -7,7 +7,7 @@ on: push: branches: [ "main", "dev" ] pull_request: - branches: [ "main", "dev" ] + branches: [ "main", "dev", "tests/tests-new-enpoints-and-crud" ] permissions: contents: read From b393db8360df8e2d38a8171aa5c6440724a22037 Mon Sep 17 00:00:00 2001 From: wiIliu Date: Fri, 13 Mar 2026 15:36:03 -0400 Subject: [PATCH 13/15] docker - updated testing containers --- docker-compose.yml | 36 +++++++++++++++++++++++++++-- orders_service/Dockerfile | 9 ++++---- orders_service/docker-entrypoint.sh | 6 ++++- 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 311d073..f2c0ec5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: POSTGRES_PASSWORD: ${DATABASE_PSWD} POSTGRES_DB: ${DATABASE_DB} ports: - - "15432:5432" + - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: @@ -31,11 +31,43 @@ services: depends_on: db: condition: service_healthy - + + # test: + test-db: + image: postgres:16-bookworm + profiles: ["test"] + env_file: + - ./.env.test + environment: + POSTGRES_USER: ${DATABASE_USER} + POSTGRES_PASSWORD: ${DATABASE_PASSWORD} + POSTGRES_DB: ${DATABASE_DB} + tmpfs: + - /var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U test1"] + interval: 5s + timeout: 5s + retries: 5 + + + orders_service_test: + profiles: ["test"] + build: + context: orders_service/ + target: test + dockerfile: ./Dockerfile + environment: + ENV: TEST + env_file: orders_service/.env.test + depends_on: + test-db: + condition: service_healthy volumes: postgres_data: + # analytics_service: # build: ./analytics_service # ports: diff --git a/orders_service/Dockerfile b/orders_service/Dockerfile index b0c6b87..5223a7d 100644 --- a/orders_service/Dockerfile +++ b/orders_service/Dockerfile @@ -21,9 +21,6 @@ FROM base AS dev COPY requirements-dev.txt . RUN pip install --no-cache-dir -r requirements-dev.txt -# COPY pytest.ini . -COPY tests ./tests/ - COPY alembic.ini . COPY alembic ./alembic @@ -31,6 +28,10 @@ ENV ENV=DEV # TEST FROM dev AS test + +# COPY pytest.ini . +COPY tests ./tests/ + RUN pip install --no-cache-dir pytest-cov ENV ENV=TEST @@ -38,5 +39,3 @@ ENV ENV=TEST FROM base AS prod ENV ENV=PROD - - diff --git a/orders_service/docker-entrypoint.sh b/orders_service/docker-entrypoint.sh index 07a1a14..90314de 100644 --- a/orders_service/docker-entrypoint.sh +++ b/orders_service/docker-entrypoint.sh @@ -11,11 +11,15 @@ if [ "$ENV" = "DEV" ]; then --reload elif [ "$ENV" = "TEST" ]; then echo "Running tests" - exec pytest /app/orders_service/tests --rootdir=/app + exec pytest /app/orders_service --rootdir=/app # exec pytest -v --cov=orders_service elif [ "$ENV" = "PROD" ]; then echo "PROD ENVIRONMENT" + # alembic upgrade head + exec uvicorn orders_service.app.main:app \ + --host 0.0.0.0 \ + --port 8000 exec uvicorn orders_service.app.main:app \ --host 0.0.0.0 \ --port 8000 From 62ea3a5e10655ccac39289a4dfb45c36333c72a2 Mon Sep 17 00:00:00 2001 From: Willow Connelly <123427248+wiIliu@users.noreply.github.com> Date: Mon, 16 Mar 2026 15:29:19 -0400 Subject: [PATCH 14/15] Update integration-tests.yml --- .github/workflows/integration-tests.yml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 300bd0d..199ba13 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -1,13 +1,10 @@ -# This workflow will install Python dependencies, run tests and lint with a single version of Python -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python - -name: integration-tests +name: Tests on: push: branches: [ "main", "dev" ] pull_request: - branches: [ "main", "dev", "tests/tests-new-enpoints-and-crud" ] + branches: [ "main", "dev" ] permissions: contents: read @@ -42,11 +39,12 @@ jobs: uses: actions/setup-python@v5 with: python-version: "3.11" + cache: "pip" - name: Install dependencies run: | python -m pip install --upgrade pip - pip install pytest pytest-cov alembic + pip install pytest-cov if [ -f orders_service/requirements-dev.txt ]; then pip install -r orders_service/requirements-dev.txt; fi - name: Wait for Postgres @@ -60,7 +58,7 @@ jobs: # env: # DATABASE_URL: postgresql://test:test@localhost:5432/test_db - - name: Integration tests with pytest + - name: Tests with pytest run: | mkdir -p logs LOGFILE="logs/pytest-$(date +'%Y-%m-%d_%H%M%S').log" From 9d9e05b22b391a1d44b436bbfb577eca3f2b28ad Mon Sep 17 00:00:00 2001 From: Willow Connelly <123427248+wiIliu@users.noreply.github.com> Date: Mon, 16 Mar 2026 15:33:24 -0400 Subject: [PATCH 15/15] Rename integration-tests.yml to tests.yml --- .github/workflows/{integration-tests.yml => tests.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{integration-tests.yml => tests.yml} (100%) diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/tests.yml similarity index 100% rename from .github/workflows/integration-tests.yml rename to .github/workflows/tests.yml