Skip to main content

Test utilities for easily testing Django data migrations

Project description

Django Data Migration Test

Test utilities for easily testing Django data migrations

Installation

pip install django-test-data-migrations

Usage

Define the following functions in your migration file

  1. data_forward(*args)
  2. data_backward(*args) (optional)
from django_test_data_migrations import DataMigrationsTestCaseBase

from app_a.models import Animal

class YourDataMigrationTestCase(DataMigrationsTestCaseBase):
    def test__forward_migration__something_important(self):
        # Prepare some data

        # Run
        self.data_forward(some_arg_0, some_arg_1, ...)

        # Some assertions
    
    def test__backward_migration__something_important(self):
        # Prepare some data

        # Run
        self.data_backward(some_arg_0, some_arg_1, ...)

        # Some assertions

Example

Say you have a simple Django project with following general structure

test_project/
└── app_a
    ├── apps.py
    ├── __init__.py
    ├── migrations
       ├── 0001_initial.py
       ├── 0002_datafix_addsuffixtoname.py
       └── __init__.py
    ├── models.py
    └── tests
        ├── __init__.py
        └── test_0002_datafix_addsuffixtoname.py

with the following model

from django.db import models


class Animal(models.Model):
    species = models.CharField(blank=False, null=False, max_length=50)
    name = models.CharField(blank=False, null=False, max_length=100)

    def __str__(self):
        return f"Animal [name={self.name}, species={self.species}]"

along with the following migration

# app_a/migrations/0002_datafix_addsuffixtoname.py

from django.db import migrations

SUFFIX = " ZZ"


def data_forward(Animal):
    for animal in Animal.objects.all():
        animal.name += SUFFIX
        animal.save()


def data_backward(Animal):
    for animal in Animal.objects.filter(name__endswith=SUFFIX):
        animal.name = animal.name.rstrip(SUFFIX)
        animal.save()


def forward(apps, schema_editor):
    Animal = apps.get_model("app_a", "Animal")
    data_forward(Animal)


def backward(apps, schema_editor):
    Animal = apps.get_model("app_a", "Animal")
    data_backward(Animal)


class Migration(migrations.Migration):

    dependencies = [
        ('app_a', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(forward, backward),
    ]

You can test it as the following

from django_test_data_migrations import DataMigrationsTestCaseBase

from app_a.models import Animal


class DataMigrationsTestCase(DataMigrationsTestCaseBase):
    app_name = "app_a"
    migration_name = "0002_datafix_addsuffixtoname"

    def test__data_forward__append_suffix_to_name(self):
        # Prepare data before migration
        dog = Animal.objects.create(name="Dog", species="dog")
        cat = Animal.objects.create(name="Cat", species="cat")

        # Run `data_forward` aka the entry point to your data migration
        self.data_forward(Animal)

        # Make your assertions
        self.assertEqual(Animal.objects.get(id=dog.id).name, "Dog ZZ")
        self.assertEqual(Animal.objects.get(id=cat.id).name, "Cat ZZ")

    def test__data_backward__append_suffix_to_name(self):
        dog = Animal.objects.create(name="Dog ZZ", species="dog")
        cat = Animal.objects.create(name="Cat zz", species="cat")

        self.data_backward(Animal)

        self.assertEqual(Animal.objects.get(id=dog.id).name, "Dog")
        self.assertEqual(Animal.objects.get(id=cat.id).name, "Cat zz")

Why do I need this library?

  1. Runs your data migration test very fast.
  2. Encourages developers to write data-related Django migrations separately from model definition related Django migrations
  3. Writing tests for data related migrations is extremely important, but is either tricky to do or takes a long time to run. This library intends to testing data migrations easy and fast

Development

Setup

Check requirements

poetry --version

Clone source code repository

git clone git@github.com:imranariffin/django-test-data-migrations.git

Install dev dependencies

poetry install

Run tests

make test

You should be ready to start development

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-test-data-migrations-0.1.1.tar.gz (3.6 kB view details)

Uploaded Source

Built Distribution

File details

Details for the file django-test-data-migrations-0.1.1.tar.gz.

File metadata

  • Download URL: django-test-data-migrations-0.1.1.tar.gz
  • Upload date:
  • Size: 3.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.6.9

File hashes

Hashes for django-test-data-migrations-0.1.1.tar.gz
Algorithm Hash digest
SHA256 4d4bacdda4cc9258a9fab9710fb4e6a30e27229b837efcd8be98559b29e2689a
MD5 ca3d7abdc4b05ad01101ea93188f3dfd
BLAKE2b-256 f029e84b60105f24df682537c46b850cc9f19137ea124fa55cb49ce1d4c52ffe

See more details on using hashes here.

File details

Details for the file django_test_data_migrations-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: django_test_data_migrations-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 3.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.6.9

File hashes

Hashes for django_test_data_migrations-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 eb0b6369024eb702cc63e5fd98d05f6899aa3aebec51967b9d6770818bf74005
MD5 dfc0a98d4cbfa2a19ec8722b810652ca
BLAKE2b-256 ca6fbad5d9321bd8dc0f6a2e3c09d2c2ac15c50847005bbfaa00464c0c5aff55

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page