{"id":34060173,"url":"https://github.com/luiscberrocal/django-test-tools","last_synced_at":"2026-03-27T04:07:37.688Z","repository":{"id":38549248,"uuid":"89753770","full_name":"luiscberrocal/django-test-tools","owner":"luiscberrocal","description":"Django utility for test scaffolding. Tools to create basic tests fast","archived":false,"fork":false,"pushed_at":"2024-12-07T02:43:46.000Z","size":750,"stargazers_count":7,"open_issues_count":13,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-25T16:55:13.416Z","etag":null,"topics":["django","testing"],"latest_commit_sha":null,"homepage":"https://django-test-tools.readthedocs.io/en/latest/index.html","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/luiscberrocal.png","metadata":{"files":{"readme":"README.rst","changelog":"HISTORY.rst","contributing":"CONTRIBUTING.rst","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.rst","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-04-29T00:14:55.000Z","updated_at":"2021-11-16T07:00:01.000Z","dependencies_parsed_at":"2023-10-16T08:47:49.757Z","dependency_job_id":"e7a466d7-fee2-4390-82bc-7c947f3c5c13","html_url":"https://github.com/luiscberrocal/django-test-tools","commit_stats":{"total_commits":573,"total_committers":9,"mean_commits":"63.666666666666664","dds":0.5200698080279231,"last_synced_commit":"932846bef8288f518136e7d530de5b548e55a29a"},"previous_names":[],"tags_count":113,"template":false,"template_full_name":null,"purl":"pkg:github/luiscberrocal/django-test-tools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luiscberrocal%2Fdjango-test-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luiscberrocal%2Fdjango-test-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luiscberrocal%2Fdjango-test-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luiscberrocal%2Fdjango-test-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luiscberrocal","download_url":"https://codeload.github.com/luiscberrocal/django-test-tools/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luiscberrocal%2Fdjango-test-tools/sbom","scorecard":{"id":603452,"data":{"date":"2025-08-11","repo":{"name":"github.com/luiscberrocal/django-test-tools","commit":"259cfd428da639b3a0162256631fcc08309b38b7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"67 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2022-238 / GHSA-h3qr-fjhm-jphw","Warn: Project is vulnerable to: PYSEC-2014-5 / GHSA-296w-6qhq-gf92","Warn: Project is vulnerable to: PYSEC-2011-2 / GHSA-3jqw-crqj-w8qw","Warn: Project is vulnerable to: PYSEC-2012-3 / GHSA-59w8-4wm2-4xw8","Warn: Project is vulnerable to: PYSEC-2012-4 / GHSA-5h2q-4hrp-v9rr","Warn: Project is vulnerable to: PYSEC-2014-6 / GHSA-625g-gx8c-xcmg","Warn: Project is vulnerable to: PYSEC-2015-8 / GHSA-6565-fg86-6jcx","Warn: Project is vulnerable to: PYSEC-2021-98 / GHSA-68w8-qjq3-2gfm","Warn: Project is vulnerable to: PYSEC-2012-2 / GHSA-78vx-ggch-wghm","Warn: Project is vulnerable to: PYSEC-2015-9 / GHSA-7fq8-4pv5-5w5c","Warn: Project is vulnerable to: PYSEC-2015-4 / GHSA-7qfw-j7hp-v45g","Warn: Project is vulnerable to: PYSEC-2011-9 / GHSA-7wph-fc4w-wqp2","Warn: Project is vulnerable to: GHSA-7xr5-9hcq-chf9","Warn: Project is vulnerable to: PYSEC-2014-2 / GHSA-89hj-xfx5-7q66","Warn: Project is vulnerable to: GHSA-8x94-hmjh-97hq","Warn: Project is vulnerable to: PYSEC-2016-2 / GHSA-c8c8-9472-w52h","Warn: Project is vulnerable to: PYSEC-2016-3 / GHSA-crhm-qpjc-cm64","Warn: Project is vulnerable to: PYSEC-2014-4 / GHSA-f7cm-ccfp-3q4r","Warn: Project is vulnerable to: PYSEC-2016-16 / GHSA-fp6p-5xvw-m74f","Warn: Project is vulnerable to: PYSEC-2011-8 / GHSA-fwr5-q9rx-294f","Warn: Project is vulnerable to: PYSEC-2015-5 / GHSA-gv98-g628-m9x5","Warn: Project is vulnerable to: PYSEC-2015-20 / GHSA-h582-2pch-3xv3","Warn: Project is vulnerable to: PYSEC-2011-5 / GHSA-h95j-h2rv-qrg4","Warn: Project is vulnerable to: GHSA-hmr4-m2h5-33qx","Warn: Project is vulnerable to: PYSEC-2015-6 / GHSA-jhjg-w2cp-5j44","Warn: Project is vulnerable to: PYSEC-2016-15 / GHSA-pw27-w7w4-9qc7","Warn: Project is vulnerable to: PYSEC-2015-10 / GHSA-q5qw-4364-5hhm","Warn: Project is vulnerable to: PYSEC-2011-4 / GHSA-rm2j-x595-q9cj","Warn: Project is vulnerable to: GHSA-rrqc-c2jx-6jgv","Warn: Project is vulnerable to: PYSEC-2014-1 / GHSA-rvq6-mrpv-m6rm","Warn: Project is vulnerable to: PYSEC-2014-7 / GHSA-rw75-m7gp-92m3","Warn: Project is vulnerable to: PYSEC-2019-16 / GHSA-vfq6-hq5r-27r6","Warn: Project is vulnerable to: PYSEC-2014-3 / GHSA-wqjj-hx84-v449","Warn: Project is vulnerable to: PYSEC-2011-3 / GHSA-wxg3-mfph-qg9w","Warn: Project is vulnerable to: PYSEC-2011-1 / GHSA-x88j-93vc-wpmp","Warn: Project is vulnerable to: PYSEC-2007-1","Warn: Project is vulnerable to: PYSEC-2008-1","Warn: Project is vulnerable to: PYSEC-2008-2","Warn: Project is vulnerable to: PYSEC-2009-3","Warn: Project is vulnerable to: PYSEC-2015-11","Warn: Project is vulnerable to: PYSEC-2015-7","Warn: Project is vulnerable to: PYSEC-2016-18","Warn: Project is vulnerable to: GHSA-gw84-84pc-xp82","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-h5c8-rqwp-cp95","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: GHSA-3f63-hfp8-52jq","Warn: Project is vulnerable to: GHSA-44wm-f244-xhp3","Warn: Project is vulnerable to: GHSA-j7hp-h8jx-5ppr","Warn: Project is vulnerable to: PYSEC-2023-175","Warn: Project is vulnerable to: PYSEC-2021-47 / GHSA-5jqp-qgf6-3pvh","Warn: Project is vulnerable to: GHSA-mr82-8j83-vxmv","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: PYSEC-2023-13 / GHSA-2hrw-hx67-34x6","Warn: Project is vulnerable to: PYSEC-2023-225 / GHSA-7h4p-27mh-hmrw","Warn: Project is vulnerable to: PYSEC-2023-226 / GHSA-h8gc-pgj2-vjm3","Warn: Project is vulnerable to: PYSEC-2023-100 / GHSA-jh3w-4vvf-mjgr","Warn: Project is vulnerable to: PYSEC-2023-12 / GHSA-q2jf-h9jm-m7p4","Warn: Project is vulnerable to: PYSEC-2023-222 / GHSA-qmf9-6jqf-j8fq","Warn: Project is vulnerable to: PYSEC-2022-304 / GHSA-qrw5-5h28-6cmg","Warn: Project is vulnerable to: PYSEC-2023-61 / GHSA-r3xc-prgr-mg9p","Warn: Project is vulnerable to: PYSEC-2024-47 / GHSA-vm8q-m57g-pff3","Warn: Project is vulnerable to: PYSEC-2024-28 / GHSA-xxj9-f6rv-m3x4"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T01:00:28.602Z","repository_id":38549248,"created_at":"2025-08-21T01:00:28.602Z","updated_at":"2025-08-21T01:00:28.602Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31018554,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-27T03:51:26.850Z","status":"ssl_error","status_checked_at":"2026-03-27T03:51:09.693Z","response_time":164,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["django","testing"],"created_at":"2025-12-14T04:03:56.137Z","updated_at":"2026-03-27T04:07:37.678Z","avatar_url":"https://github.com/luiscberrocal.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"=============================\nDjango Test Tools\n=============================\n\n.. image:: https://badge.fury.io/py/django-test-tools.svg\n    :target: https://badge.fury.io/py/django-test-tools\n\n.. image:: https://codecov.io/gh/luiscberrocal/django-test-tools/branch/master/graph/badge.svg\n    :target: https://codecov.io/gh/luiscberrocal/django-test-tools\n\n.. image:: https://pyup.io/repos/github/luiscberrocal/django-test-tools/shield.svg\n     :target: https://pyup.io/repos/github/luiscberrocal/django-test-tools/\n     :alt: Updates\n\n.. image:: https://readthedocs.org/projects/django-test-tools/badge/?version=latest\n    :target: https://django-test-tools.readthedocs.io/en/latest/?badge=latest\n    :alt: Documentation Status\n\nSimple tests tools to make testing faster and easier. Most of the tools are to do a quick scaffolding for tests.\n\nThe tools presume a naming convention:\n\n- **Tests:** Are named with the convention **TestCaseModelName**. For a model named *Poll* the test would be generated\n  as the testing class would be *TestCasePoll*\n- **Factories:** Are named with the convention **ModelName**. For a model named *Poll* the test would be generated\n  as the testing class would be *PollFactory*\n- **Serializers:** Are named with the convention **TestCaseSerializer**. For a model named *Poll* the test would be generated\n  as the testing class would be *PollSerializer*\n\n\nCompatibility matrix:\n\n+----------------+---------------+--------------+--------------+\n| Python version | Django 1.11.x | Django 2.2.x | Django 3.0.x |\n+----------------+---------------+--------------+--------------+\n|       3.7      |       x       |       x      |       x      |\n+----------------+---------------+--------------+--------------+\n|       3.6      |       x       |       x      |       x      |\n+----------------+---------------+--------------+--------------+\n\nDocumentation\n-------------\n\nThe full documentation is at https://django-test-tools.readthedocs.io.\n\nQuickstart\n----------\n\nInstall Django Test Tools:\n\n.. code-block:: bash\n\n    pip install django-test-tools\n\n\nIn your settings.py file add it to your `INSTALLED_APPS`\n\n.. code-block:: python\n\n    INSTALLED_APPS = (\n        ...\n        'django_test_tools.apps.DjangoTestToolsConfig',\n        ...\n    )\n\n\nCreate an output folder in the root folder of you project, name it what ever you want, and add the settings\nvariable **TEST_OUTPUT_PATH** pointing to it. Make sure to add this folder to your **.gitignore** file.\n\n.. code-block:: python\n\n    import environ\n\n    ROOT_DIR = (\n        environ.Path(__file__) - 3\n    )  # (my_project/config/settings/base.py - 3 = alpha_clinic/)\n    APPS_DIR = ROOT_DIR.path(\"my_project\")\n    TEST_OUTPUT_PATH = ROOT_DIR.path(\"output\").root\n\nFeatures\n--------\n\nFactory Generator\n++++++++++++++++++\n\nTo create `Factory Boy`_ style factories.\n\nFor a django project named polling_app with an app name poll the following command will generate the scaffolding for\nthe tests for all the models in th app polls.\n\n.. code-block:: bash\n\n    $  python manage.py generate_factories polling_app.polls\n\n\nFor the following models\n\n\n.. code-block:: python\n\n    class OperatingSystem(models.Model):\n        name = models.CharField(max_length=20)\n        version = models.CharField(max_length=5)\n        licenses_available = models.IntegerField()\n        cost = models.DecimalField(decimal_places=2, max_digits=7)\n\n        class Meta:\n            unique_together = ('name', 'version')\n\n\n    class Server(models.Model):\n        PRODUCTION = 'PROD'\n        DEVELOPMENT = 'DEV'\n        USE_CHOICES = ((PRODUCTION, 'Prod'),\n                       (DEVELOPMENT, 'Dev'))\n        name = models.CharField(max_length=20, unique=True)\n        notes = models.TextField()\n        virtual = models.BooleanField()\n        ip_address = models.GenericIPAddressField()\n        created = models.DateTimeField()\n        online_date = models.DateField()\n        operating_system = models.ForeignKey(OperatingSystem, related_name='servers', on_delete=models.CASCADE)\n        server_id = models.CharField(max_length=6)\n        use = models.CharField(max_length=4, choices=USE_CHOICES, default=DEVELOPMENT)\n        comments = models.TextField(null=True, blank=True)\n\n\n\nrunning `python manage.py generate_factories example.servers \u003e ./output/factories.py` will create the following factories\n\n.. code-block:: python\n\n    import string\n\n    from random import randint\n    from pytz import timezone\n\n    from django.conf import settings\n\n    from factory import Iterator\n    from factory import LazyAttribute\n    from factory import SubFactory\n    from factory import lazy_attribute\n    from factory.django import DjangoModelFactory, FileField\n    from factory.fuzzy import FuzzyText, FuzzyInteger\n    from faker import Factory as FakerFactory\n\n    from example.servers.models import OperatingSystem, Server\n\n    faker = FakerFactory.create()\n\n\n    class OperatingSystemFactory(DjangoModelFactory):\n        class Meta:\n            model = OperatingSystem\n\n        name = LazyAttribute(lambda x: faker.text(max_nb_chars=20))\n        version = LazyAttribute(lambda x: faker.text(max_nb_chars=5))\n        licenses_available = LazyAttribute(lambda o: randint(1, 100))\n        cost = LazyAttribute(lambda x: faker.pydecimal(left_digits=5, right_digits=2, positive=True))\n\n    class ServerFactory(DjangoModelFactory):\n        class Meta:\n            model = Server\n\n        name = LazyAttribute(lambda x: faker.text(max_nb_chars=20))\n        notes = LazyAttribute(lambda x: faker.paragraph(nb_sentences=3, variable_nb_sentences=True))\n        virtual = Iterator([True, False])\n        ip_address = LazyAttribute(lambda o: faker.ipv4(network=False))\n        created = LazyAttribute(lambda x: faker.date_time_between(start_date=\"-1y\", end_date=\"now\",\n                                                               tzinfo=timezone(settings.TIME_ZONE)))\n        online_date = LazyAttribute(lambda x: faker.date_time_between(start_date=\"-1y\", end_date=\"now\",\n                                                               tzinfo=timezone(settings.TIME_ZONE)))\n        operating_system = SubFactory(OperatingSystemFactory)\n        server_id = LazyAttribute(lambda x: FuzzyText(length=6, chars=string.digits).fuzz())\n        use = Iterator(Server.CHOICES, getter=lambda x: x[0])\n        comments = LazyAttribute(lambda x: faker.paragraph(nb_sentences=3, variable_nb_sentences=True))\n\nImportant the use attribute is created incorrectly. **When you use choices you need to manually change it** to USE_CHOICES.\n\n.. code-block:: python\n\n        use = Iterator(Server.USE_CHOICES, getter=lambda x: x[0])\n\n\nModel Test Case Generator\n+++++++++++++++++++++++++\n\n.. code-block:: bash\n\n    $  python manage.py generate_model_test_cases project.app\n\nSerializer Generator\n++++++++++++++++++++\n\n.. code-block:: bash\n\n    $ python manage.py generate_serializers project.app -s ModelSerializer\n\nWriting assertions\n+++++++++++++++++++\n\nOne of the most boring steps of writing tests is checking the content of static dictionaries.\nYou now the content of the dictionary and you need to compare it with a result.\n\nIn the following code the assertions for the **data** dictionary will be generated in the\n**fn** file. IMPORTANT the name of the dictionary in this case **data** must be the same as\nthe second argument of the method in order to generate the correct assertions.\n\n.. code-block:: python\n\n    fn = './output/_my_assertions.py'\n    data = [\n            {'name': 'kilo', 'password': 9999,\n             'groups': ['admin', 'users'],\n             'config': {'server': 'all', 'bulding': 116}},\n            {'name': 'pasto', 'password': 'nogo',\n             'groups': ['users'],\n             'config': {'server': 'database', 'bulding': None},\n             'created_date': date(2016, 1, 3),\n             'modified': '2016-10-01'}\n        ]\n        filename = write_assertions(data, 'data', filename=fn, type_only=True,excluded_keys=['config']))\n\nThe result of this script:\n\n.. code-block:: python\n\n    self.assertEqual(len(data), 2)\n    self.assertEqual(len(data[0]['groups']), 2)\n    self.assertEqual(data[0]['groups'][0], 'admin')\n    self.assertEqual(data[0]['groups'][1], 'users')\n    self.assertEqual(data[0]['name'], 'kilo')\n    self.assertEqual(data[0]['password'], 9999)\n    self.assertEqual(len(data[1]['groups']), 1)\n    self.assertEqual(data[1]['groups'][0], 'users')\n    self.assertEqual(data[1]['name'], 'pasto')\n    self.assertEqual(data[1]['password'], 'nogo')\n\nRunning Tests\n-------------\n\nDoes the code actually work?\n\n::\n\n    source \u003cYOURVIRTUALENV\u003e/bin/activate\n    (myenv) $ python runtests.py tests\n\n\nPushing code to Pypi\n--------------------\n1. Setup environment\n\n  .. code-block:: bash\n\n    source ./venv/bin/activate\n\n\n2. Updated version. Instead of patch you could also use **major** o **minor** depending on the level of the release.\n\n  .. code-block:: bash\n\n    $ make patch\n\n\n3. Check the .travis.yml to make sure the versions of Django are the latests. Check in https://www.djangoproject.com/download/\n   for the latest versions.\n\n4. Check setup.py for Django and Python versions.\n\n5. Close the git-flow release manually.\n\n6. Push to repo, Travis CI should deploy to pypi\n\n  .. code-block:: bash\n\n    make travis-push\n\nCredits\n-------\n\nTools used in rendering this package:\n\n*  Cookiecutter_\n*  `cookiecutter-djangopackage`_\n\n.. _Cookiecutter: https://github.com/audreyr/cookiecutter\n.. _`cookiecutter-djangopackage`: https://github.com/pydanny/cookiecutter-djangopackage\n.. _`Factory Boy`: https://factoryboy.readthedocs.io/en/latest/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluiscberrocal%2Fdjango-test-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluiscberrocal%2Fdjango-test-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluiscberrocal%2Fdjango-test-tools/lists"}