{"id":16959522,"url":"https://github.com/crdoconnor/cats","last_synced_at":"2025-03-21T14:49:06.339Z","repository":{"id":83485675,"uuid":"51788364","full_name":"crdoconnor/cats","owner":"crdoconnor","description":"Talk notes for ATDD talk","archived":false,"fork":false,"pushed_at":"2016-02-16T18:40:44.000Z","size":2,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-17T19:48:01.527Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/crdoconnor.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-02-15T21:53:13.000Z","updated_at":"2016-02-15T21:53:13.000Z","dependencies_parsed_at":"2023-05-03T01:16:15.467Z","dependency_job_id":null,"html_url":"https://github.com/crdoconnor/cats","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crdoconnor%2Fcats","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crdoconnor%2Fcats/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crdoconnor%2Fcats/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crdoconnor%2Fcats/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crdoconnor","download_url":"https://codeload.github.com/crdoconnor/cats/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244816238,"owners_count":20515064,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-10-13T22:45:13.456Z","updated_at":"2025-03-21T14:49:06.306Z","avatar_url":"https://github.com/crdoconnor.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"Acceptance Test Driven Development with Cookiecutter-Django and Hitch Test\n==========================================================================\n\nCookiecutter-Django\n-------------------\n\nSet up::\n\n    $ curl https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py | python\n\n    # It looks like ~/.local/bin/ is not on your PATH?\n\n    $ echo PATH=~/.local/bin/:$PATH \u003e\u003e ~/.bashrc\n\n    $ pipsi install cookiecutter\n\n    $ cookiecutter https://github.com/crdoconnor/cookiecutter-django.git\n    \n    [ Answer questions ]\n\n\nHitch test\n----------\n\nSet up and run example test::\n\n    $ cd tests/\n\n    $ pipsi install hitch\n\n    $ hitch init\n\n    $ hitch test register-and-log-in.test\n\n    \nCreate test\n-----------\n\nPut into catporn/tests/sign-up-log-in-and-add-cat.test::\n\n    - name: Sign up, log in and add cat\n      scenario:\n        - Load website\n        - Click: sign-up-link\n        - Fill form:\n            id_username: testuser\n            id_email: testuser@domain.com\n            id_password1: password\n            id_password2: password\n        - Click: sign-up-button\n        - Wait for email:\n            containing: Please Confirm Your E-mail Address\n        - Click on link in last email\n        - Click: confirm-button\n        - Fill form:\n            id_login: testuser\n            id_password: password\n        - Click: sign-in-button\n        - Click: add-cat-link\n        - Fill form:\n            id_cat_name: Babushka Cats\n            id_cat_url: \"http://www.catster.com/wp-content/uploads/2015/06/babushka.jpg\"\n        - Click: add-cat-button\n        - Wait for picture to appear:\n            item: cat-picture\n            containing: \"http://www.catster.com/wp-content/uploads/2015/06/babushka.jpg\"\n\n\nRun the test (to see it fail)::\n\n    $ hitch test register-log-in-and-add-cat.test\n\n\nMake test run\n-------------\n\nAdd link to user_detail.html page::\n\n    \u003ca id=\"add-cat-link\" class=\"btn btn-primary\" href=\"{% url 'add_cat' %}\"\u003eAdd cat\u003c/a\u003e\n    \nAdd URL to urls.py::\n    \n    url(r'^addcat/$', add_cat),\n\nAdd import to urls.py::\n\n    from catporn.views import add_cat\n    \nAdd app to INSTALLED_APPS::\n    \n    'catporn',\n\nAdd views.py::\n\n    # -*- coding: utf-8 -*-\n    from django.contrib.auth.decorators import login_required\n    from catporn.forms import AddCatForm\n    from catporn.models import Cat\n    from django.http import HttpResponseRedirect\n    from django.shortcuts import render\n\n\n    @login_required\n    def add_cat(request):\n        \"\"\"Add cat.\"\"\"\n        if request.method == 'POST':\n            form = AddCatForm(request.POST)\n            \n            if form.is_valid():\n                Cat.objects.create(\n                    url=form.cleaned_data['cat_url'],\n                    name=form.cleaned_data['cat_name'],\n                    user=request.user,\n                )\n                return HttpResponseRedirect('/')\n        else:\n            form = AddCatForm()\n        return render(request, 'add_cat.html', {'form': form})\n\nAdd form::\n\n    from django import forms\n\n    class AddCatForm(forms.Form):\n        cat_url = forms.CharField(max_length=300, label='Url')\n        cat_name = forms.CharField(max_length=100, label='Cat pic name')\n        \n\nAdd model::\n\n    # -*- coding: utf-8 -*-\n    from __future__ import unicode_literals, absolute_import\n\n    from django.utils.translation import ugettext_lazy as _\n    from django.core.urlresolvers import reverse\n    from django.db import models\n    from django.conf import settings\n\n\n    class Cat(models.Model):\n        \"\"\"Any kind of thing that will be bought and sold.\"\"\"\n\n        name = models.CharField(_(\"Name\"), max_length=255)\n        url = models.CharField(_(\"Url\"), max_length=255)\n        user = models.ForeignKey(settings.AUTH_USER_MODEL)\n\n\n        def __str__(self):\n            return self.name\n\n        def get_absolute_url(self):\n            return reverse('catporn:cat_url', kwargs={'id': self.id})\n\nAdd migrations directory::\n\n    $ mkdir catporn/migrations\n    $ touch catporn/migrations/__init__.py\n        \nAlso run migrations::\n\n    In [4]: self.services['Django'].manage(\"makemigrations\").run()\n\nReplace home page URL::\n\n    from catporn.views import add_cat, home_page\n\n    url(r'^$', home_page, name=\"home\"),\n    \nAdd home page view to views::\n\n    def home_page(request):\n        \"\"\"Show cats.\"\"\"\n        return render(\n            request,\n            'pages/home.html',\n            {'cats': Cat.objects.all(), }\n        )\n\nOverride pages/home.html::\n\n    {% extends \"base.html\" %}\n    {% block content %}\n\n    \u003cdiv class=\"container\"\u003e\n\n    \u003cdiv class=\"row\"\u003e\n        \u003cdiv class=\"col-sm-12\"\u003e\n            \u003ch2\u003eCats\u003c/h2\u003e\n\n        {% for cat in cats %}\n            \u003cimg class=\"cat-picture\" src=\"{{ cat.url }}\" /\u003e\n        {% endfor %}\n        \u003c/div\u003e\n    \u003c/div\u003e\n    \u003c/div\u003e\n    {% endblock content %}\n\nAdd step to detect cat picture in tests/engine.py::\n\n    def detect_picture(self, which, index, url):\n        \"\"\"Detect that picture contains the correct URL.\"\"\"\n        assert url == self.driver.find_elements_by_class_name(\"cat-picture\")[0].get_attribute(\"src\")","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrdoconnor%2Fcats","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrdoconnor%2Fcats","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrdoconnor%2Fcats/lists"}