autocommit 21-07-2024-17-20
This commit is contained in:
parent
184d0dbf36
commit
7c41886111
|
|
@ -0,0 +1,209 @@
|
|||
import pytest
|
||||
import logging
|
||||
from fastapi.testclient import TestClient
|
||||
from hypothesis import given, strategies as st, settings
|
||||
from bson import ObjectId
|
||||
from pos_system.server import app
|
||||
from pos_system.database import get_db
|
||||
from datetime import datetime
|
||||
|
||||
client = TestClient(app)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def clear_db():
|
||||
db = get_db()
|
||||
db.orders.delete_many({})
|
||||
db.items.delete_many({})
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def run_around_tests():
|
||||
clear_db()
|
||||
yield
|
||||
clear_db()
|
||||
|
||||
|
||||
def create_test_item():
|
||||
response = client.post(
|
||||
"/items/",
|
||||
json={"name": "Test Item", "price": 10.99,
|
||||
"quantity": 100, "unit": "piece"}
|
||||
)
|
||||
return response.json()["_id"]
|
||||
|
||||
|
||||
def test_create_order():
|
||||
logger.info("Testing create order")
|
||||
item_id = create_test_item()
|
||||
order_data = {
|
||||
"user_id": str(ObjectId()),
|
||||
"items": [{"item_id": item_id, "quantity": 2}],
|
||||
"total_amount": 21.98,
|
||||
"payment_method": "credit_card"
|
||||
}
|
||||
response = client.post("/orders/", json=order_data)
|
||||
assert response.status_code == 200
|
||||
assert "_id" in response.json()
|
||||
logger.info(f"Created order with ID: {response.json()['_id']}")
|
||||
|
||||
|
||||
def test_read_orders():
|
||||
logger.info("Testing read orders")
|
||||
item_id = create_test_item()
|
||||
order_data = {
|
||||
"user_id": str(ObjectId()),
|
||||
"items": [{"item_id": item_id, "quantity": 2}],
|
||||
"total_amount": 21.98,
|
||||
"payment_method": "credit_card"
|
||||
}
|
||||
client.post("/orders/", json=order_data)
|
||||
response = client.get("/orders/")
|
||||
assert response.status_code == 200
|
||||
orders = response.json()
|
||||
assert len(orders) == 1
|
||||
assert orders[0]["total_amount"] == 21.98
|
||||
logger.info(f"Retrieved {len(orders)} orders")
|
||||
|
||||
|
||||
def test_read_order():
|
||||
logger.info("Testing read single order")
|
||||
item_id = create_test_item()
|
||||
order_data = {
|
||||
"user_id": str(ObjectId()),
|
||||
"items": [{"item_id": item_id, "quantity": 2}],
|
||||
"total_amount": 21.98,
|
||||
"payment_method": "credit_card"
|
||||
}
|
||||
create_response = client.post("/orders/", json=order_data)
|
||||
order_id = create_response.json()["_id"]
|
||||
response = client.get(f"/orders/{order_id}")
|
||||
assert response.status_code == 200
|
||||
assert response.json()["total_amount"] == 21.98
|
||||
logger.info(f"Retrieved order with ID: {order_id}")
|
||||
|
||||
|
||||
def test_update_order():
|
||||
logger.info("Testing update order")
|
||||
item_id = create_test_item()
|
||||
order_data = {
|
||||
"user_id": str(ObjectId()),
|
||||
"items": [{"item_id": item_id, "quantity": 2}],
|
||||
"total_amount": 21.98,
|
||||
"payment_method": "credit_card"
|
||||
}
|
||||
create_response = client.post("/orders/", json=order_data)
|
||||
order_id = create_response.json()["_id"]
|
||||
update_data = {
|
||||
"items": [{"item_id": item_id, "quantity": 3}],
|
||||
"total_amount": 32.97,
|
||||
"payment_method": "cash"
|
||||
}
|
||||
response = client.put(f"/orders/{order_id}", json=update_data)
|
||||
assert response.status_code == 200
|
||||
assert response.json()["total_amount"] == 32.97
|
||||
assert response.json()["payment_method"] == "cash"
|
||||
logger.info(f"Updated order with ID: {order_id}")
|
||||
|
||||
|
||||
def test_delete_order():
|
||||
logger.info("Testing delete order")
|
||||
item_id = create_test_item()
|
||||
order_data = {
|
||||
"user_id": str(ObjectId()),
|
||||
"items": [{"item_id": item_id, "quantity": 2}],
|
||||
"total_amount": 21.98,
|
||||
"payment_method": "credit_card"
|
||||
}
|
||||
create_response = client.post("/orders/", json=order_data)
|
||||
order_id = create_response.json()["_id"]
|
||||
response = client.delete(f"/orders/{order_id}")
|
||||
assert response.status_code == 200
|
||||
assert response.json()["message"] == "Order deleted successfully"
|
||||
get_response = client.get(f"/orders/{order_id}")
|
||||
assert get_response.status_code == 404
|
||||
logger.info(f"Deleted order with ID: {order_id}")
|
||||
|
||||
|
||||
@given(
|
||||
st.lists(
|
||||
st.fixed_dictionaries({
|
||||
"item_id": st.text(min_size=24, max_size=24),
|
||||
"quantity": st.integers(min_value=1, max_value=10)
|
||||
}),
|
||||
min_size=1,
|
||||
max_size=5
|
||||
),
|
||||
st.floats(min_value=0.01, max_value=1000,
|
||||
allow_nan=False, allow_infinity=False),
|
||||
st.sampled_from(["credit_card", "cash", "paypal"])
|
||||
)
|
||||
@settings(max_examples=50)
|
||||
def test_create_order_property(items, total_amount, payment_method):
|
||||
clear_db()
|
||||
item_id = create_test_item()
|
||||
for item in items:
|
||||
item["item_id"] = item_id # Use the same item_id for all items
|
||||
order_data = {
|
||||
"user_id": str(ObjectId()),
|
||||
"items": items,
|
||||
"total_amount": total_amount,
|
||||
"payment_method": payment_method
|
||||
}
|
||||
response = client.post("/orders/", json=order_data)
|
||||
assert response.status_code == 200
|
||||
assert "_id" in response.json()
|
||||
order_id = response.json()["_id"]
|
||||
get_response = client.get(f"/orders/{order_id}")
|
||||
assert get_response.status_code == 200
|
||||
retrieved_order = get_response.json()
|
||||
assert retrieved_order["total_amount"] == total_amount
|
||||
assert retrieved_order["payment_method"] == payment_method
|
||||
assert len(retrieved_order["items"]) == len(items)
|
||||
|
||||
|
||||
@given(
|
||||
st.lists(
|
||||
st.fixed_dictionaries({
|
||||
"user_id": st.text(min_size=24, max_size=24),
|
||||
"total_amount": st.floats(min_value=0.01, max_value=1000, allow_nan=False, allow_infinity=False),
|
||||
"payment_method": st.sampled_from(["credit_card", "cash", "paypal"])
|
||||
}),
|
||||
min_size=1,
|
||||
max_size=10
|
||||
)
|
||||
)
|
||||
@settings(max_examples=20)
|
||||
def test_read_orders_property(orders):
|
||||
clear_db()
|
||||
item_id = create_test_item()
|
||||
for order in orders:
|
||||
order_data = {
|
||||
"user_id": order["user_id"],
|
||||
"items": [{"item_id": item_id, "quantity": 1}],
|
||||
"total_amount": order["total_amount"],
|
||||
"payment_method": order["payment_method"]
|
||||
}
|
||||
client.post("/orders/", json=order_data)
|
||||
response = client.get("/orders/")
|
||||
assert response.status_code == 200
|
||||
retrieved_orders = response.json()
|
||||
assert len(retrieved_orders) == len(orders)
|
||||
for retrieved_order in retrieved_orders:
|
||||
assert "user_id" in retrieved_order
|
||||
assert "total_amount" in retrieved_order
|
||||
assert "payment_method" in retrieved_order
|
||||
|
||||
|
||||
@pytest.hookimpl(hookwrapper=True)
|
||||
def pytest_runtest_makereport(item, call):
|
||||
outcome = yield
|
||||
report = outcome.get_result()
|
||||
if report.when == "call" and report.failed:
|
||||
if "hypothesis" in item.keywords:
|
||||
logger.error(f"Property test failed: {item.name}")
|
||||
logger.error(f"Falsifying example: {call.excinfo.value}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pytest.main([__file__])
|
||||
Loading…
Reference in New Issue