from django.test import TestCase, Client from django.urls import reverse from users.models import User, Address, PaymentMethod from store.models import Seller, CardListing, Card, Set, Game, Cart, Order, OrderItem from django.utils.text import slugify class CheckoutFlowTest(TestCase): def setUp(self): self.client = Client() # Create Buyer self.user = User.objects.create_user(username='buyer', password='password') self.client.login(username='buyer', password='password') # Create Address self.address = Address.objects.create( user=self.user, name='Buyer Name', street='123 Initial St', city='New York', state='NY', zip_code='10001', address_type='shipping' ) # Create Payment Method self.pm = PaymentMethod.objects.create( user=self.user, brand='Visa', last4='4242', # Mock exp_month=12, exp_year=2030, billing_address=self.address ) self.pm.card_number = '4242424242424242' # Encrypts self.pm.save() # Create Seller and items self.seller_user = User.objects.create_user(username='seller', password='password') self.seller = Seller.objects.create( user=self.seller_user, store_name='Test Store', slug='test-store', minimum_order_amount=200, shipping_cost=5 ) self.game = Game.objects.create(name='Magic', slug='magic') self.set = Set.objects.create(game=self.game, name='Alpha') self.card = Card.objects.create(set=self.set, name='Black Lotus') self.listing = CardListing.objects.create( card=self.card, seller=self.seller, price=100.00, quantity=1, status='listed' ) def test_checkout_process(self): # Add to cart (requires manual cart creation or view call, let's create cart manually for speed) from users.models import Buyer buyer, _ = Buyer.objects.get_or_create(user=self.user) cart = Cart.objects.create(buyer=buyer) from store.models import CartItem CartItem.objects.create(cart=cart, listing=self.listing, quantity=1) # Get checkout page response = self.client.get(reverse('store:checkout')) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Checkout') self.assertContains(response, 'Total: $100.00') # Post checkout data = { 'shipping_address': self.address.id, 'payment_method': self.pm.id } response = self.client.post(reverse('store:checkout'), data) self.assertEqual(response.status_code, 302) # Redirect to vault # Verify Order order = Order.objects.filter(buyer=buyer).first() self.assertIsNotNone(order) self.assertEqual(order.status, 'paid') self.assertIn('123 Initial St', order.shipping_address) self.assertEqual(order.total_price, 105.00) # 100 + 5 shipping # Verify Stock self.listing.refresh_from_db() self.assertEqual(self.listing.quantity, 0)