All Projects → stphivos → Django Mock Queries

stphivos / Django Mock Queries

Licence: mit
A library for mocking django queryset functions in memory for testing

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Django Mock Queries

MockDataGenerator
Generate mock data for POCO
Stars: ✭ 12 (-93.58%)
Mutual labels:  mocking, unittest
Fake Xrm Easy
The testing framework for Dynamics CRM and Dynamics 365 which runs on an In-Memory context and deals with mocks or fakes for you
Stars: ✭ 216 (+15.51%)
Mutual labels:  mocking, unittest
mockfn
A mocking library for Clojure.
Stars: ✭ 18 (-90.37%)
Mutual labels:  mocking, test-driven-development
Bash unit
bash unit testing enterprise edition framework for professionals
Stars: ✭ 419 (+124.06%)
Mutual labels:  test-driven-development, unittest
Green
Green is a clean, colorful, fast python test runner.
Stars: ✭ 691 (+269.52%)
Mutual labels:  test-driven-development, unittest
Unit Threaded
Advanced unit test framework for D
Stars: ✭ 100 (-46.52%)
Mutual labels:  mocking, unittest
Moka
A Go mocking framework.
Stars: ✭ 53 (-71.66%)
Mutual labels:  mocking, test-driven-development
Mockito
Most popular Mocking framework for unit tests written in Java
Stars: ✭ 12,453 (+6559.36%)
Mutual labels:  mocking, test-driven-development
Django Photo Gallery
Responsive Django Image Gallery Site Sample optimized for performance and mobile devices
Stars: ✭ 179 (-4.28%)
Mutual labels:  django
Django Enumfield
Custom Django field for using enumerations of named constants
Stars: ✭ 184 (-1.6%)
Mutual labels:  django
Justchat
A chat application built with Django channels.
Stars: ✭ 183 (-2.14%)
Mutual labels:  django
Ioredis Mock
Emulates ioredis by performing all operations in-memory.
Stars: ✭ 181 (-3.21%)
Mutual labels:  mocking
Django Markupfield
📑 a MarkupField for Django
Stars: ✭ 184 (-1.6%)
Mutual labels:  django
Django dramatiq
A Django app that integrates with Dramatiq.
Stars: ✭ 181 (-3.21%)
Mutual labels:  django
Turbo Django
An early stage integration of Hotwire Turbo with Django
Stars: ✭ 185 (-1.07%)
Mutual labels:  django
Django Rest Framework Serializer Extensions
Extensions to help DRY up Django Rest Framework serializers
Stars: ✭ 180 (-3.74%)
Mutual labels:  django
Misago
Misago is fully featured modern forum application that is fast, scalable and responsive.
Stars: ✭ 2,170 (+1060.43%)
Mutual labels:  django
College Erp
A college management system built using Django framework. It is designed for interactions between students and teachers. Features include attendance, marks and time table.
Stars: ✭ 187 (+0%)
Mutual labels:  django
Python Notifyall
A library which can be used for all types of notifications like SMS, Mail, Push.
Stars: ✭ 185 (-1.07%)
Mutual labels:  django
Django Restfulapi
基于 Django 3.x 的 RESTfulAPI 风格的项目模板,用于快速构建企业级高性能的服务端。
Stars: ✭ 184 (-1.6%)
Mutual labels:  django

Latest Version Build Status Code Coverage Code Climate

Django Mock Queries

A library for mocking Django queryset functions in memory for testing

Features

  • QuerySet style support for method chaining
  • Filtering with Q objects
  • Aggregates generation
  • CRUD functions
  • Field lookups
  • django-rest-framework serializer asserts

Examples

from django.db.models import Avg, Q
from django_mock_queries.query import MockSet, MockModel

qs = MockSet(
    MockModel(mock_name='john', email='[email protected]'),
    MockModel(mock_name='jeff', email='[email protected]'),
    MockModel(mock_name='bill', email='[email protected]'),
)

print [x for x in qs.all().filter(email__icontains='gmail.com').select_related('address')]
# Outputs: [john, bill]

qs = MockSet(
    MockModel(mock_name='model s', msrp=70000),
    MockModel(mock_name='model x', msrp=80000),
    MockModel(mock_name='model 3', msrp=35000),
)

print qs.all().aggregate(Avg('msrp'))
# Outputs: {'msrp__avg': 61666}

qs = MockSet(
    MockModel(mock_name='model x', make='tesla', country='usa'),
    MockModel(mock_name='s-class', make='mercedes', country='germany'),
    MockModel(mock_name='s90', make='volvo', country='sweden'),
)

print [x for x in qs.all().filter(Q(make__iexact='tesla') | Q(country__iexact='germany'))]
# Outputs: [model x, s-class]

qs = MockSet(cls=MockModel)
print qs.create(mock_name='my_object', foo='1', bar='a')
# Outputs: my_object

print [x for x in qs]
# Outputs: [my_object]

Test function that uses Django QuerySet:

"""
Function that queries active users
"""
def active_users(self):
    return User.objects.filter(is_active=True).all()

"""
Test function applies expected filters by patching Django's user model Manager or Queryset with a MockSet
"""
from mock import patch
from django_mock_queries.query import MockSet, MockModel


class TestApi(TestCase):
    users = MockSet()
    user_objects = patch('django.contrib.auth.models.User.objects', users)

    @user_objects
    def test_api_active_users_filters_by_is_active_true(self):
        self.users.add(
        	MockModel(mock_name='active user', is_active=True),
        	MockModel(mock_name='inactive user', is_active=False)
        )

        for x in self.api.active_users():
        	assert x.is_active

Test django-rest-framework model serializer:

"""
Car model serializer that includes a nested serializer and a method field
"""
class CarSerializer(serializers.ModelSerializer):
    make = ManufacturerSerializer()
    speed = serializers.SerializerMethodField()

    def get_speed(self, obj):
        return obj.format_speed()

    class Meta:
        model = Car
        fields = ('id', 'make', 'model', 'speed',)

"""
Test serializer returns fields with expected values and mock the result of nested serializer for field make
"""
def test_car_serializer_fields(self):
    car = Car(id=1, make=Manufacturer(id=1, name='vw'), model='golf', speed=300)

    values = {
        'id': car.id,
        'model': car.model,
        'speed': car.formatted_speed(),
    }

    assert_serializer(CarSerializer) \
        .instance(car) \
        .returns('id', 'make', 'model', 'speed') \
        .values(**values) \
        .mocks('make') \
        .run()

Full Example

There is a full Django application in the examples/users folder. It shows how to configure django_mock_queries in your tests and run them with or without setting up a Django database. Running the mock tests without a database can be much faster when your Django application has a lot of database migrations.

To run your Django tests without a database, add a new settings file, and call monkey_patch_test_db(). Use a wildcard import to get all the regular settings as well.

# settings_mocked.py
from django_mock_queries.mocks import monkey_patch_test_db

from users.settings import *

monkey_patch_test_db()

Then run your Django tests with the new settings file:

./manage.py test --settings=users.settings_mocked

Here's the pytest equivalent:

pytest --ds=users.settings_mocked

That will run your tests without setting up a test database. All of your tests that use Django mock queries should run fine, but what about the tests that really need a database?

ERROR: test_create (examples.users.analytics.tests.TestApi)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/.../examples/users/analytics/tests.py", line 28, in test_create
    start_count = User.objects.count()
  [...]
NotSupportedError: Mock database tried to execute SQL for User model.

If you want to run your tests without a database, you need to tell Django to skip the tests that need a database. You can do that by putting a skip decorator on the test classes or test methods that need a database.

@skipIfDBFeature('is_mocked')
class TestApi(TestCase):
    def test_create(self):
        start_count = User.objects.count()

        User.objects.create(username='bob')
        final_count = User.objects.count()

        self.assertEqual(start_count + 1, final_count)

Installation

$ pip install django_mock_queries

Contributing

Anything missing or not functioning correctly? PRs are always welcome! Otherwise, you can create an issue so someone else does it when time allows.

You can follow these guidelines:

  • Fork the repo from this page
  • Clone your fork:
$ git clone https://github.com/{your-username}/django-mock-queries.git
$ cd django-mock-queries
$ git checkout -b feature/your_cool_feature
  • Implement feature/fix
  • Add/modify relevant tests
  • Run tox to verify all tests and flake8 quality checks pass
$ tox
  • Commit and push local branch to your origin
$ git commit . -m "New cool feature does this"
$ git push -u origin HEAD
  • Create pull request

TODO

  • Add docs as a service like readthedocs with examples for every feature
  • Add support for missing QuerySet methods/Field lookups/Aggregation functions:
    • Methods that return new QuerySets: annotate, reverse, none, extra, raw

    • Methods that do not return QuerySets: bulk_create, in_bulk, as_manager

    • Field lookups: search

    • Aggregation functions: StdDev, Variance

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].