server/store/tests.py (122 lines of code) (raw):

#!/usr/bin/python # # Copyright 2022 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import json from decimal import Decimal from django.contrib.auth.models import User from django.test import TransactionTestCase from model_bakery import baker from rest_framework.reverse import reverse from rest_framework.test import APIClient, APIRequestFactory from store.serializers import ProductSerializer, CartSerializer from store.models import Product client = APIClient() factory = APIRequestFactory() class DecimalEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, Decimal): return float(obj) return json.JSONEncoder.default(self, obj) def create_product(obj): payload = ProductSerializer(obj).data user = User.objects.create_superuser(username="test", password="test") client.force_login(user) response = client.post( reverse("product-list"), json.dumps(payload, cls=DecimalEncoder), content_type="application/json", ) return response class AvocanoUnitTest(TransactionTestCase): def test_basic_post(self): response = create_product(baker.prepare("store.Product")) self.assertEqual(response.status_code, 201) class CartSerializerErrorsTest(TransactionTestCase): def test_bad_email(self): cart = CartSerializer(data={"customer": {"email": "foo"}}) assert not cart.is_valid() assert "customer" in set(cart.errors) def test_bad_payment(self): cart = CartSerializer(data={"payment": {"method": "foo"}}) assert not cart.is_valid() assert "payment" in set(cart.errors) assert "method" in set(cart.errors["payment"]) def test_bad_credit(self): cart = CartSerializer(data={"payment": {"method": "credit"}}) assert not cart.is_valid() assert "payment" in set(cart.errors) assert "method" in set(cart.errors["payment"]) class CartRequestTest(TransactionTestCase): def setUp(self): Product.objects.create( id=1, name="test", discount_percent=0, inventory_count=4, price=1, active=False, ) def test_cart_product(self): data = { "payment": {"method": "collect"}, "customer": {"email": "foo@bar.com"}, "items": [{"id": 1, "countRequested": 1}], } cart = CartSerializer(data=data) assert cart.is_valid() assert len(cart.errors) == 0 response = client.post( reverse("checkout"), json.dumps(data), content_type="application/json", ) self.assertEqual(response.status_code, 200) def test_cart_invalid_payment(self): data = { "payment": {"method": "credit"}, "customer": {"email": "foo@bar.com"}, "items": [{"id": 1, "countRequested": 1}], } response = client.post( reverse("checkout"), json.dumps(data), content_type="application/json", ) self.assertEqual(response.status_code, 501) self.assertEqual(response.json()["status"], "invalid_choice") def test_cart_invalid_email(self): data = { "payment": {"method": "collect"}, "customer": {"email": "foo"}, "items": [{"id": 1, "countRequested": 1}], } response = client.post( reverse("checkout"), json.dumps(data), content_type="application/json", ) self.assertEqual(response.status_code, 400) self.assertEqual(response.json()["status"], "validation_error") def test_cart_insufficient_inventory(self): data = { "payment": {"method": "collect"}, "customer": {"email": "foo@bar.com"}, "items": [{"id": 1, "countRequested": 100}], } response = client.post( reverse("checkout"), json.dumps(data), content_type="application/json", ) self.assertEqual(response.status_code, 400) self.assertEqual(response.json()["status"], "insufficient_product") def test_cart_invalid_inventory(self): data = { "payment": {"method": "collect"}, "customer": {"email": "foo@bar.com"}, "items": [{"id": 111111, "countRequested": 1}], } response = client.post( reverse("checkout"), json.dumps(data), content_type="application/json", ) self.assertEqual(response.status_code, 400) self.assertEqual(response.json()["status"], "product_not_found")