|
|
|
@ -2,12 +2,12 @@ import pytest
@@ -2,12 +2,12 @@ import pytest
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture() |
|
|
|
|
def example_orders(): |
|
|
|
|
def example_order_data(): |
|
|
|
|
from datetime import datetime |
|
|
|
|
from ordr3.models import OrderItem, OrderCategory, OrderStatus |
|
|
|
|
from ordr3.models import OrderCategory, OrderStatus |
|
|
|
|
|
|
|
|
|
return [ |
|
|
|
|
OrderItem( |
|
|
|
|
( |
|
|
|
|
1, |
|
|
|
|
"Ethanol", |
|
|
|
|
"1-23", |
|
|
|
@ -23,7 +23,7 @@ def example_orders():
@@ -23,7 +23,7 @@ def example_orders():
|
|
|
|
|
"me", |
|
|
|
|
OrderStatus.OPEN, |
|
|
|
|
), |
|
|
|
|
OrderItem( |
|
|
|
|
( |
|
|
|
|
2, |
|
|
|
|
"Gloves", |
|
|
|
|
"12-3", |
|
|
|
@ -37,11 +37,34 @@ def example_orders():
@@ -37,11 +37,34 @@ def example_orders():
|
|
|
|
|
"no comment", |
|
|
|
|
datetime(2020, 2, 4, 15, 14, 13), |
|
|
|
|
"you", |
|
|
|
|
OrderStatus.APPROVAL, |
|
|
|
|
OrderStatus.COMPLETED, |
|
|
|
|
), |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture() |
|
|
|
|
def example_orders(example_order_data): |
|
|
|
|
from ordr3.models import OrderItem |
|
|
|
|
|
|
|
|
|
return [OrderItem(*data) for data in example_order_data] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture() |
|
|
|
|
def example_consumables(example_order_data): |
|
|
|
|
from datetime import datetime, timedelta |
|
|
|
|
from ordr3.models import OrderItem |
|
|
|
|
|
|
|
|
|
consumables = [] |
|
|
|
|
order_data = example_order_data * 3 |
|
|
|
|
for i, data in enumerate(order_data, start=1): |
|
|
|
|
order = OrderItem(*data) |
|
|
|
|
order.id = i |
|
|
|
|
order.created_on = datetime.utcnow() - timedelta(days=i * 150) |
|
|
|
|
consumables.append(order) |
|
|
|
|
|
|
|
|
|
return consumables |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture() |
|
|
|
|
def example_users(): |
|
|
|
|
from ordr3.models import User, UserRole |
|
|
|
@ -82,7 +105,7 @@ def test_sql_repo_add_order(session, example_orders):
@@ -82,7 +105,7 @@ def test_sql_repo_add_order(session, example_orders):
|
|
|
|
|
def test_sql_repo_delete_order(session, example_orders): |
|
|
|
|
from ordr3.repo import SqlAlchemyRepository |
|
|
|
|
from ordr3.services import create_log_entry |
|
|
|
|
from ordr3.models import LogEntry, OrderStatus, User |
|
|
|
|
from ordr3.models import LogEntry, OrderStatus, User, OrderItem |
|
|
|
|
|
|
|
|
|
repo = SqlAlchemyRepository(session) |
|
|
|
|
repo.add_order(example_orders[0]) |
|
|
|
@ -95,7 +118,7 @@ def test_sql_repo_delete_order(session, example_orders):
@@ -95,7 +118,7 @@ def test_sql_repo_delete_order(session, example_orders):
|
|
|
|
|
repo.delete_order(example_orders[0]) |
|
|
|
|
session.flush() |
|
|
|
|
|
|
|
|
|
assert repo.list_orders() == [example_orders[1]] |
|
|
|
|
assert session.query(OrderItem).all() == [example_orders[1]] |
|
|
|
|
assert session.query(LogEntry).all() == example_orders[1].log |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -121,16 +144,24 @@ def test_sql_repo_get_order_raises_exception(session, example_orders):
@@ -121,16 +144,24 @@ def test_sql_repo_get_order_raises_exception(session, example_orders):
|
|
|
|
|
repo.get_order(2) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_sql_repo_list_orders(session, example_orders): |
|
|
|
|
def test_sql_list_consumable_candidates(session, example_consumables): |
|
|
|
|
from ordr3.repo import SqlAlchemyRepository |
|
|
|
|
from ordr3.models import OrderStatus |
|
|
|
|
from datetime import datetime, timedelta |
|
|
|
|
|
|
|
|
|
earlier, later = example_orders |
|
|
|
|
repo = SqlAlchemyRepository(session) |
|
|
|
|
repo.add_order(earlier) |
|
|
|
|
repo.add_order(later) |
|
|
|
|
for example in example_consumables: |
|
|
|
|
repo.add_order(example) |
|
|
|
|
print(example.id, example.created_on) |
|
|
|
|
session.flush() |
|
|
|
|
|
|
|
|
|
assert repo.list_orders() == [later, earlier] |
|
|
|
|
limit_date = datetime.utcnow() - timedelta(days=2 * 365) |
|
|
|
|
states = {OrderStatus.COMPLETED} |
|
|
|
|
|
|
|
|
|
result = repo.list_consumable_candidates(limit_date, states) |
|
|
|
|
|
|
|
|
|
assert len(result) == 2 |
|
|
|
|
assert [o.id for o in result] == [2, 4] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_sql_repo_add_user(session, example_users): |
|
|
|
@ -148,6 +179,7 @@ def test_sql_repo_add_user(session, example_users):
@@ -148,6 +179,7 @@ def test_sql_repo_add_user(session, example_users):
|
|
|
|
|
|
|
|
|
|
def test_sql_repo_delte_user(session, example_users): |
|
|
|
|
from ordr3.repo import SqlAlchemyRepository |
|
|
|
|
from ordr3.models import User |
|
|
|
|
|
|
|
|
|
repo = SqlAlchemyRepository(session) |
|
|
|
|
repo.add_user(example_users[0]) |
|
|
|
@ -156,7 +188,7 @@ def test_sql_repo_delte_user(session, example_users):
@@ -156,7 +188,7 @@ def test_sql_repo_delte_user(session, example_users):
|
|
|
|
|
|
|
|
|
|
repo.delete_user(example_users[0]) |
|
|
|
|
|
|
|
|
|
assert repo.list_users() == [example_users[1]] |
|
|
|
|
assert session.query(User).all() == [example_users[1]] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_sql_repo_get_user(session, example_users): |
|
|
|
@ -225,18 +257,6 @@ def test_sql_repo_get_user_by_email_exception(session, example_users):
@@ -225,18 +257,6 @@ def test_sql_repo_get_user_by_email_exception(session, example_users):
|
|
|
|
|
repo.get_user_by_email("unknown email") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_sql_repo_list_users(session, example_users): |
|
|
|
|
from ordr3.repo import SqlAlchemyRepository |
|
|
|
|
|
|
|
|
|
later, earlier = example_users |
|
|
|
|
repo = SqlAlchemyRepository(session) |
|
|
|
|
repo.add_user(later) |
|
|
|
|
repo.add_user(earlier) |
|
|
|
|
session.flush() |
|
|
|
|
|
|
|
|
|
assert repo.list_users() == [earlier, later] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_sql_repo_count_new_users(session, example_users): |
|
|
|
|
from ordr3.repo import SqlAlchemyRepository |
|
|
|
|
from ordr3.models import UserRole |
|
|
|
@ -255,14 +275,43 @@ def test_sql_search_vendor(session, example_users):
@@ -255,14 +275,43 @@ def test_sql_search_vendor(session, example_users):
|
|
|
|
|
from ordr3.models import Vendor |
|
|
|
|
|
|
|
|
|
repo = SqlAlchemyRepository(session) |
|
|
|
|
rep = Vendor("sa", "Sigma Aldrich") |
|
|
|
|
session.add(rep) |
|
|
|
|
entry = Vendor("sa", "Sigma Aldrich") |
|
|
|
|
session.add(entry) |
|
|
|
|
session.flush() |
|
|
|
|
|
|
|
|
|
assert repo.search_vendor("sa") == "Sigma Aldrich" |
|
|
|
|
assert repo.search_vendor("sa") == entry |
|
|
|
|
assert repo.search_vendor("unknown") is None |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_sql_get_vendor_aggregates(session): |
|
|
|
|
from ordr3.repo import SqlAlchemyRepository |
|
|
|
|
from ordr3.models import Vendor, VendorAggregate |
|
|
|
|
|
|
|
|
|
repo = SqlAlchemyRepository(session) |
|
|
|
|
entry_1 = Vendor("sb", "Sigma Aldrich") |
|
|
|
|
entry_2 = Vendor("sa", "Sigma Aldrich") |
|
|
|
|
entry_3 = Vendor("vwr", "VWR") |
|
|
|
|
session.add(entry_1) |
|
|
|
|
session.add(entry_2) |
|
|
|
|
session.add(entry_3) |
|
|
|
|
session.flush() |
|
|
|
|
|
|
|
|
|
result = repo.get_vendor_aggregates("Sigma Aldrich") |
|
|
|
|
|
|
|
|
|
assert isinstance(result, VendorAggregate) |
|
|
|
|
assert result.name == "Sigma Aldrich" |
|
|
|
|
assert result.terms == ["sa", "sb"] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_sql_get_vendor_aggregates_raises_error(session): |
|
|
|
|
from ordr3.repo import SqlAlchemyRepository, RepoItemNotFound |
|
|
|
|
|
|
|
|
|
repo = SqlAlchemyRepository(session) |
|
|
|
|
|
|
|
|
|
with pytest.raises(RepoItemNotFound): |
|
|
|
|
repo.get_vendor_aggregates("Sigma Aldrich") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_sql_repo_add_reset_token(session, example_tokens): |
|
|
|
|
from ordr3.repo import SqlAlchemyRepository |
|
|
|
|
from ordr3.models import PasswordResetToken |
|
|
|
@ -315,7 +364,7 @@ def test_sql_repo_get_reset_token_raises_exception(session, example_tokens):
@@ -315,7 +364,7 @@ def test_sql_repo_get_reset_token_raises_exception(session, example_tokens):
|
|
|
|
|
repo.get_reset_token("unknown token") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_clear_stale_reset_tokens(session, example_tokens): |
|
|
|
|
def test_sql_clear_stale_reset_tokens(session, example_tokens): |
|
|
|
|
from ordr3.repo import SqlAlchemyRepository |
|
|
|
|
from ordr3.models import PasswordResetToken |
|
|
|
|
|
|
|
|
|