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