kanban-app/backend/tests/test_models.py

201 lines
6.2 KiB
Python
Raw Normal View History

2026-02-24 14:36:31 +00:00
"""Test models"""
from decimal import Decimal
2026-02-24 16:19:15 +00:00
import pytest
from app.models import Order, OrderItem, Product, User
2026-02-24 14:36:31 +00:00
class TestUserModel:
"""Test User model"""
@pytest.mark.unit
def test_user_creation(self, db_session):
"""Test creating a user"""
user = User(
2026-02-25 18:32:57 +00:00
email="test2@example.com",
username="testuser2",
2026-02-24 16:19:15 +00:00
first_name="Test",
last_name="User",
2026-02-24 14:36:31 +00:00
is_admin=False,
2026-02-24 16:19:15 +00:00
is_active=True,
2026-02-24 14:36:31 +00:00
)
2026-02-24 16:19:15 +00:00
user.set_password("password123")
2026-02-24 14:36:31 +00:00
db_session.add(user)
db_session.commit()
assert user.id is not None
2026-02-25 18:32:57 +00:00
assert user.email == "test2@example.com"
assert user.username == "testuser2"
2026-02-24 16:19:15 +00:00
assert user.first_name == "Test"
assert user.last_name == "User"
2026-02-24 14:36:31 +00:00
@pytest.mark.unit
def test_user_password_hashing(self, db_session):
"""Test password hashing and verification"""
2026-02-25 18:32:57 +00:00
user = User(email="test1@example.com", username="testuser1")
2026-02-24 16:19:15 +00:00
user.set_password("password123")
2026-02-24 14:36:31 +00:00
db_session.add(user)
db_session.commit()
2026-02-24 16:19:15 +00:00
assert user.check_password("password123") is True
assert user.check_password("wrongpassword") is False
2026-02-24 14:36:31 +00:00
@pytest.mark.unit
def test_user_to_dict(self, db_session):
"""Test user serialization to dictionary"""
user = User(
2026-02-24 16:19:15 +00:00
email="test@example.com",
username="testuser",
first_name="Test",
last_name="User",
2026-02-24 14:36:31 +00:00
)
2026-02-24 16:19:15 +00:00
user.set_password("password123")
2026-02-24 14:36:31 +00:00
db_session.add(user)
db_session.commit()
user_dict = user.to_dict()
2026-02-24 16:19:15 +00:00
assert user_dict["email"] == "test@example.com"
assert user_dict["username"] == "testuser"
assert "password" not in user_dict
assert "password_hash" not in user_dict
2026-02-24 14:36:31 +00:00
@pytest.mark.unit
def test_user_repr(self, db_session):
"""Test user string representation"""
2026-02-25 18:32:57 +00:00
user = User(email="test3@example.com", username="testuser3")
2026-02-24 16:19:15 +00:00
user.set_password("password123")
2026-02-24 14:36:31 +00:00
db_session.add(user)
db_session.commit()
2026-02-25 18:32:57 +00:00
assert repr(user) == "<User testuser3>"
2026-02-24 14:36:31 +00:00
class TestProductModel:
"""Test Product model"""
@pytest.mark.unit
def test_product_creation(self, db_session):
"""Test creating a product"""
product = Product(
2026-02-24 16:19:15 +00:00
name="Test Product",
description="A test product",
price=Decimal("99.99"),
2026-02-24 14:36:31 +00:00
stock=10,
2026-02-24 16:19:15 +00:00
image_url="https://example.com/product.jpg",
2026-02-24 14:36:31 +00:00
)
db_session.add(product)
db_session.commit()
assert product.id is not None
2026-02-24 16:19:15 +00:00
assert product.name == "Test Product"
assert product.price == Decimal("99.99")
2026-02-24 14:36:31 +00:00
assert product.stock == 10
assert product.is_active is True
@pytest.mark.unit
def test_product_to_dict(self, db_session):
"""Test product serialization to dictionary"""
product = Product(
2026-02-24 16:19:15 +00:00
name="Test Product",
description="A test product",
price=Decimal("99.99"),
stock=10,
2026-02-24 14:36:31 +00:00
)
db_session.add(product)
db_session.commit()
product_dict = product.to_dict()
2026-02-24 16:19:15 +00:00
assert product_dict["name"] == "Test Product"
assert product_dict["price"] == 99.99
assert isinstance(product_dict["created_at"], str)
assert isinstance(product_dict["updated_at"], str)
2026-02-24 14:36:31 +00:00
@pytest.mark.unit
def test_product_defaults(self, db_session):
"""Test product default values"""
2026-02-24 16:19:15 +00:00
product = Product(name="Test Product", price=Decimal("9.99"))
2026-02-24 14:36:31 +00:00
db_session.add(product)
db_session.commit()
assert product.stock == 0
assert product.is_active is True
assert product.description is None
assert product.image_url is None
@pytest.mark.unit
def test_product_repr(self, db_session):
"""Test product string representation"""
2026-02-24 16:19:15 +00:00
product = Product(name="Test Product", price=Decimal("9.99"))
2026-02-24 14:36:31 +00:00
db_session.add(product)
db_session.commit()
2026-02-24 16:19:15 +00:00
assert repr(product) == "<Product Test Product>"
2026-02-24 14:36:31 +00:00
class TestOrderModel:
"""Test Order model"""
@pytest.mark.unit
def test_order_creation(self, db_session, regular_user):
"""Test creating an order"""
order = Order(
user_id=regular_user.id,
2026-02-24 16:19:15 +00:00
total_amount=Decimal("199.99"),
shipping_address="123 Test St",
2026-02-24 14:36:31 +00:00
)
db_session.add(order)
db_session.commit()
assert order.id is not None
assert order.user_id == regular_user.id
2026-02-24 16:19:15 +00:00
assert order.total_amount == Decimal("199.99")
2026-02-24 14:36:31 +00:00
@pytest.mark.unit
def test_order_to_dict(self, db_session, regular_user):
"""Test order serialization to dictionary"""
order = Order(
user_id=regular_user.id,
2026-02-24 16:19:15 +00:00
total_amount=Decimal("199.99"),
shipping_address="123 Test St",
2026-02-24 14:36:31 +00:00
)
db_session.add(order)
db_session.commit()
order_dict = order.to_dict()
2026-02-24 16:19:15 +00:00
assert order_dict["user_id"] == regular_user.id
assert order_dict["total_amount"] == 199.99
assert isinstance(order_dict["created_at"], str)
2026-02-24 14:36:31 +00:00
class TestOrderItemModel:
"""Test OrderItem model"""
@pytest.mark.unit
def test_order_item_creation(self, db_session, order, product):
"""Test creating an order item"""
order_item = OrderItem(
2026-02-24 16:19:15 +00:00
order_id=order.id, product_id=product.id, quantity=2, price=product.price
2026-02-24 14:36:31 +00:00
)
db_session.add(order_item)
db_session.commit()
assert order_item.id is not None
assert order_item.order_id == order.id
assert order_item.product_id == product.id
assert order_item.quantity == 2
@pytest.mark.unit
def test_order_item_to_dict(self, db_session, order, product):
"""Test order item serialization to dictionary"""
order_item = OrderItem(
2026-02-24 16:19:15 +00:00
order_id=order.id, product_id=product.id, quantity=2, price=product.price
2026-02-24 14:36:31 +00:00
)
db_session.add(order_item)
db_session.commit()
item_dict = order_item.to_dict()
2026-02-24 16:19:15 +00:00
assert item_dict["order_id"] == order.id
assert item_dict["product_id"] == product.id
assert item_dict["quantity"] == 2