{ "info": { "author": "Frank Wiles", "author_email": "frank@revsys.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 1.11", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Framework :: Django :: 2.2", "Framework :: Pytest", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8" ], "description": "# django-test-plus\n\nUseful additions to Django's default TestCase from [REVSYS](https://www.revsys.com/)\n\n \n\n## Rationale\n\nLet's face it, writing tests isn't always fun. Part of the reason for\nthat is all of the boilerplate you end up writing. django-test-plus is\nan attempt to cut down on some of that when writing Django tests. We\nguarantee it will increase the time before you get carpal tunnel by at\nleast 3 weeks!\n\n## Support\n\nSupports: Python 2 and Python 3\n\nSupports Django Versions: 1.10, 1.11, 2.0, 2.1, 2.2\n\n## Documentation\n\nFull documentation is available at http://django-test-plus.readthedocs.org\n\n## Installation\n\n```shell\n$ pip install django-test-plus\n```\n\n## Usage\n\nUsing django-test-plus is pretty easy, simply have your tests inherit\nfrom test_plus.test.TestCase rather than the normal\ndjango.test.TestCase like so::\n\n```python\nfrom test_plus.test import TestCase\n\nclass MyViewTests(TestCase):\n ...\n```\n\nThis is sufficient to get things rolling, but you are encouraged to\ncreate *your own* sub-class on a per project basis. This will allow you to add your own project specific helper methods.\n\nFor example, if you have a django project named 'myproject', you might\ncreate the following in `myproject/test.py`:\n\n```python\nfrom test_plus.test import TestCase as PlusTestCase\n\nclass TestCase(PlusTestCase):\n pass\n```\n\nAnd then in your tests use:\n\n```python\nfrom myproject.test import TestCase\n\nclass MyViewTests(TestCase):\n ...\n```\n\nNote that you can also option to import it like this if you want, which is\nmore similar to the regular importing of Django's TestCase:\n\n```python\nfrom test_plus import TestCase\n```\n\n## pytest Usage\n\nYou can get a TestCase like object as a pytest fixture now by simply asking for `tp`. All of the methods below would then work in pytest functions. For\nexample:\n\n```python\ndef test_url_reverse(tp):\n expected_url = '/api/'\n reversed_url = tp.reverse('api')\n assert expected_url == reversed_url\n```\n\nThe `tp_api` fixture will provide a `TestCase` that uses django-rest-framework's `APIClient()`:\n\n```python\ndef test_url_reverse(tp_api):\n response = tp_api.client.post(\"myapi\", format=\"json\")\n assert response.status_code == 200\n```\n\n## Methods\n\n### reverse(url_name, *args, **kwargs)\n\nWhen testing views you often find yourself needing to reverse the URL's name. With django-test-plus there is no need for the `from django.core.urlresolvers import reverse` boilerplate. Instead just use:\n\n```python\ndef test_something(self):\n url = self.reverse('my-url-name')\n slug_url = self.reverse('name-takes-a-slug', slug='my-slug')\n pk_url = self.reverse('name-takes-a-pk', pk=12)\n```\n\nAs you can see our reverse also passes along any args or kwargs you need\nto pass in.\n\n## get(url_name, follow=True, *args, **kwargs)\n\nAnother thing you do often is HTTP get urls. Our `get()` method\nassumes you are passing in a named URL with any args or kwargs necessary\nto reverse the url_name.\nIf needed, place kwargs for `TestClient.get()` in an 'extra' dictionary.:\n\n```python\ndef test_get_named_url(self):\n response = self.get('my-url-name')\n # Get XML data via AJAX request\n xml_response = self.get(\n 'my-url-name',\n extra={'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'})\n```\n\nWhen using this get method two other things happen for you, we store the\nlast response in `self.last_response` and the response's Context in `self.context`.\n\nSo instead of:\n\n```python\ndef test_default_django(self):\n response = self.client.get(reverse('my-url-name'))\n self.assertTrue('foo' in response.context)\n self.assertEqual(response.context['foo'], 12)\n```\n\nYou can instead write:\n\n```python\ndef test_testplus_get(self):\n self.get('my-url-name')\n self.assertInContext('foo')\n self.assertEqual(self.context['foo'], 12)\n```\n\nIt's also smart about already reversed URLs so you can be lazy and do:\n\n```python\ndef test_testplus_get(self):\n url = self.reverse('my-url-name')\n self.get(url)\n self.response_200()\n```\n\nIf you need to pass query string parameters to your url name, you can do so like this. Assuming the name 'search' maps to '/search/' then:\n\n```python\ndef test_testplus_get_query(self):\n self.get('search', data={'query': 'testing'})\n```\n\nWould GET `/search/?query=testing`.\n\n## post(url_name, data, follow=True, *args, **kwargs)\n\nOur `post()` method takes a named URL, the dictionary of data you wish\nto post and any args or kwargs necessary to reverse the url_name.\nIf needed, place kwargs for `TestClient.post()` in an 'extra' dictionary.:\n\n```python\ndef test_post_named_url(self):\n response = self.post('my-url-name', data={'coolness-factor': 11.0},\n extra={'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'})\n```\n\n*NOTE* Along with the frequently used get and post, we support all of the HTTP verbs such as put, patch, head, trace, options, and delete in the same fashion.\n\n## get_context(key)\n\nOften you need to get things out of the template context, so let's make that\neasy:\n\n```python\ndef test_context_data(self):\n self.get('my-view-with-some-context')\n slug = self.get_context('slug')\n```\n\n## assertInContext(key)\n\nYou can ensure a specific key exists in the last response's context by\nusing:\n\n```python\ndef test_in_context(self):\n self.get('my-view-with-some-context')\n self.assertInContext('some-key')\n```\n\n## assertContext(key, value)\n\nWe can get context values and ensure they exist, but so let's also test\nequality while we're at it. This asserts that key == value:\n\n```python\ndef test_in_context(self):\n self.get('my-view-with-some-context')\n self.assertContext('some-key', 'expected value')\n```\n\n## response_XXX(response, msg=None) - status code checking\n\nAnother test you often need to do is check that a response has a certain\nHTTP status code. With Django's default TestCase you would write:\n\n```python\nfrom django.core.urlresolvers import reverse\n\ndef test_status(self):\n response = self.client.get(reverse('my-url-name'))\n self.assertEqual(response.status_code, 200)\n```\n\nWith django-test-plus you can shorten that to be:\n\n```python\ndef test_better_status(self):\n response = self.get('my-url-name')\n self.response_200(response)\n```\n\ndjango-test-plus provides the following response method checks for you:\n\n- response_200()\n- response_201()\n- response_204()\n- response_301()\n- response_302()\n- response_400()\n- response_401()\n- response_403()\n- response_404()\n- response_405()\n- response_410()\n\nAll of which take an optional Django test client response and a string msg argument\nthat, if specified, is used as the error message when a failure occurs.\nIf it's available, the response_XXX methods will use the last response. So you\ncan do:\n\n```python\ndef test_status(self):\n self.get('my-url-name')\n self.response_200()\n```\n\nWhich is a bit shorter.\n\n## get_check_200(url_name, *args, **kwargs)\n\nGETing and checking views return status 200 is so common a test this\nmethod makes it even easier::\n\n```python\ndef test_even_better_status(self):\n response = self.get_check_200('my-url-name')\n```\n\n## make_user(username='testuser', password='password', perms=None)\n\nWhen testing out views you often need to create various users to ensure\nall of your logic is safe and sound. To make this process easier, this\nmethod will create a user for you:\n\n```python\ndef test_user_stuff(self)\n user1 = self.make_user('u1')\n user2 = self.make_user('u2')\n```\n\nIf creating a User in your project is more complicated, say for example\nyou removed the `username` field from the default Django Auth model\nyou can provide a [Factory\nBoy](https://factoryboy.readthedocs.org/en/latest/) factory to create\nit or simply override this method on your own sub-class.\n\nTo use a Factory Boy factory simply create your class like this::\n\n```python\nfrom test_plus.test import TestCase\nfrom .factories import UserFactory\n\n\nclass MySpecialTest(TestCase):\n user_factory = UserFactory\n\n def test_special_creation(self):\n user1 = self.make_user('u1')\n```\n\n**NOTE:** Users created by this method will have their password\nset to the string 'password' by default, in order to ease testing.\nIf you need a specific password simply override the `password` parameter.\n\nYou can also pass in user permissions by passing in a string of\n'`.`' or '`.*`'. For example:\n\n```python\nuser2 = self.make_user(perms=['myapp.create_widget', 'otherapp.*'])\n```\n\n## print_form_errors(response_or_form=None)\n\nWhen debugging a failing test for a view with a form, this method helps you\nquickly look at any form errors.\n\nExample usage:\n\n```python\nclass MyFormTest(TestCase):\n\n self.post('my-url-name', data={})\n self.print_form_errors()\n\n # or\n\n resp = self.post('my-url-name', data={})\n self.print_form_errors(resp)\n\n # or\n\n form = MyForm(data={})\n self.print_form_errors(form)\n```\n\n## Authentication Helpers\n\n### assertLoginRequired(url_name, *args, **kwargs)\n\nIt's pretty easy to add a new view to a project and forget to restrict\nit to be login required, this method helps make it easy to test that a\ngiven named URL requires auth:\n\n```python\ndef test_auth(self):\n self.assertLoginRequired('my-restricted-url')\n self.assertLoginRequired('my-restricted-object', pk=12)\n self.assertLoginRequired('my-restricted-object', slug='something')\n```\n\n### login context\n\nAlong with ensuing a view requires login and creating users, the next\nthing you end up doing is logging in as various users to test our your\nrestriction logic. This can be made easier with the following context:\n\n```python\ndef test_restrictions(self):\n user1 = self.make_user('u1')\n user2 = self.make_user('u2')\n\n self.assertLoginRequired('my-protected-view')\n\n with self.login(username=user1.username, password='password'):\n response = self.get('my-protected-view')\n # Test user1 sees what they should be seeing\n\n with self.login(username=user2.username, password='password'):\n response = self.get('my-protected-view')\n # Test user2 see what they should be seeing\n```\n\nSince we're likely creating our users using `make_user()` from above,\nthe login context assumes the password is 'password' unless specified\notherwise. Therefore you you can do:\n\n```python\ndef test_restrictions(self):\n user1 = self.make_user('u1')\n\n with self.login(username=user1.username):\n response = self.get('my-protected-view')\n```\n\nWe can also derive the username if we're using `make_user()` so we can\nshorten that up even further like this:\n\n```python\ndef test_restrictions(self):\n user1 = self.make_user('u1')\n\n with self.login(user1):\n response = self.get('my-protected-view')\n```\n\n## Ensuring low query counts\n\n### assertNumQueriesLessThan(number) - context\n\nDjango provides\n[assertNumQueries](https://docs.djangoproject.com/en/1.8/topics/testing/tools/#django.test.TransactionTestCase.assertNumQueries)\nwhich is great when your code generates a specific number of\nqueries. However, if due to the nature of your data this number can vary\nyou often don't attempt to ensure the code doesn't start producing a ton\nmore queries than you expect:\n\n```python\ndef test_something_out(self):\n\n with self.assertNumQueriesLessThan(7):\n self.get('some-view-with-6-queries')\n```\n\n### assertGoodView(url_name, *args, **kwargs)\n\nThis method does a few of things for you, it:\n\n- Retrieves the name URL\n- Ensures the view does not generate more than 50 queries\n- Ensures the response has status code 200\n- Returns the response\n\nOften a wide sweeping test like this is better than no test at all. You\ncan use it like this:\n\n```python\ndef test_better_than_nothing(self):\n response = self.assertGoodView('my-url-name')\n```\n\n## Testing DRF views\n\nTo take advantage of the convenience of DRF's test client, you can create a subclass of `TestCase` and set the `client_class` property:\n\n```python\nfrom test_plus import TestCase\nfrom rest_framework.test import APIClient\n\n\nclass APITestCase(TestCase):\n client_class = APIClient\n```\n\nFor convenience, `test_plus` ships with `APITestCase`, which does just that:\n\n```python\nfrom test_plus import APITestCase\n\n\nclass MyAPITestCase(APITestCase):\n\n def test_post(self):\n data = {'testing': {'prop': 'value'}}\n self.post('view-json', data=data, extra={'format': 'json'})\n self.response_200()\n```\n\nNote that using `APITestCase` requires Django >= 1.8 and having installed `django-rest-framework`.\n\n## Testing class-based \"generic\" views\n\nThe TestCase methods `get()` and `post()` work for both function-based\nand class-based views. However, in doing so they invoke Django's\nURL resolution, middleware, template processing, and decorator systems.\nFor integration testing this is desirable, as you want to ensure your\nURLs resolve properly, view permissions are enforced, etc.\nFor unit testing this is costly because all these Django request/response\nsystems are invoked in addition to your method, and they typically do not\naffect the end result.\n\nClass-based views (derived from Django's `generic.models.View` class)\ncontain methods and mixins which makes granular unit testing (more) feasible.\nQuite often your usage of a generic view class comprises a simple override\nof an existing method. Invoking the entire view and the Django request/response\nstack is a waste of time... you really want to call the overridden\nmethod directly and test the result.\n\nCBVTestCase to the rescue!\n\nAs with TestCase above, simply have your tests inherit\nfrom test_plus.test.CBVTestCase rather than TestCase like so:\n\n```python\nfrom test_plus.test import CBVTestCase\n\nclass MyViewTests(CBVTestCase):\n```\n\n## Methods\n\n### get_instance(cls, initkwargs=None, request=None, *args, **kwargs)\n\nThis core method simplifies the instantiation of your class, giving you\na way to invoke class methods directly.\n\nReturns an instance of `cls`, initialized with `initkwargs`.\nSets `request`, `args`, and `kwargs` attributes on the class instance.\n`args` and `kwargs` are the same values you would pass to `reverse()`.\n\nSample usage:\n\n```python\nfrom django.views import generic\nfrom test_plus.test import CBVTestCase\n\nclass MyClass(generic.DetailView)\n\n def get_context_data(self, **kwargs):\n kwargs['answer'] = 42\n return kwargs\n\nclass MyTests(CBVTestCase):\n\n def test_context_data(self):\n my_view = self.get_instance(MyClass, {'object': some_object})\n context = my_view.get_context_data()\n self.assertEqual(context['answer'], 42)\n```\n\n### get(cls, initkwargs=None, *args, **kwargs)\n\nInvokes `cls.get()` and returns the response, rendering template if possible.\nBuilds on the `CBVTestCase.get_instance()` foundation.\n\nAll test_plus.test.TestCase methods are valid, so the following works:\n\n```python\nresponse = self.get(MyClass)\nself.assertContext('my_key', expected_value)\n```\n\nAll test_plus TestCase side-effects are honored and all test_plus\nTestCase assertion methods work with `CBVTestCase.get()`.\n\n**NOTE:** This method bypasses Django's middleware, and therefore context\nvariables created by middleware are not available. If this affects your\ntemplate/context testing you should use TestCase instead of CBVTestCase.\n\n### post(cls, data=None, initkwargs=None, *args, **kwargs)\n\nInvokes `cls.post()` and returns the response, rendering template if possible.\nBuilds on the `CBVTestCase.get_instance()` foundation.\n\nExample:\n\n```python\nresponse = self.post(MyClass, data={'search_term': 'revsys'})\nself.response_200(response)\nself.assertContext('company_name', 'RevSys')\n```\n\nAll test_plus TestCase side-effects are honored and all test_plus\nTestCase assertion methods work with `CBVTestCase.post()`.\n\n**NOTE:** This method bypasses Django's middleware, and therefore context\nvariables created by middleware are not available. If this affects your\ntemplate/context testing you should use TestCase instead of CBVTestCase.\n\n### get_check_200(cls, initkwargs=None, *args, **kwargs)\n\nWorks just like `TestCase.get_check_200()`.\nCaller must provide a view class instead of a URL name or path parameter.\n\nAll test_plus TestCase side-effects are honored and all test_plus\nTestCase assertion methods work with `CBVTestCase.post()`.\n\n### assertGoodView(cls, initkwargs=None, *args, **kwargs)\n\nWorks just like `TestCase.assertGoodView()`.\nCaller must provide a view class instead of a URL name or path parameter.\n\nAll test_plus TestCase side-effects are honored and all test_plus\nTestCase assertion methods work with `CBVTestCase.post()`.\n\n## Development\n\nTo work on django-test-plus itself, you need to clone this repository and run the following commands:\n\n```shell\n$ pip install -r requirements.txt\n$ pip install -e .\n```\n\n**NOTE**: You will also need to ensure that the `test_project` directory, located\nat the root of this repo, is in your virtualenv's path.\n\n## Keep in touch!\n\nIf you have a question about this project, please open a GitHub issue. If you love us and want to keep track of our goings-on, here's where you can find us online:\n\n\n\n\n\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/revsys/django-test-plus/", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "django-test-plus", "package_url": "https://pypi.org/project/django-test-plus/", "platform": "", "project_url": "https://pypi.org/project/django-test-plus/", "project_urls": { "Homepage": "https://github.com/revsys/django-test-plus/" }, "release_url": "https://pypi.org/project/django-test-plus/1.3.1/", "requires_dist": null, "requires_python": "", "summary": "django-test-plus provides useful additions to Django's default TestCase", "version": "1.3.1" }, "last_serial": 5614670, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "6a5328ad69f41fe3952846b31cad55bf", "sha256": "cf04432420c7e54a96c3922196aa60e080bdd248430c8296c6c7b83a560a38d2" }, "downloads": -1, "filename": "django-test-plus-1.0.0.tar.gz", "has_sig": false, "md5_digest": "6a5328ad69f41fe3952846b31cad55bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9267, "upload_time": "2015-05-23T20:15:26", "url": "https://files.pythonhosted.org/packages/b3/27/c0ec9e67be5c6a1be11d2e0e4e8169aec53ae0cf8840673480124d10f4be/django-test-plus-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "22ec2d6ff497241267191fc7762fe73a", "sha256": "925de649e33ea6813560a7ab9ba4509c33f77bbab93839d472735256424bf276" }, "downloads": -1, "filename": "django-test-plus-1.0.1.tar.gz", "has_sig": false, "md5_digest": "22ec2d6ff497241267191fc7762fe73a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9521, "upload_time": "2015-05-23T20:32:47", "url": "https://files.pythonhosted.org/packages/a2/e9/c282b8b5320a314960587f6694da764725e340f74b0b70f26535c4d5efb5/django-test-plus-1.0.1.tar.gz" } ], "1.0.10": [ { "comment_text": "", "digests": { "md5": "c12c14b7fee18c205fd2f4bd300d73a8", "sha256": "d93da67aac4a827d9173a50dd3f398113629d63a33d08f0e6402882d00797528" }, "downloads": -1, "filename": "django-test-plus-1.0.10.tar.gz", "has_sig": false, "md5_digest": "c12c14b7fee18c205fd2f4bd300d73a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15407, "upload_time": "2015-11-10T16:25:50", "url": "https://files.pythonhosted.org/packages/38/c1/e21cd6298a71251db23d964be55af798170c8269c955fc808c2787fa8fe6/django-test-plus-1.0.10.tar.gz" } ], "1.0.11": [ { "comment_text": "", "digests": { "md5": "4f58f7361dafc356935ec4f6feaa8129", "sha256": "8590d65a07dc23a5c03dac147e79fd6548b3552d83e4c13edbe23d99bf84fd4e" }, "downloads": -1, "filename": "django-test-plus-1.0.11.tar.gz", "has_sig": false, "md5_digest": "4f58f7361dafc356935ec4f6feaa8129", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15350, "upload_time": "2015-11-10T16:41:44", "url": "https://files.pythonhosted.org/packages/74/04/28342044d49900f8892b058a25f707a4d77c17e784edc3475b26da8400e1/django-test-plus-1.0.11.tar.gz" } ], "1.0.12": [ { "comment_text": "", "digests": { "md5": "22dae4d8333419ca3b8008633b42a965", "sha256": "09d6fb0fab61665dfb11803229c046ba4191c936bd546525ce59484db2c5c3af" }, "downloads": -1, "filename": "django-test-plus-1.0.12.tar.gz", "has_sig": false, "md5_digest": "22dae4d8333419ca3b8008633b42a965", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15404, "upload_time": "2016-03-04T22:10:00", "url": "https://files.pythonhosted.org/packages/fd/3f/fc9a5cf5e7b10bc129c661fc65ca9750b4182ed2fbb903affa241efa33ce/django-test-plus-1.0.12.tar.gz" } ], "1.0.13": [ { "comment_text": "", "digests": { "md5": "5f33e159e4b17d49b3b8ae0da067f340", "sha256": "cbac7c84c3750da6276f3a3d7a5db14cd948a72b0d7e39ab94062d2a95a0b50b" }, "downloads": -1, "filename": "django-test-plus-1.0.13.tar.gz", "has_sig": false, "md5_digest": "5f33e159e4b17d49b3b8ae0da067f340", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15543, "upload_time": "2016-05-23T19:49:46", "url": "https://files.pythonhosted.org/packages/8a/68/ec784276ceee7e50cd7f121a8d96d3b34c5549ffcebdc6c7b58c015e5d8a/django-test-plus-1.0.13.tar.gz" } ], "1.0.14": [ { "comment_text": "", "digests": { "md5": "81877f529f7170ae54d5524bcdeb5d40", "sha256": "864ae390ece2cc90adaa989493329b9b0d2413d72bb4ff8946c500b437f19834" }, "downloads": -1, "filename": "django-test-plus-1.0.14.tar.gz", "has_sig": false, "md5_digest": "81877f529f7170ae54d5524bcdeb5d40", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15574, "upload_time": "2016-06-25T16:21:35", "url": "https://files.pythonhosted.org/packages/5c/f6/3440e936cf572264944402e7a661819bff5fd7995a8cfa7b59e8ac36dfa9/django-test-plus-1.0.14.tar.gz" } ], "1.0.15": [ { "comment_text": "", "digests": { "md5": "520ff107220b5bdb8fdaad5e2ffed602", "sha256": "19c355df3ceb1ce75b5fd8dd2eb3615161f1a7d8736ce6272f219f277edd090d" }, "downloads": -1, "filename": "django-test-plus-1.0.15.tar.gz", "has_sig": false, "md5_digest": "520ff107220b5bdb8fdaad5e2ffed602", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16300, "upload_time": "2016-08-18T21:40:58", "url": "https://files.pythonhosted.org/packages/8f/31/dfe73ed87d3b9adfcc718e481398453bbacc6949ff16929d2900945af5ce/django-test-plus-1.0.15.tar.gz" } ], "1.0.16": [ { "comment_text": "", "digests": { "md5": "7a64259451da6bfb08a5214d205b2403", "sha256": "3a27340c1ff219004eec4e042037f4c05df0aa7a78909197831d4d84c66a67e6" }, "downloads": -1, "filename": "django-test-plus-1.0.16.tar.gz", "has_sig": false, "md5_digest": "7a64259451da6bfb08a5214d205b2403", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16964, "upload_time": "2016-10-19T15:43:21", "url": "https://files.pythonhosted.org/packages/d1/c8/6b5f4282141d63eb066e048f3909d937d2ca9edea3b35108cdf0a0887f65/django-test-plus-1.0.16.tar.gz" } ], "1.0.17": [ { "comment_text": "", "digests": { "md5": "aca916a026801efbb1c83d330c569499", "sha256": "01a3528b67c906f8487fc516ada17955297158133d3b6f3fb264372d42075177" }, "downloads": -1, "filename": "django-test-plus-1.0.17.tar.gz", "has_sig": false, "md5_digest": "aca916a026801efbb1c83d330c569499", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17356, "upload_time": "2017-01-31T21:01:35", "url": "https://files.pythonhosted.org/packages/b9/c7/d63751822ef7514c1c6a154943437d1a3c896ce0511a8c896cdd84e5a509/django-test-plus-1.0.17.tar.gz" } ], "1.0.18": [ { "comment_text": "", "digests": { "md5": "35f64453a8d12e4f78edd50437b6c0e7", "sha256": "076a292e93856f37d10e7a2044df62fa4d1dd98472e8b41b441ed16a2d2f36ad" }, "downloads": -1, "filename": "django-test-plus-1.0.18.tar.gz", "has_sig": false, "md5_digest": "35f64453a8d12e4f78edd50437b6c0e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18131, "upload_time": "2017-06-26T16:39:54", "url": "https://files.pythonhosted.org/packages/e4/42/2cf3330187aef21db0b10ec69115a5831dc958392c6b6bdf8b5a96dbbd46/django-test-plus-1.0.18.tar.gz" } ], "1.0.19": [ { "comment_text": "", "digests": { "md5": "0a30dbee65499ab9c15cec638dab9e1c", "sha256": "c10eeaf98e545bd054ffa3c5f6a37ff74d3d225e236260ca1ff87a5a9656c7cd" }, "downloads": -1, "filename": "django-test-plus-1.0.19.tar.gz", "has_sig": false, "md5_digest": "0a30dbee65499ab9c15cec638dab9e1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18353, "upload_time": "2017-10-24T14:02:18", "url": "https://files.pythonhosted.org/packages/8d/b0/6176a7bb938cfbd8bba1f4ca54f04b65bc2cfac8554c56ac968cf10b34fb/django-test-plus-1.0.19.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "a50e9883d9e798bfc2e1b7f970a6e22c", "sha256": "8c2dbc260990ea8cd157f4d0b6fad606137d1357ece7d0d5b88fb639d0212493" }, "downloads": -1, "filename": "django-test-plus-1.0.2.tar.gz", "has_sig": false, "md5_digest": "a50e9883d9e798bfc2e1b7f970a6e22c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10128, "upload_time": "2015-05-23T23:03:16", "url": "https://files.pythonhosted.org/packages/dd/39/a13850c0062a40b2a1a2cff603abe0967009bb6803c1080eebf374b67731/django-test-plus-1.0.2.tar.gz" } ], "1.0.20": [ { "comment_text": "", "digests": { "md5": "f74048d9c106aabd743fee98a9560f22", "sha256": "dd10b80613a7c994999d1240277245ef0792c104b42879219db6db2ffcb68a6a" }, "downloads": -1, "filename": "django-test-plus-1.0.20.tar.gz", "has_sig": false, "md5_digest": "f74048d9c106aabd743fee98a9560f22", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18417, "upload_time": "2017-10-31T13:08:45", "url": "https://files.pythonhosted.org/packages/1c/31/33295ed87a78108daf622017c9315028be809819569aacafc97c459997cd/django-test-plus-1.0.20.tar.gz" } ], "1.0.21": [ { "comment_text": "", "digests": { "md5": "fa93f3d252ab5f87cd3b62c17625e81d", "sha256": "b0289208b8325a959c2316bc5f54e082f518f7305424db32c70ac16d612fa839" }, "downloads": -1, "filename": "django-test-plus-1.0.21.tar.gz", "has_sig": false, "md5_digest": "fa93f3d252ab5f87cd3b62c17625e81d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18444, "upload_time": "2017-12-15T22:44:17", "url": "https://files.pythonhosted.org/packages/dc/93/8f35d3c626fb6c0ff38e0633eceb88b2bdb50fab2be5fc1927ec3fd575b7/django-test-plus-1.0.21.tar.gz" } ], "1.0.22": [ { "comment_text": "", "digests": { "md5": "8fa55989c08afabbb939d5425815f926", "sha256": "cdfa439642c660a1c65af5add140a2dcf360e71daa65740d87e9e53cb8509d6b" }, "downloads": -1, "filename": "django-test-plus-1.0.22.tar.gz", "has_sig": false, "md5_digest": "8fa55989c08afabbb939d5425815f926", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18479, "upload_time": "2018-01-09T23:07:40", "url": "https://files.pythonhosted.org/packages/69/1d/f61792ae245865d67d17a1015b23b9336da42e63896c172a6845570deb11/django-test-plus-1.0.22.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "9cc20645ad16ef788a05d79479b0dab6", "sha256": "d986b3f07f3ea62b8266e65700fe6fd77c0cae2bed1aceb50652055792ee5427" }, "downloads": -1, "filename": "django-test-plus-1.0.3.tar.gz", "has_sig": false, "md5_digest": "9cc20645ad16ef788a05d79479b0dab6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10473, "upload_time": "2015-05-28T21:28:33", "url": "https://files.pythonhosted.org/packages/58/ca/fabf08b82aba62f841915410d549a3b96d5cec621c78b55d9f5ca0b3d320/django-test-plus-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "bd895f6a2d2ba6bd4798174597842714", "sha256": "91c989c49af6af8ea1df393a5d497f43942874b20bb20b82291f8c4ac5b75aee" }, "downloads": -1, "filename": "django-test-plus-1.0.4.tar.gz", "has_sig": false, "md5_digest": "bd895f6a2d2ba6bd4798174597842714", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10814, "upload_time": "2015-05-29T12:08:07", "url": "https://files.pythonhosted.org/packages/65/62/83e858f6f33007faedcc6929264138381fec7ca7c95a721ffccf9caeefe9/django-test-plus-1.0.4.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "ac568ecbd45edf5130c55c1ffd0c0922", "sha256": "47d4f378fd733d546a5e83c1e27aa083ae6ba1773acbfca20bde4e6982381aac" }, "downloads": -1, "filename": "django-test-plus-1.0.5.tar.gz", "has_sig": false, "md5_digest": "ac568ecbd45edf5130c55c1ffd0c0922", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11442, "upload_time": "2015-06-16T16:37:00", "url": "https://files.pythonhosted.org/packages/09/82/de8cebeeb53185a7078e355f8d7e366aaa2eb9075835c2e5e79102bbdc96/django-test-plus-1.0.5.tar.gz" } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "5613fa5ad4aafdb7c38520f315f615c3", "sha256": "94517f319f9049859bfc0b2daed3019081c10664bfb86d90a150f5b15d1a5063" }, "downloads": -1, "filename": "django-test-plus-1.0.6.tar.gz", "has_sig": false, "md5_digest": "5613fa5ad4aafdb7c38520f315f615c3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15226, "upload_time": "2015-07-12T15:42:36", "url": "https://files.pythonhosted.org/packages/f2/4b/efe7dd5f36f4f669ae606860a16533988980118617f0e6f20461f05a405f/django-test-plus-1.0.6.tar.gz" } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "c174edaa2c6362dab3cdba517706864d", "sha256": "58e08c980afd04ef96f9c9148dfe0b079032927c23fe80bd253450235d2e9188" }, "downloads": -1, "filename": "django-test-plus-1.0.7.tar.gz", "has_sig": false, "md5_digest": "c174edaa2c6362dab3cdba517706864d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15348, "upload_time": "2015-07-31T20:58:09", "url": "https://files.pythonhosted.org/packages/1f/10/f687f7e8852d75aca6dbed4ed1acd6063eb40c0fe3a85c31fd9313488639/django-test-plus-1.0.7.tar.gz" } ], "1.0.8": [ { "comment_text": "", "digests": { "md5": "b6b269b463bb9e677591c20e4f803c21", "sha256": "a6c9420832dfd65da0de00884fc7c9a59362a150eff1bd0d49b0b074cec775de" }, "downloads": -1, "filename": "django-test-plus-1.0.8.tar.gz", "has_sig": false, "md5_digest": "b6b269b463bb9e677591c20e4f803c21", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15341, "upload_time": "2015-08-12T20:30:16", "url": "https://files.pythonhosted.org/packages/42/ae/01af495c36e98123ea912e028108394f3e161ec77ffefbbcf2eb094ee007/django-test-plus-1.0.8.tar.gz" } ], "1.0.9": [ { "comment_text": "", "digests": { "md5": "165f0cab6b8ac968a5d61c98ec1f17ac", "sha256": "7dc7effb86a53b16e1dda94d17c98dbdc0495c9592398bd5a7844abac8fb063a" }, "downloads": -1, "filename": "django-test-plus-1.0.9.tar.gz", "has_sig": false, "md5_digest": "165f0cab6b8ac968a5d61c98ec1f17ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15387, "upload_time": "2015-08-28T14:38:23", "url": "https://files.pythonhosted.org/packages/0a/66/a73c25fdacbe49c381b6c703d17c92e5327ac4121cac624f781fff9dc95c/django-test-plus-1.0.9.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "015feffde56d1db55c4bae8baf20eaf0", "sha256": "c84d0929369f295ce7a08fa57bd19a97103939320480ba9d69c994815b9088d2" }, "downloads": -1, "filename": "django-test-plus-1.1.0.tar.gz", "has_sig": false, "md5_digest": "015feffde56d1db55c4bae8baf20eaf0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22329, "upload_time": "2018-06-15T20:26:03", "url": "https://files.pythonhosted.org/packages/f9/67/17720526369426d883863be387bf22d2dd867e1275346ade2f2103f78729/django-test-plus-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "3c085391f1f9640cc2312449130b2ef4", "sha256": "4c3ff61998c2ea9a36c9c6e085b03b68eace71d15c21f4b2fb044441d3f1b7ce" }, "downloads": -1, "filename": "django-test-plus-1.1.1.tar.gz", "has_sig": false, "md5_digest": "3c085391f1f9640cc2312449130b2ef4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19649, "upload_time": "2018-07-02T12:52:06", "url": "https://files.pythonhosted.org/packages/b4/b8/396ee6c10b1c4582a325b99cdfc52cc6dd161559bd1c1c2c0c7f2c5858dd/django-test-plus-1.1.1.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "85881e8b3cf9572385ccd1c9e0a346db", "sha256": "c016fd761dec888068334766c940521089ac957951eaa4df3a2607d7d8cc36a1" }, "downloads": -1, "filename": "django_test_plus-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "85881e8b3cf9572385ccd1c9e0a346db", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14867, "upload_time": "2019-05-05T19:02:17", "url": "https://files.pythonhosted.org/packages/a7/19/00dc7f256e439e70896d00a9121ce2479cf0c13b7ea3992f80691ea4d22e/django_test_plus-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0e42b11ec4d25efa4e9905e66db62f52", "sha256": "791707b16cb34a95a24a14a7827aea50194f27c2548b19966942f88e2876205c" }, "downloads": -1, "filename": "django-test-plus-1.2.0.tar.gz", "has_sig": false, "md5_digest": "0e42b11ec4d25efa4e9905e66db62f52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22482, "upload_time": "2019-05-05T19:02:19", "url": "https://files.pythonhosted.org/packages/e3/63/8171b4c70f5006372c35689272e6efe2c128ce4c31c7e66d03c7d052bf37/django-test-plus-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "22dbffbfcdf4055f707e432f1a00724d", "sha256": "579217bf87817c42cb131e59a7523c9b22a35f9758502cef0893641f4744a3fe" }, "downloads": -1, "filename": "django-test-plus-1.2.1.tar.gz", "has_sig": false, "md5_digest": "22dbffbfcdf4055f707e432f1a00724d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18637, "upload_time": "2019-06-25T15:25:30", "url": "https://files.pythonhosted.org/packages/45/6b/8d6b17407d96ae4db831d1b9c784c2542e77b12882bf1a81d29b49f55022/django-test-plus-1.2.1.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "05a97ba721ff1487bb4541defb681a68", "sha256": "be3c34a8a757bbad0d1bf3cf49ef6ab381cb2138a9d02d7e2ce9b18f4e3a30a1" }, "downloads": -1, "filename": "django_test_plus-1.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "05a97ba721ff1487bb4541defb681a68", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15092, "upload_time": "2019-07-31T17:14:10", "url": "https://files.pythonhosted.org/packages/58/9e/01aa8e37474d4586a436c2cf629456fe126fd0703c81db3d6ee04dcf6b57/django_test_plus-1.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f7dbb34931a2fd3a1c3fb911ee64c936", "sha256": "96ada2cdbc4206cfe92015623729381f1eaa4267e03add24e4e9bd0dcffcdef0" }, "downloads": -1, "filename": "django-test-plus-1.3.0.tar.gz", "has_sig": false, "md5_digest": "f7dbb34931a2fd3a1c3fb911ee64c936", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18784, "upload_time": "2019-07-31T17:14:12", "url": "https://files.pythonhosted.org/packages/46/1e/04089e2ba64fc9ea42fde4f3404c957e64c9368b46395af8ce89e2c811da/django-test-plus-1.3.0.tar.gz" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "aec8fd5c414308bc86c4c3d84bf56fa5", "sha256": "c7005c4c4fe1587f895b6465a34439f08a933ce997a6d733c73a73c7473bf0b0" }, "downloads": -1, "filename": "django_test_plus-1.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "aec8fd5c414308bc86c4c3d84bf56fa5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15110, "upload_time": "2019-07-31T17:24:45", "url": "https://files.pythonhosted.org/packages/6d/0e/6c32e91ae2dbbc99e3f12467ca2d0501a04ded7fa96b4e93cd4e1dca2d84/django_test_plus-1.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7f45bb4dd09ec3697d6133ff47a8be00", "sha256": "92de585c6f5526aa0d8ddbe6d26d859ba27ef30285a847edbf27004f8bbf530f" }, "downloads": -1, "filename": "django-test-plus-1.3.1.tar.gz", "has_sig": false, "md5_digest": "7f45bb4dd09ec3697d6133ff47a8be00", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18856, "upload_time": "2019-07-31T17:24:47", "url": "https://files.pythonhosted.org/packages/b4/01/7de76e67da17cf5bd782f8550b7fa31a8a7790d63e3554f3377fca3f002c/django-test-plus-1.3.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "aec8fd5c414308bc86c4c3d84bf56fa5", "sha256": "c7005c4c4fe1587f895b6465a34439f08a933ce997a6d733c73a73c7473bf0b0" }, "downloads": -1, "filename": "django_test_plus-1.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "aec8fd5c414308bc86c4c3d84bf56fa5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15110, "upload_time": "2019-07-31T17:24:45", "url": "https://files.pythonhosted.org/packages/6d/0e/6c32e91ae2dbbc99e3f12467ca2d0501a04ded7fa96b4e93cd4e1dca2d84/django_test_plus-1.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7f45bb4dd09ec3697d6133ff47a8be00", "sha256": "92de585c6f5526aa0d8ddbe6d26d859ba27ef30285a847edbf27004f8bbf530f" }, "downloads": -1, "filename": "django-test-plus-1.3.1.tar.gz", "has_sig": false, "md5_digest": "7f45bb4dd09ec3697d6133ff47a8be00", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18856, "upload_time": "2019-07-31T17:24:47", "url": "https://files.pythonhosted.org/packages/b4/01/7de76e67da17cf5bd782f8550b7fa31a8a7790d63e3554f3377fca3f002c/django-test-plus-1.3.1.tar.gz" } ] }