Last bit of major changes
Closes #1 Closes #5 Closes #6 Closes #8 Closes #9 Closes #10
This commit is contained in:
108
tests/test_marketplace.py
Normal file
108
tests/test_marketplace.py
Normal file
@@ -0,0 +1,108 @@
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user