tests.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. from __future__ import unicode_literals
  2. from django.core.urlresolvers import reverse
  3. from django.http import QueryDict
  4. from django.test import TestCase
  5. from django.contrib.auth.models import User
  6. from django.contrib.auth.tests.utils import skipIfCustomUser
  7. from django.contrib.formtools.wizard.views import (NamedUrlSessionWizardView,
  8. NamedUrlCookieWizardView)
  9. from django.contrib.formtools.tests.wizard.test_forms import get_request, Step1, Step2
  10. class NamedWizardTests(object):
  11. urls = 'django.contrib.formtools.tests.wizard.namedwizardtests.urls'
  12. def setUp(self):
  13. self.testuser, created = User.objects.get_or_create(username='testuser1')
  14. self.wizard_step_data[0]['form1-user'] = self.testuser.pk
  15. def test_initial_call(self):
  16. response = self.client.get(reverse('%s_start' % self.wizard_urlname))
  17. self.assertEqual(response.status_code, 302)
  18. response = self.client.get(response.url)
  19. self.assertEqual(response.status_code, 200)
  20. wizard = response.context['wizard']
  21. self.assertEqual(wizard['steps'].current, 'form1')
  22. self.assertEqual(wizard['steps'].step0, 0)
  23. self.assertEqual(wizard['steps'].step1, 1)
  24. self.assertEqual(wizard['steps'].last, 'form4')
  25. self.assertEqual(wizard['steps'].prev, None)
  26. self.assertEqual(wizard['steps'].next, 'form2')
  27. self.assertEqual(wizard['steps'].count, 4)
  28. self.assertEqual(wizard['url_name'], self.wizard_urlname)
  29. def test_initial_call_with_params(self):
  30. get_params = {'getvar1': 'getval1', 'getvar2': 'getval2'}
  31. response = self.client.get(reverse('%s_start' % self.wizard_urlname),
  32. get_params)
  33. self.assertEqual(response.status_code, 302)
  34. # Test for proper redirect GET parameters
  35. location = response.url
  36. self.assertNotEqual(location.find('?'), -1)
  37. querydict = QueryDict(location[location.find('?') + 1:])
  38. self.assertEqual(dict(querydict.items()), get_params)
  39. def test_form_post_error(self):
  40. response = self.client.post(
  41. reverse(self.wizard_urlname, kwargs={'step': 'form1'}),
  42. self.wizard_step_1_data)
  43. self.assertEqual(response.status_code, 200)
  44. self.assertEqual(response.context['wizard']['steps'].current, 'form1')
  45. self.assertEqual(response.context['wizard']['form'].errors,
  46. {'name': ['This field is required.'],
  47. 'user': ['This field is required.']})
  48. def test_form_post_success(self):
  49. response = self.client.post(
  50. reverse(self.wizard_urlname, kwargs={'step': 'form1'}),
  51. self.wizard_step_data[0])
  52. response = self.client.get(response.url)
  53. self.assertEqual(response.status_code, 200)
  54. wizard = response.context['wizard']
  55. self.assertEqual(wizard['steps'].current, 'form2')
  56. self.assertEqual(wizard['steps'].step0, 1)
  57. self.assertEqual(wizard['steps'].prev, 'form1')
  58. self.assertEqual(wizard['steps'].next, 'form3')
  59. def test_form_stepback(self):
  60. response = self.client.get(
  61. reverse(self.wizard_urlname, kwargs={'step': 'form1'}))
  62. self.assertEqual(response.status_code, 200)
  63. self.assertEqual(response.context['wizard']['steps'].current, 'form1')
  64. response = self.client.post(
  65. reverse(self.wizard_urlname, kwargs={'step': 'form1'}),
  66. self.wizard_step_data[0])
  67. response = self.client.get(response.url)
  68. self.assertEqual(response.status_code, 200)
  69. self.assertEqual(response.context['wizard']['steps'].current, 'form2')
  70. response = self.client.post(
  71. reverse(self.wizard_urlname, kwargs={
  72. 'step': response.context['wizard']['steps'].current
  73. }), {'wizard_goto_step': response.context['wizard']['steps'].prev})
  74. response = self.client.get(response.url)
  75. self.assertEqual(response.status_code, 200)
  76. self.assertEqual(response.context['wizard']['steps'].current, 'form1')
  77. def test_form_jump(self):
  78. response = self.client.get(
  79. reverse(self.wizard_urlname, kwargs={'step': 'form1'}))
  80. self.assertEqual(response.status_code, 200)
  81. self.assertEqual(response.context['wizard']['steps'].current, 'form1')
  82. response = self.client.get(
  83. reverse(self.wizard_urlname, kwargs={'step': 'form3'}))
  84. self.assertEqual(response.status_code, 200)
  85. self.assertEqual(response.context['wizard']['steps'].current, 'form3')
  86. def test_form_finish(self):
  87. response = self.client.get(
  88. reverse(self.wizard_urlname, kwargs={'step': 'form1'}))
  89. self.assertEqual(response.status_code, 200)
  90. self.assertEqual(response.context['wizard']['steps'].current, 'form1')
  91. response = self.client.post(
  92. reverse(self.wizard_urlname,
  93. kwargs={'step': response.context['wizard']['steps'].current}),
  94. self.wizard_step_data[0])
  95. response = self.client.get(response.url)
  96. self.assertEqual(response.status_code, 200)
  97. self.assertEqual(response.context['wizard']['steps'].current, 'form2')
  98. post_data = self.wizard_step_data[1]
  99. post_data['form2-file1'].close()
  100. post_data['form2-file1'] = open(__file__, 'rb')
  101. response = self.client.post(
  102. reverse(self.wizard_urlname,
  103. kwargs={'step': response.context['wizard']['steps'].current}),
  104. post_data)
  105. response = self.client.get(response.url)
  106. self.assertEqual(response.status_code, 200)
  107. self.assertEqual(response.context['wizard']['steps'].current, 'form3')
  108. response = self.client.post(
  109. reverse(self.wizard_urlname,
  110. kwargs={'step': response.context['wizard']['steps'].current}),
  111. self.wizard_step_data[2])
  112. response = self.client.get(response.url)
  113. self.assertEqual(response.status_code, 200)
  114. self.assertEqual(response.context['wizard']['steps'].current, 'form4')
  115. response = self.client.post(
  116. reverse(self.wizard_urlname,
  117. kwargs={'step': response.context['wizard']['steps'].current}),
  118. self.wizard_step_data[3])
  119. response = self.client.get(response.url)
  120. self.assertEqual(response.status_code, 200)
  121. all_data = response.context['form_list']
  122. with open(__file__, 'rb') as f:
  123. self.assertEqual(all_data[1]['file1'].read(), f.read())
  124. all_data[1]['file1'].close()
  125. del all_data[1]['file1']
  126. self.assertEqual(all_data, [
  127. {'name': 'Pony', 'thirsty': True, 'user': self.testuser},
  128. {'address1': '123 Main St', 'address2': 'Djangoland'},
  129. {'random_crap': 'blah blah'},
  130. [{'random_crap': 'blah blah'}, {'random_crap': 'blah blah'}]])
  131. def test_cleaned_data(self):
  132. response = self.client.get(
  133. reverse(self.wizard_urlname, kwargs={'step': 'form1'}))
  134. self.assertEqual(response.status_code, 200)
  135. response = self.client.post(
  136. reverse(self.wizard_urlname,
  137. kwargs={'step': response.context['wizard']['steps'].current}),
  138. self.wizard_step_data[0])
  139. response = self.client.get(response.url)
  140. self.assertEqual(response.status_code, 200)
  141. post_data = self.wizard_step_data[1]
  142. post_data['form2-file1'] = open(__file__, 'rb')
  143. response = self.client.post(
  144. reverse(self.wizard_urlname,
  145. kwargs={'step': response.context['wizard']['steps'].current}),
  146. post_data)
  147. response = self.client.get(response.url)
  148. self.assertEqual(response.status_code, 200)
  149. step2_url = reverse(self.wizard_urlname, kwargs={'step': 'form2'})
  150. response = self.client.get(step2_url)
  151. self.assertEqual(response.status_code, 200)
  152. self.assertEqual(response.context['wizard']['steps'].current, 'form2')
  153. with open(__file__, 'rb') as f:
  154. self.assertEqual(
  155. response.context['wizard']['form'].files['form2-file1'].read(),
  156. f.read())
  157. response = self.client.post(
  158. reverse(self.wizard_urlname,
  159. kwargs={'step': response.context['wizard']['steps'].current}),
  160. self.wizard_step_data[2])
  161. response = self.client.get(response.url)
  162. self.assertEqual(response.status_code, 200)
  163. response = self.client.post(
  164. reverse(self.wizard_urlname,
  165. kwargs={'step': response.context['wizard']['steps'].current}),
  166. self.wizard_step_data[3])
  167. response = self.client.get(response.url)
  168. self.assertEqual(response.status_code, 200)
  169. all_data = response.context['all_cleaned_data']
  170. with open(__file__, 'rb') as f:
  171. self.assertEqual(all_data['file1'].read(), f.read())
  172. all_data['file1'].close()
  173. del all_data['file1']
  174. self.assertEqual(
  175. all_data,
  176. {'name': 'Pony', 'thirsty': True, 'user': self.testuser,
  177. 'address1': '123 Main St', 'address2': 'Djangoland',
  178. 'random_crap': 'blah blah', 'formset-form4': [
  179. {'random_crap': 'blah blah'},
  180. {'random_crap': 'blah blah'}
  181. ]})
  182. form_dict = response.context['form_dict']
  183. self.assertIn('form1', form_dict.keys())
  184. self.assertIn('form2', form_dict.keys())
  185. self.assertEqual(form_dict['form1'].cleaned_data, response.context['form_list'][0])
  186. def test_manipulated_data(self):
  187. response = self.client.get(
  188. reverse(self.wizard_urlname, kwargs={'step': 'form1'}))
  189. self.assertEqual(response.status_code, 200)
  190. response = self.client.post(
  191. reverse(self.wizard_urlname,
  192. kwargs={'step': response.context['wizard']['steps'].current}),
  193. self.wizard_step_data[0])
  194. response = self.client.get(response.url)
  195. self.assertEqual(response.status_code, 200)
  196. post_data = self.wizard_step_data[1]
  197. post_data['form2-file1'].close()
  198. post_data['form2-file1'] = open(__file__, 'rb')
  199. response = self.client.post(
  200. reverse(self.wizard_urlname,
  201. kwargs={'step': response.context['wizard']['steps'].current}),
  202. post_data)
  203. response = self.client.get(response.url)
  204. self.assertEqual(response.status_code, 200)
  205. response = self.client.post(
  206. reverse(self.wizard_urlname,
  207. kwargs={'step': response.context['wizard']['steps'].current}),
  208. self.wizard_step_data[2])
  209. loc = response.url
  210. response = self.client.get(loc)
  211. self.assertEqual(response.status_code, 200, loc)
  212. self.client.cookies.pop('sessionid', None)
  213. self.client.cookies.pop('wizard_cookie_contact_wizard', None)
  214. response = self.client.post(
  215. reverse(self.wizard_urlname,
  216. kwargs={'step': response.context['wizard']['steps'].current}),
  217. self.wizard_step_data[3])
  218. self.assertEqual(response.status_code, 200)
  219. self.assertEqual(response.context['wizard']['steps'].current, 'form1')
  220. def test_form_reset(self):
  221. response = self.client.post(
  222. reverse(self.wizard_urlname, kwargs={'step': 'form1'}),
  223. self.wizard_step_data[0])
  224. response = self.client.get(response.url)
  225. self.assertEqual(response.status_code, 200)
  226. self.assertEqual(response.context['wizard']['steps'].current, 'form2')
  227. response = self.client.get(
  228. '%s?reset=1' % reverse('%s_start' % self.wizard_urlname))
  229. self.assertEqual(response.status_code, 302)
  230. response = self.client.get(response.url)
  231. self.assertEqual(response.status_code, 200)
  232. self.assertEqual(response.context['wizard']['steps'].current, 'form1')
  233. @skipIfCustomUser
  234. class NamedSessionWizardTests(NamedWizardTests, TestCase):
  235. wizard_urlname = 'nwiz_session'
  236. wizard_step_1_data = {
  237. 'session_contact_wizard-current_step': 'form1',
  238. }
  239. wizard_step_data = (
  240. {
  241. 'form1-name': 'Pony',
  242. 'form1-thirsty': '2',
  243. 'session_contact_wizard-current_step': 'form1',
  244. },
  245. {
  246. 'form2-address1': '123 Main St',
  247. 'form2-address2': 'Djangoland',
  248. 'session_contact_wizard-current_step': 'form2',
  249. },
  250. {
  251. 'form3-random_crap': 'blah blah',
  252. 'session_contact_wizard-current_step': 'form3',
  253. },
  254. {
  255. 'form4-INITIAL_FORMS': '0',
  256. 'form4-TOTAL_FORMS': '2',
  257. 'form4-MAX_NUM_FORMS': '0',
  258. 'form4-0-random_crap': 'blah blah',
  259. 'form4-1-random_crap': 'blah blah',
  260. 'session_contact_wizard-current_step': 'form4',
  261. }
  262. )
  263. @skipIfCustomUser
  264. class NamedCookieWizardTests(NamedWizardTests, TestCase):
  265. wizard_urlname = 'nwiz_cookie'
  266. wizard_step_1_data = {
  267. 'cookie_contact_wizard-current_step': 'form1',
  268. }
  269. wizard_step_data = (
  270. {
  271. 'form1-name': 'Pony',
  272. 'form1-thirsty': '2',
  273. 'cookie_contact_wizard-current_step': 'form1',
  274. },
  275. {
  276. 'form2-address1': '123 Main St',
  277. 'form2-address2': 'Djangoland',
  278. 'cookie_contact_wizard-current_step': 'form2',
  279. },
  280. {
  281. 'form3-random_crap': 'blah blah',
  282. 'cookie_contact_wizard-current_step': 'form3',
  283. },
  284. {
  285. 'form4-INITIAL_FORMS': '0',
  286. 'form4-TOTAL_FORMS': '2',
  287. 'form4-MAX_NUM_FORMS': '0',
  288. 'form4-0-random_crap': 'blah blah',
  289. 'form4-1-random_crap': 'blah blah',
  290. 'cookie_contact_wizard-current_step': 'form4',
  291. }
  292. )
  293. class NamedFormTests(object):
  294. urls = 'django.contrib.formtools.tests.wizard.namedwizardtests.urls'
  295. def test_revalidation(self):
  296. request = get_request()
  297. testform = self.formwizard_class.as_view(
  298. [('start', Step1), ('step2', Step2)],
  299. url_name=self.wizard_urlname)
  300. response, instance = testform(request, step='done')
  301. instance.render_done(None)
  302. self.assertEqual(instance.storage.current_step, 'start')
  303. class TestNamedUrlSessionWizardView(NamedUrlSessionWizardView):
  304. def dispatch(self, request, *args, **kwargs):
  305. response = super(TestNamedUrlSessionWizardView, self).dispatch(request, *args, **kwargs)
  306. return response, self
  307. class TestNamedUrlCookieWizardView(NamedUrlCookieWizardView):
  308. def dispatch(self, request, *args, **kwargs):
  309. response = super(TestNamedUrlCookieWizardView, self).dispatch(request, *args, **kwargs)
  310. return response, self
  311. @skipIfCustomUser
  312. class NamedSessionFormTests(NamedFormTests, TestCase):
  313. formwizard_class = TestNamedUrlSessionWizardView
  314. wizard_urlname = 'nwiz_session'
  315. @skipIfCustomUser
  316. class NamedCookieFormTests(NamedFormTests, TestCase):
  317. formwizard_class = TestNamedUrlCookieWizardView
  318. wizard_urlname = 'nwiz_cookie'