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)