An open API service indexing awesome lists of open source software.

https://github.com/crdoconnor/cats

Talk notes for ATDD talk
https://github.com/crdoconnor/cats

Last synced: over 1 year ago
JSON representation

Talk notes for ATDD talk

Awesome Lists containing this project

README

          

Acceptance Test Driven Development with Cookiecutter-Django and Hitch Test
==========================================================================

Cookiecutter-Django
-------------------

Set up::

$ curl https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py | python

# It looks like ~/.local/bin/ is not on your PATH?

$ echo PATH=~/.local/bin/:$PATH >> ~/.bashrc

$ pipsi install cookiecutter

$ cookiecutter https://github.com/crdoconnor/cookiecutter-django.git

[ Answer questions ]

Hitch test
----------

Set up and run example test::

$ cd tests/

$ pipsi install hitch

$ hitch init

$ hitch test register-and-log-in.test


Create test
-----------

Put into catporn/tests/sign-up-log-in-and-add-cat.test::

- name: Sign up, log in and add cat
scenario:
- Load website
- Click: sign-up-link
- Fill form:
id_username: testuser
id_email: testuser@domain.com
id_password1: password
id_password2: password
- Click: sign-up-button
- Wait for email:
containing: Please Confirm Your E-mail Address
- Click on link in last email
- Click: confirm-button
- Fill form:
id_login: testuser
id_password: password
- Click: sign-in-button
- Click: add-cat-link
- Fill form:
id_cat_name: Babushka Cats
id_cat_url: "http://www.catster.com/wp-content/uploads/2015/06/babushka.jpg"
- Click: add-cat-button
- Wait for picture to appear:
item: cat-picture
containing: "http://www.catster.com/wp-content/uploads/2015/06/babushka.jpg"

Run the test (to see it fail)::

$ hitch test register-log-in-and-add-cat.test

Make test run
-------------

Add link to user_detail.html page::

Add cat

Add URL to urls.py::

url(r'^addcat/$', add_cat),

Add import to urls.py::

from catporn.views import add_cat

Add app to INSTALLED_APPS::

'catporn',

Add views.py::

# -*- coding: utf-8 -*-
from django.contrib.auth.decorators import login_required
from catporn.forms import AddCatForm
from catporn.models import Cat
from django.http import HttpResponseRedirect
from django.shortcuts import render

@login_required
def add_cat(request):
"""Add cat."""
if request.method == 'POST':
form = AddCatForm(request.POST)

if form.is_valid():
Cat.objects.create(
url=form.cleaned_data['cat_url'],
name=form.cleaned_data['cat_name'],
user=request.user,
)
return HttpResponseRedirect('/')
else:
form = AddCatForm()
return render(request, 'add_cat.html', {'form': form})

Add form::

from django import forms

class AddCatForm(forms.Form):
cat_url = forms.CharField(max_length=300, label='Url')
cat_name = forms.CharField(max_length=100, label='Cat pic name')

Add model::

# -*- coding: utf-8 -*-
from __future__ import unicode_literals, absolute_import

from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse
from django.db import models
from django.conf import settings

class Cat(models.Model):
"""Any kind of thing that will be bought and sold."""

name = models.CharField(_("Name"), max_length=255)
url = models.CharField(_("Url"), max_length=255)
user = models.ForeignKey(settings.AUTH_USER_MODEL)

def __str__(self):
return self.name

def get_absolute_url(self):
return reverse('catporn:cat_url', kwargs={'id': self.id})

Add migrations directory::

$ mkdir catporn/migrations
$ touch catporn/migrations/__init__.py

Also run migrations::

In [4]: self.services['Django'].manage("makemigrations").run()

Replace home page URL::

from catporn.views import add_cat, home_page

url(r'^$', home_page, name="home"),

Add home page view to views::

def home_page(request):
"""Show cats."""
return render(
request,
'pages/home.html',
{'cats': Cat.objects.all(), }
)

Override pages/home.html::

{% extends "base.html" %}
{% block content %}



Cats

{% for cat in cats %}

{% endfor %}




{% endblock content %}

Add step to detect cat picture in tests/engine.py::

def detect_picture(self, which, index, url):
"""Detect that picture contains the correct URL."""
assert url == self.driver.find_elements_by_class_name("cat-picture")[0].get_attribute("src")