91 lines
3.3 KiB
Python
91 lines
3.3 KiB
Python
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)
|