kopia lustrzana https://github.com/longclawshop/longclaw
153 wiersze
5.2 KiB
Python
153 wiersze
5.2 KiB
Python
from unittest import mock
|
|
from contextlib import contextmanager
|
|
|
|
import factory
|
|
from django.urls import reverse_lazy
|
|
|
|
from rest_framework.test import APITestCase
|
|
from rest_framework import status
|
|
|
|
from wagtail_factories import PageFactory
|
|
|
|
|
|
from longclaw.basket.models import BasketItem
|
|
from longclaw.orders.models import Order
|
|
from longclaw.shipping.models import Address, Country, ShippingRate
|
|
from longclaw.utils import ProductVariant, maybe_get_product_model
|
|
|
|
|
|
@contextmanager
|
|
def catch_signal(signal):
|
|
"""
|
|
Catch django signal and return the mocked call.
|
|
https://medium.freecodecamp.org/how-to-testing-django-signals-like-a-pro-c7ed74279311
|
|
"""
|
|
handler = mock.Mock()
|
|
signal.connect(handler)
|
|
yield handler
|
|
signal.disconnect(handler)
|
|
|
|
|
|
class OrderFactory(factory.django.DjangoModelFactory):
|
|
class Meta:
|
|
model = Order
|
|
|
|
class CountryFactory(factory.django.DjangoModelFactory):
|
|
class Meta:
|
|
model = Country
|
|
|
|
iso = factory.Faker('pystr', max_chars=2, min_chars=2)
|
|
name_official = factory.Faker('text', max_nb_chars=128)
|
|
name = factory.Faker('text', max_nb_chars=128)
|
|
|
|
|
|
class AddressFactory(factory.django.DjangoModelFactory):
|
|
|
|
class Meta:
|
|
model = Address
|
|
|
|
name = factory.Faker('text', max_nb_chars=64)
|
|
line_1 = factory.Faker('text', max_nb_chars=128)
|
|
line_2 = factory.Faker('text', max_nb_chars=128)
|
|
city = factory.Faker('text', max_nb_chars=64)
|
|
postcode = factory.Faker('text', max_nb_chars=10)
|
|
country = factory.SubFactory(CountryFactory)
|
|
|
|
class ShippingRateFactory(factory.django.DjangoModelFactory):
|
|
class Meta:
|
|
model = ShippingRate
|
|
|
|
name = factory.Faker('text', max_nb_chars=32)
|
|
rate = 1.0
|
|
carrier = 'Royal Mail'
|
|
description = 'Test'
|
|
|
|
@factory.post_generation
|
|
def countries(self, create, extracted, **kwargs):
|
|
if not create:
|
|
# Simple build, do nothing.
|
|
return
|
|
|
|
if extracted:
|
|
# A list of countries were passed in, use them
|
|
for country in extracted:
|
|
self.countries.add(country)
|
|
|
|
class ProductFactory(PageFactory):
|
|
""" Create a random Product
|
|
"""
|
|
|
|
class Meta:
|
|
model = maybe_get_product_model()
|
|
|
|
title = factory.Faker('sentence', nb_words=1)
|
|
description = factory.Faker('text')
|
|
|
|
class ProductVariantFactory(factory.django.DjangoModelFactory):
|
|
|
|
class Meta:
|
|
model = ProductVariant
|
|
|
|
product = factory.SubFactory(ProductFactory)
|
|
description = factory.Faker('text')
|
|
base_price = factory.Faker('pyfloat', positive=True, left_digits=2, right_digits=2)
|
|
ref = factory.Faker('pystr', min_chars=3, max_chars=10)
|
|
stock = factory.Faker('pyint')
|
|
|
|
|
|
class BasketItemFactory(factory.django.DjangoModelFactory):
|
|
|
|
class Meta:
|
|
model = BasketItem
|
|
|
|
quantity = 1
|
|
variant = factory.SubFactory(ProductVariantFactory)
|
|
|
|
class LongclawTestCase(APITestCase):
|
|
|
|
def get_test(self, urlname, urlkwargs=None, params=None, success_expected=True, **kwargs):
|
|
""" Submit a GET request and assert the response status code is 200
|
|
|
|
Arguments:
|
|
urlname (str): The url name to pass to the 'reverse_lazy' function
|
|
urlkwargs (dict): The `kwargs` parameter to pass to the `reverse_lazy` function
|
|
"""
|
|
params = params or {}
|
|
response = self.client.get(reverse_lazy(urlname, kwargs=urlkwargs), params, **kwargs)
|
|
if success_expected:
|
|
self.assertTrue(status.is_success(response.status_code), response.content)
|
|
return response
|
|
|
|
def post_test(self, data, urlname, urlkwargs=None, success_expected=True, **kwargs):
|
|
""" Submit a POST request and assert the response status code is 201
|
|
|
|
Arguments:
|
|
data (dict): The data to pass to the post request
|
|
urlname (str): The url name to pass to the 'reverse_lazy' function
|
|
urlkwargs (dict): The `kwargs` parameter to pass to the `reverse_lazy` function
|
|
"""
|
|
response = self.client.post(reverse_lazy(urlname, kwargs=urlkwargs), data, **kwargs)
|
|
if success_expected:
|
|
self.assertTrue(status.is_success(response.status_code), response.content)
|
|
return response
|
|
|
|
def patch_test(self, data, urlname, urlkwargs=None, success_expected=True, **kwargs):
|
|
""" Submit a PATCH request and assert the response status code is 200
|
|
"""
|
|
response = self.client.patch(reverse_lazy(urlname, kwargs=urlkwargs), data, **kwargs)
|
|
if success_expected:
|
|
self.assertTrue(status.is_success(response.status_code), response.content)
|
|
return response
|
|
|
|
def put_test(self, data, urlname, urlkwargs=None, success_expected=True, **kwargs):
|
|
response = self.client.put(reverse_lazy(urlname, kwargs=urlkwargs), data, **kwargs)
|
|
if success_expected:
|
|
self.assertTrue(status.is_success(response.status_code), response.content)
|
|
return response
|
|
|
|
def del_test(self, urlname, urlkwargs=None, success_expected=True, **kwargs):
|
|
response = self.client.delete(reverse_lazy(urlname, kwargs=urlkwargs), **kwargs)
|
|
if success_expected:
|
|
self.assertTrue(status.is_success(response.status_code), response.content)
|
|
return response
|