Giter Club home page Giter Club logo

drf-api-action's Introduction

Alt text

codecov python - 3.8 | 3.9 | 3.10 | 3.11CI license - MIT

The drf-api-action Python package is designed to elevate your testing experience for Django Rest Framework (DRF) REST endpoints. With the api_action fixture, 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 plugin, treating them like regular functions.

  • Seamless Integration: you don't need to do anything in existing server code.

  • Easy Debugging: Instead of getting a response with error code by using default drf testing client object , get the real traceback that led to the error.

  • Pagination Support: Paginating easily through pages by using page argument.

Installation

You can install drf-api-action using pip:

pip install drf-api-action

Usage

To use drf-api-action as a Pytest fixture, you need to follow these steps:

Step 1: Import your Viewsets explicitly:

import pytest
from tests.test_server.test_app.models import DummyModel
from tests.test_server.test_app.views import DummyViewSetFixture

Step 2: use the following action_api mark decorator:

@pytest.mark.api_action(view_set_class={YOUR VIEW_SET})

e.g: our ViewSet is called DummyViewSetFixture

import pytest
from tests.test_server.test_app.views import DummyViewSetFixture


@pytest.mark.api_action(view_set_class=DummyViewSetFixture)
def test_call_as_api_fixture(db, api_action):
  pass

Now you can use all DummyViewSetFixture functionality!

Step 3: write your tests

e.g: our ViewSet is called DummyViewSetFixture

import pytest
from tests.test_server.test_app.models import DummyModel
from tests.test_server.test_app.views import DummyViewSetFixture


@pytest.mark.api_action(view_set_class=DummyViewSetFixture)
def test_call_as_api_fixture(db, api_action):
  dummy_model = DummyModel()
  dummy_model.dummy_int = 1
  dummy_model.save()
  res = api_action.api_dummy(pk=1)
  assert res["dummy_int"] == 1

Here as an example, the real exception and trace will be thrown, make it easy to understand what the issue is:

import pytest
from tests.test_server.test_app.views import DummyViewSetFixture


@pytest.mark.api_action(view_set_class=DummyViewSetFixture)
def test_dummy(db, api_action):
  result = api_action.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: 
....
....
...

Call endpoints with pagination:

@pytest.mark.api_action(view_set_class=DummyAPIViewSet)
def test_pagination_data(db, api_action):
    for i in range(1, 3):
        dummy_model = DummyModel()
        dummy_model.dummy_int = 1
        dummy_model.save()

    response = api_action.by_dummy_int(dummy_int=1, page=1)

    obj = response['results'][0]
    assert obj['dummy_int'] == 1

    assert extract_page_number(response['next']) == 2

    response = api_action.by_dummy_int(dummy_int=1, page=2)
    assert extract_page_number(response['previous']) == 1
    assert extract_page_number(response['next']) is None

Package Testing

The drf-api-action library includes tests to ensure the functionality works as expected. To run the tests run pytest:

pytest

The tests will be executed, and the results will be displayed in the console.

Example

Example of using drf-api-action in a DRF project

Support & Contribution

For guidance on support & contribution, see the contributing guidelines.

Bug Report

For guidance on how to open a bug, see the bug report template.

Open an Issue

For guidance on how to open an issue, see the issue template.

Code Of Conduct

code of conduct.

drf-api-action's People

Contributors

actions-user avatar dependabot[bot] avatar ori-roza avatar oriroza avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

drf-api-action's Issues

Request to Add Python 3.12 Support to drf-api-action Project

The current version of the drf-api-action project lacks support for Python 3.12. With the upcoming release of Python 3.12, it is essential to ensure compatibility with the latest Python version. This issue is raised to request the addition of Python 3.12 support to the project.

Update README:

  • Add a badge indicating support for Python 3.12 in the README file.

Update CI Configuration:

  • Add Python 3.12 to the version matrix in the project's CI configuration file (e.g., .travis.yml, .github/workflows/main.yml).

Test Compatibility:

  • Implement necessary changes to ensure that the project functions as expected with Python 3.12.
    Documentation Updates:

If any specific considerations or changes are needed for Python 3.12 compatibility, document them in the project's documentation.

Expected Behavior
After the proposed changes are implemented, the project should be compatible with Python 3.12, and the CI builds should pass successfully.

Steps to Reproduce
Update the README with the Python 3.12 badge.
Add Python 3.12 to the version matrix in the CI configuration file.
Test the project with Python 3.12 to ensure compatibility.
Additional Information

Link to the Python 3.12 release notes for reference.
If there are any specific features or changes in Python 3.12 that the project should leverage or address, please mention them here.
This enhancement will help users and contributors of the drf-api-action project to stay up-to-date with the latest Python version and benefit from any improvements or features introduced in Python 3.12.

Create a fixture that using drf-api-action capabilities

Instead of adding more features to the existing ViewSet, create a fixture that uses the same logic and turns ViewSet into regular callable functions.

Desired output:

class DummyViewSetFixture(ModelViewSet):
    queryset = DummyModel.objects.all()
    serializer_class = DummySerializer

    @action(detail=True, methods=["get"], serializer_class=DummySerializer)
    def api_dummy(self, request, **kwargs):
        serializer = self.get_serializer(instance=self.get_object())
        return Response(data=serializer.data, status=status.HTTP_200_OK)

...

import pytest
from tests.test_app.models import DummyModel
from tests.test_app.views import DummyViewSetFixture
from drf_api_action.fixtures import action_api


@pytest.mark.action_api(view_set_class=DummyViewSetFixture)
def test_call_as_api_fixture(db, action_api):
    dummy_model = DummyModel()
    dummy_model.dummy_int = 1
    dummy_model.save()
    res = action_api.api_dummy(pk=1)
    assert res["dummy_int"] == 1

Add auto pypi deployment

Add auto Pypi deployment

Description

  • Add .yaml file to github actions that auto deploys a new version to pypi
  • Create a secret on Github of twine user

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.