Files
Example-TCG-Site/tests/test_marketplace.py
Ryan Westfall 739d136209 Last bit of major changes
Closes #1
Closes #5
Closes #6
Closes #8
Closes #9
Closes #10
2026-01-26 04:11:38 -06:00

109 lines
4.5 KiB
Python

from django.test import TestCase
from django.contrib.auth import get_user_model
from store.models import Seller, CardListing, PackListing, Order, OrderItem, Card, Game, Set, Cart, CartItem
User = get_user_model()
class MarketplaceTests(TestCase):
def setUp(self):
# Create Users
self.seller_user = User.objects.create_user(username='seller', password='password')
self.buyer_user = User.objects.create_user(username='buyer', password='password')
# Create Seller
self.seller = Seller.objects.create(
user=self.seller_user,
store_name='Test Store',
slug='test-store',
contact_email='seller@test.com'
)
# Create Game/Set/Card
self.game = Game.objects.create(name='Test Game', slug='test-game')
self.set = Set.objects.create(game=self.game, name='Test Set')
self.card = Card.objects.create(set=self.set, name='Test Card')
# Create Listing
self.listing = CardListing.objects.create(
card=self.card,
seller=self.seller,
price=10.00,
quantity=5
)
def test_seller_creation(self):
self.assertEqual(self.seller.store_name, 'Test Store')
self.assertEqual(self.seller.user.username, 'seller')
def test_order_creation_and_revenue(self):
# Create Cart and Add Item
cart = Cart.objects.create(user=self.buyer_user)
CartItem.objects.create(cart=cart, listing=self.listing, quantity=2)
# Simulate Checkout Logic (Manual or call view? Logic is in view. We can simulate logic here to test models/signals, but view logic needs integration test.)
# For simplicity, let's replicate the core logic or create order manually as checkout would.
# Logic from checkout view:
order = Order.objects.create(
user=self.buyer_user,
status='paid',
total_price=20.00
)
item = OrderItem.objects.create(
order=order,
listing=self.listing,
price_at_purchase=self.listing.price,
quantity=2
)
# Decrement stock
self.listing.quantity -= 2
self.listing.save()
# Verify Listing Stock
self.listing.refresh_from_db()
self.assertEqual(self.listing.quantity, 3)
# Verify Revenue Logic (as in Dashboard)
# card_items = OrderItem.objects.filter(listing__seller=seller, order__status__in=['paid', 'shipped'])
card_items = OrderItem.objects.filter(listing__seller=self.seller, order__status='paid')
revenue = sum(i.price_at_purchase * i.quantity for i in card_items)
self.assertEqual(revenue, 20.00)
def test_multi_seller_order_split(self):
# Create another seller
seller2_user = User.objects.create_user(username='seller2', password='password')
seller2 = Seller.objects.create(user=seller2_user, store_name='Store 2', slug='store-2')
card2 = Card.objects.create(set=self.set, name='Card 2')
listing2 = CardListing.objects.create(card=card2, seller=seller2, price=5.00, quantity=10)
# Setup Cart with items from both sellers
cart = Cart.objects.create(user=self.buyer_user)
CartItem.objects.create(cart=cart, listing=self.listing, quantity=1) # Seller 1 ($10)
CartItem.objects.create(cart=cart, listing=listing2, quantity=1) # Seller 2 ($5)
# Verify Split Logic (Simulating checkout view logic)
items_by_seller = {}
for item in cart.items.all():
seller = item.listing.seller
if seller not in items_by_seller: items_by_seller[seller] = []
items_by_seller[seller].append(item)
self.assertEqual(len(items_by_seller), 2)
self.assertIn(self.seller, items_by_seller)
self.assertIn(seller2, items_by_seller)
# Create Orders
orders_created = []
for seller, items in items_by_seller.items():
sub_total = sum(i.listing.price * i.quantity for i in items)
order = Order.objects.create(user=self.buyer_user, status='paid', total_price=sub_total)
for i in items:
OrderItem.objects.create(order=order, listing=i.listing, price_at_purchase=i.listing.price, quantity=i.quantity)
orders_created.append(order)
self.assertEqual(len(orders_created), 2)
self.assertEqual(orders_created[0].total_price + orders_created[1].total_price, 15.00)