Всё можно, дело в том, что каждый тест выполняется как бы с нуля.
Я для тестов использую приложение django-webtest
. Тест выглядит так:
# -*- coding: utf-8 -*-
from datetime import time
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.utils import timezone
from django_webtest import WebTest
from src.contracts.models import Step
from src.contracts.tests.factories import ContractFactory
from src.efforts.models import Effort
from src.efforts.tests.factories import EffortFactory
USER_NAME, USER_PASSWORD, USER_EMAIL = 'user', 'q1', 'user@mail.me.not'
PROFILE_INDEX = reverse('frontend:profile:index')
class EffortTest(WebTest):
fixtures = ('phase_initial.json', 'step_initial.json')
def setUp(self):
self.user = User.objects.create_user(USER_NAME, USER_EMAIL, USER_PASSWORD)
self.contract = ContractFactory()
self.contract.is_activated = True
self.contract.save()
self.relation = self.contract.relation_set.all()[0]
self.relation.mode = Step.STEP_TYPE_STAFF
self.relation.duration_a = 4
self.relation.save()
response = self.app.get(reverse('auth:login'))
form = response.form
form['username'] = USER_NAME
form['password'] = USER_PASSWORD
response = form.submit()
self.assertRedirects(response, reverse('frontend:index'))
def disabled_test_effort_register_scheduled(self):
response = self.app.get(PROFILE_INDEX)
form = response.forms['register_effort_scheduled']
form['day'] = timezone.now().date()
form['duration_hm'] = '2:00'
form['contract'] = self.contract.pk
form['task'] = self.relation.pk
# form.fields['task'].queryset = Relation.objects.all()
response = form.submit()
self.assertRedirects(response, PROFILE_INDEX)
qs = Effort.objects.filter(task=self.relation)
self.assertTrue(qs.exists())
def test_effort_register_unscheduled(self):
response = self.app.get(PROFILE_INDEX)
form = response.forms['register_effort_unscheduled']
form['day'] = timezone.now().date()
form['duration_hm'] = '0:30'
form['project'] = self.contract.project.pk
form['desc'] = 'test'
response = form.submit()
self.assertRedirects(response, PROFILE_INDEX)
qs = Effort.objects.filter(desc='test')
self.assertTrue(qs.exists())
def test_effort_edit(self):
effort = EffortFactory(
user=self.user,
task=self.relation,
day=timezone.now().date(),
duration=2)
url = reverse('frontend:profile:efforts_more', kwargs={'offset': 0})
response = self.app.get(url)
response = response.click(linkid='effort_edit_%i' % effort.pk)
VALUE = 3.5
value = int(VALUE * 60)
VALUE_HM = time(value / 60, value % 60)
form = response.forms['id_edit_effort']
form['duration_hm'] = VALUE_HM
response = form.submit()
obj = Effort.objects.get(pk=effort.pk)
self.assertRedirects(response, PROFILE_INDEX)
self.assertEqual(obj.duration_hm, VALUE_HM)
self.assertEqual(obj.duration, VALUE)
def test_effort_delete(self):
effort = EffortFactory(
user=self.user,
task=self.relation,
day=timezone.now().date(),
duration=2)
url = reverse('frontend:profile:efforts_more', kwargs={'offset': 0})
response = self.app.get(url)
response = response.click(linkid='effort_delete_%i' % effort.pk)
response = response.form.submit()
self.assertRedirects(response, PROFILE_INDEX)
self.assertFalse(Effort.objects.filter(pk=effort.pk).exists())
Тут показано многое, и фабрики, и клики по ссылкам, и работа с формами. Развлекайтесь.