Research
Security News
Malicious npm Package Targets Solana Developers and Hijacks Funds
A malicious npm package targets Solana developers, rerouting funds in 2% of transactions to a hardcoded address.
django-capture-on-commit-callbacks
Advanced tools
Capture and make assertions on transaction.on_commit() callbacks.
.. image:: https://img.shields.io/github/workflow/status/adamchainz/django-capture-on-commit-callbacks/CI/main?style=for-the-badge :target: https://github.com/adamchainz/django-capture-on-commit-callbacks/actions?workflow=CI
.. image:: https://img.shields.io/badge/Coverage-100%25-success?style=for-the-badge :target: https://github.com/adamchainz/django-capture-on-commit-callbacks/actions?workflow=CI
.. image:: https://img.shields.io/pypi/v/django-capture-on-commit-callbacks.svg?style=for-the-badge :target: https://pypi.org/project/django-capture-on-commit-callbacks/
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge :target: https://github.com/psf/black
.. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge :target: https://github.com/pre-commit/pre-commit :alt: pre-commit
Capture and make assertions on transaction.on_commit()
callbacks <https://docs.djangoproject.com/en/3.0/topics/db/transactions/#performing-actions-after-commit>
__.
This allows you to write your tests with the TestCase
, rather than needing the slower TransactionTestCase
to actually commit the transactions.
This package was made as a first pass for Django PR #12944 <https://github.com/django/django/pull/12944>
, which is a solution for Ticket #30457 “on_commit should be triggered in a TestCase” <https://code.djangoproject.com/ticket/30457>
.
The PR has been merged to Django and has been released in version 3.2, so this package can now be considered a backport.
Read more in my blog post The Fast Way to Test Django transaction.on_commit() Callbacks <https://adamj.eu/tech/2020/05/20/the-fast-way-to-test-django-transaction-on-commit-callbacks/>
__.
Use pip:
.. code-block:: bash
python -m pip install django-capture-on-commit-callbacks
Python 3.7 to 3.10 supported.
Django 3.2 to 4.0 supported.
Note: This package is not needed on Django 4.0+ and it will error on usage for such versions.
Are your tests slow?
Check out my book Speed Up Your Django Tests <https://adamchainz.gumroad.com/l/suydt>
__ which covers loads of ways to write faster, more accurate tests.
capture_on_commit_callbacks(*, using="default", execute=False)
Acts as a context manager that captures on_commit
callbacks for the given database connection.
It returns a list that contains, on exit of the context, the captured callback functions.
From this list you can make assertions on the callbacks or call them to invoke their side effects, emulating a commit.
All arguments must be passed as keyword arguments.
using
is the alias of the database connection to capture callbacks for.
execute
specifies whether to call all the callbacks automatically as the context manager exits, if no exception has been raised.
For example, you can test a commit hook that sends an email like so:
.. code-block:: python
from django.core import mail
from django.test import TestCase
from django_capture_on_commit_callbacks import capture_on_commit_callbacks
class ContactTests(TestCase):
def test_post(self):
with capture_on_commit_callbacks() as callbacks:
response = self.client.post(
"/contact/",
{"message": "I like your site"},
)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(callbacks), 1)
# Execute the callback
callbacks[0]()
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, "Contact Form")
self.assertEqual(mail.outbox[0].body, "I like your site")
The same test can be written a bit more succinctly with execute=True
:
.. code-block:: python
from django.core import mail
from django.test import TestCase
from django_capture_on_commit_callbacks import capture_on_commit_callbacks
class ContactTests(TestCase):
def test_post(self):
with capture_on_commit_callbacks(execute=True) as callbacks:
response = self.client.post(
"/contact/",
{"message": "I like your site"},
)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(callbacks), 1)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, "Contact Form")
self.assertEqual(mail.outbox[0].body, "I like your site")
TestCaseMixin
A mixin class to be added to your custom TestCase
subclass.
It adds one method, captureOnCommitCallbacks()
that aliases capture_on_commit_callbacks()
, to match the camelCase
style of unittest assertions.
You can add to your custom TestCase
classes like so:
.. code-block:: python
from django import test
from django_capture_on_commit_callbacks import TestCaseMixin
class TestCase(TestCaseMixin, test.TestCase):
pass
You could then rewrite the above tests with your custom TestCase
class like so:
.. code-block:: python
from django.core import mail
from example.test import TestCase
class ContactTests(TestCase):
def test_post(self):
with self.captureOnCommitCallbacks(execute=True) as callbacks:
response = self.client.post(
"/contact/",
{"message": "I like your site"},
)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(callbacks), 1)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, "Contact Form")
self.assertEqual(mail.outbox[0].body, "I like your site")
FAQs
Capture and make assertions on transaction.on_commit() callbacks.
We found that django-capture-on-commit-callbacks demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
A malicious npm package targets Solana developers, rerouting funds in 2% of transactions to a hardcoded address.
Security News
Research
Socket researchers have discovered malicious npm packages targeting crypto developers, stealing credentials and wallet data using spyware delivered through typosquats of popular cryptographic libraries.
Security News
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.