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)