109 lines
4.5 KiB
Python
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)
|
|
|