diff --git a/run_tests.sh b/run_tests.sh index 0e146b6..73a02c5 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -1,4 +1,4 @@ _#!/bin/bash export PYTHONPATH=./ -rm -rf db.sqlite +rm -rf db.sqlite3 pytest \ No newline at end of file diff --git a/test/test_example.py b/test/test_example.py deleted file mode 100644 index 4b61d2e..0000000 --- a/test/test_example.py +++ /dev/null @@ -1,6 +0,0 @@ - -# content of test_sample.py - -def test_equality(): - - assert 1==1 \ No newline at end of file diff --git a/test/test_models.py b/test/test_models.py new file mode 100644 index 0000000..f47f135 --- /dev/null +++ b/test/test_models.py @@ -0,0 +1,63 @@ +import pytest +from django.contrib.auth import get_user_model +from inventory.models import Product, Order, OrderItem + +User = get_user_model() + +@pytest.fixture +def user(): + return User.objects.create_user( + username='testuser', + password='password123', + email='testuser@example.com' + ) + +@pytest.fixture +def admin_user(): + return User.objects.create_superuser( + username='adminuser', + password='adminpassword', + email='admin@example.com' + ) + +@pytest.mark.django_db +def test_product_creation(user): + product = Product.objects.create( + name='Test Product', + description='Test Description', + quantity=100, + price=10, + owner=user + ) + + assert product.name == 'Test Product' + assert product.description == 'Test Description' + assert product.quantity == 100 + assert product.price == 10 + assert product.owner == user + + +@pytest.mark.django_db +def test_order_creation(user): + order = Order.objects.create(owner=user, status='pending') + + assert order.owner == user + assert order.status == 'pending' + assert order.items.count() == 0 + + +@pytest.mark.django_db +def test_order_item_creation(user): + product = Product.objects.create( + name='Test Product', + description='Test Description', + quantity=100, + price=10, + owner=user + ) + order = Order.objects.create(owner=user, status='pending') + order_item = OrderItem.objects.create(order=order, product=product, quantity=10) + + assert order_item.order == order + assert order_item.product == product + assert order_item.quantity == 10 diff --git a/test/test_serializers.py b/test/test_serializers.py new file mode 100644 index 0000000..fcc15b2 --- /dev/null +++ b/test/test_serializers.py @@ -0,0 +1,115 @@ +import pytest +from rest_framework.exceptions import ValidationError +from inventory.models import Product, Order, OrderItem +from inventory.serializers import OrderSerializer, OrderItemSerializer +from django.contrib.auth import get_user_model + +User = get_user_model() + +@pytest.mark.django_db +def test_order_item_serializer(): + user = User.objects.create_user(username='testuser', email='admin@mail.com', password='password') + product = Product.objects.create(name='Test Product', description='Test Description', quantity=100, price=10, owner=user) + order = Order.objects.create(owner=user, status='pending') + + data = { + 'product': product.id, + 'quantity': 10 + } + + serializer = OrderItemSerializer(data=data) + assert serializer.is_valid() + item = serializer.save(order=order) + + assert item.order == order + assert item.product == product + assert item.quantity == 10 + +@pytest.mark.django_db +def test_order_serializer(): + user = User.objects.create_user(username='testuser2', email='admin2@mail.com', password='password') + product = Product.objects.create(name='Test Product2', description='Test Description', quantity=100, price=10, owner=user) + + data = { + 'status': 'pending', + 'items': [ + { + 'product': product.id, + 'quantity': 10 + } + ] + } + + serializer = OrderSerializer(data=data) + assert serializer.is_valid() + + order = serializer.save(owner=user) + + assert order.owner == user + assert order.status == 'pending' + assert order.items.count() == 1 + + item = order.items.first() + assert item.product == product + assert item.quantity == 10 + + +@pytest.mark.django_db +def test_order_serializer_invalid_product(): + user = User.objects.create_user(username='testuser3', email='admin3@mail.com', password='password') + + data = { + 'status': 'pending', + 'items': [ + { + 'product': 999, # Invalid product ID + 'quantity': 10 + } + ] + } + + serializer = OrderSerializer(data=data) + assert not serializer.is_valid() + assert 'items' in serializer.errors + + +@pytest.mark.django_db +def test_order_serializer_insufficient_stock(): + user = User.objects.create_user(username='testuser4', email='admin4@mail.com', password='password') + product = Product.objects.create(name='Test Product3', description='Test Description', quantity=5, price=10, owner=user) + + data = { + 'status': 'pending', + 'items': [ + { + 'product': product.id, + 'quantity': 10 + } + ] + } + + serializer = OrderSerializer(data=data) + assert serializer.is_valid() + + with pytest.raises(ValidationError) as excinfo: + serializer.save(owner=user) + + assert 'Insufficient stock' in str(excinfo.value) + +@pytest.mark.django_db +def test_order_serializer_partial_update(): + user = User.objects.create_user(username='testuser5', email='admin5@mail.com', password='password') + product = Product.objects.create(name='Test Product4', description='Test Description', quantity=100, price=10, owner=user) + order = Order.objects.create(owner=user, status='pending') + OrderItem.objects.create(order=order, product=product, quantity=10) + + data = { + 'status': 'completed' + } + + serializer = OrderSerializer(order, data=data, partial=True) + assert serializer.is_valid() + + updated_order = serializer.save() + assert updated_order.status == 'completed' + assert updated_order.items.count() == 1