use the power of restframework also as a library functions
Project description
The drf-api-action Python package is designed to elevate your testing experience for Django Rest Framework (DRF) REST endpoints. With the custom decorator api-action, this package empowers you to effortlessly test your REST endpoints as if they were conventional functions.
Features:
-
Simplified Testing: Testing DRF REST endpoints using the api-action decorator, treating them like regular functions.
-
Seamless Integration: Replacing DRF's action decorator with api-action in your WebViewSet seamlessly.
-
Exception Handling: Instead of getting a response with error code, get the real traceback that led to the error.
-
Pagination Support: Paginating easily through pages by a single kwarg.
Installation
You can install drf-api-action
using pip:
pip install drf-api-action
Usage
To use drf-api-action
, you need to follow these steps:
Step 1: Import the Required Classes and Decorators
Import the necessary classes and decorators from drf-api-action
and rest_framework
:
from drf_api_action.decorators import action_api
from drf_api_action.mixins import APIRestMixin
from rest_framework.viewsets import ModelViewSet
Step 2: Define Your View Class
Create your view class by inheriting from APIRestMixin
and ModelViewSet
:
class DummyView(APIRestMixin, ModelViewSet):
queryset = DummyModel.objects.all()
serializer_class = DummySerializer
Step 3: Define Your API Actions
Use the action_api
decorator instead of action
decorator to define your API actions as functions inside your view class:
From:
@action(detail=True, methods=["get"], serializer_class=DummySerializer)
def dummy(self, request, **kwargs):
serializer = self.get_serializer(instance=self.get_object())
return Response(data=serializer.data, status=status.HTTP_200_OK)
To:
@action_api(detail=True, methods=["get"], serializer_class=DummySerializer)
def dummy(self, request, **kwargs):
serializer = self.get_serializer(instance=self.get_object())
return Response(data=serializer.data, status=status.HTTP_200_OK)
In the example above, the dummy_func
function is decorated with action_api
.
It specifies that the action does not require a detail argument, supports the POST
method, and uses the DummySerializer
for serialization.
Step 4: test REST methods
- Create an instance of your view class and call the API actions as regular functions:
def test_dummy():
api = DummyView()
result = api.dummy(pk=1)
assert result['dummy_int'] == 1
query parameters/post payload are treated as function arguments as kwargs
- Exceptions are raised explicitly:
def test_dummy():
api = DummyView()
result = api.dummy(pk='bbb')
assert result['dummy_int'] == 1
tests/functionality_tests/test_as_api.py:11 (test_call_as_api)
self = <django.db.models.fields.BigAutoField: id>, value = 'bb'
def get_prep_value(self, value):
value = super().get_prep_value(value)
if value is None:
return None
try:
> return int(value)
E ValueError: invalid literal for int() with base 10: 'bb'
../venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2053: ValueError
The above exception was the direct cause of the following exception:
queryset = <QuerySet [<DummyModel: DummyModel object (1)>]>, filter_args = ()
filter_kwargs = {'pk': 'bb'}
def get_object_or_404(queryset, *filter_args, **filter_kwargs):
"""
Same as Django's standard shortcut, but make sure to also raise 404
if the filter_kwargs don't match the required types.
"""
try:
> return _get_object_or_404(queryset, *filter_args, **filter_kwargs)
../venv/lib/python3.9/site-packages/rest_framework/generics.py:19:
and so on....
- Pagination support with
page
kwarg:
>>> api = DummyAPIViewSet()
>>> response = api.by_dummy_int(request=None, dummy_int=1, page=2)
>>> {'count': 2, 'next': None, 'previous': '', 'results': [OrderedDict([('id', 2), ('dummy_int', 1)])]}
Package Testing
The drf-api-action
library includes tests to ensure the functionality works as expected. To run the tests, follow these steps:
- Navigate to the root directory of the
drf-api-action/
project.
cd tests/
- Run the tests using
pytest
python -m pytest -vv
The tests will be executed, and the results will be displayed in the console.
Contribution
Contributions to the drf-api-action
library are welcome. If you would like to contribute, please follow these steps:
-
Fork the
drf-api-action
repository on GitHub. -
Create a new branch for your feature or bug fix.
-
Make the necessary changes and additions.
-
Write tests to cover the new functionality or bug fix.
-
Run the existing tests to ensure all tests pass successfully.
-
Commit your changes and push them to your forked repository.
-
Open a pull request on the original
drf-api-action
repository and provide a detailed description of your changes.
The maintainers will review your pull request, provide feedback, and work with you to merge the changes into the main repository.
Thank you for considering contributing to drf-api-action
!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for drf_api_action-1.0.6-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 36e59d6aef290d20ed5eadece3e748d2faec22c19c4bc180f422b77120c1dae4 |
|
MD5 | 24ef389a6509d66743c9be9246919a0c |
|
BLAKE2b-256 | 5932bcf1d41748291696f171c75c214e04438aac92f091861704856df7f340c4 |