PyTest Recipes¶
Check DateTimeField()
with auto_now=True
¶
Create a custom Recorder and pass it to @contract
from drf_api_checker.recorder import Recorder
from drf_api_checker.pytest import contract, frozenfixture
class MyRecorder(Recorder):
def assert_timestamp(self, response, expected, path=''):
value = response['timestamp']
assert datetime.datetime.strptime(value, '%Y-%m-%dT%H:%M:%S.%f')
@contract(recorder_class=MyRecorder)
def test_user_list(user):
return reverse('api:user-list')
Check protected url¶
Create a custom Recorder and override client
property
class MyRecorder(Recorder):
@property
def client(self):
user = UserFactory(is_superuser=True)
client = APIClient()
client.force_authenticate(user)
return client
@contract(recorder_class=MyRecorder)
def test_user_list(user):
return reverse('api:user-list')
Check methods other than GET¶
from drf_api_checker.recorder import Recorder
from drf_api_checker.pytest import contract, frozenfixture
@contract(recorder_class=MyRecorder, method='post')
def test_url_post(frozen_detail):
url = reverse("master-create")
return url, {"name": "name1"}
Change the name of frozenfixture filename¶
def get_fixture_name(seed, request):
viewset = request.getfixturevalue('viewset')
url = viewset.get_service().endpoint.strip('.').replace('/', '_')
return os.path.join(seed, url) + '.fixture.json'
@frozenfixture(fixture_name=get_fixture_name)
def data(db, request):
viewset = request.getfixturevalue('viewset')
factory = factories_registry[viewset.serializer_class.Meta.model]
data = (factory(schema_name='bolivia'),
factory(schema_name='chad'),
factory(schema_name='lebanon'))
return data
Use pytest.parametrize¶
@pytest.mark.parametrize("method", ['get', 'options'])
def test_parametrize(frozen_detail, api_checker_datadir, method):
url = reverse("master-list")
recorder = MyRecorder(api_checker_datadir)
recorder.assertCALL(url, method=method)
Authenticate client with different users¶
pseudo-code
@pytest.mark.parametrize("permission", ['can_read', 'can_write'])
def test_parametrize(frozen_detail, api_checker_datadir, permission):
url = reverse("master-list")
user = UserFactory()
with user_grant_permissions(user, [permission])
recorder = MyRecorder(api_checker_datadir, as_user=user):
recorder.assertCALL(url, method=method)