| 149 | # |
| 150 | # SessionWizard tests |
| 151 | # |
| 152 | class SessionWizardModel(models.Model): |
| 153 | field = models.CharField(max_length=10) |
| 154 | |
| 155 | class SessionWizardPageOneForm(forms.Form): |
| 156 | field = forms.CharField(required=True) |
| 157 | |
| 158 | class SessionWizardPageTwoForm(forms.ModelForm): |
| 159 | class Meta: |
| 160 | model = SessionWizardModel |
| 161 | |
| 162 | class SessionWizardPageThreeForm(forms.Form): |
| 163 | field = forms.CharField() |
| 164 | |
| 165 | class SessionWizardDynamicPageForm(forms.Form): |
| 166 | field = forms.CharField() |
| 167 | |
| 168 | class SessionWizardClass(wizard.SessionWizard): |
| 169 | def get_page_title(self, session, page0): |
| 170 | return "Custom Page Title: %s" % str(page0 + 1) |
| 171 | |
| 172 | def process_show_form(self, request, page0, form): |
| 173 | return {'form_title' : 'Form %s' % str(page0 + 1)} |
| 174 | |
| 175 | def preprocess_submit_form(self, request, page0, form): |
| 176 | if page0 == 1 and request.POST['field'] == "": |
| 177 | self._remove_page(request.session, page0) |
| 178 | return page0 - 1 |
| 179 | |
| 180 | def process_submit_form(self, request, page0, form): |
| 181 | if page0 == 2: |
| 182 | self._insert_page(request.session, page0 + 1, |
| 183 | SessionWizardDynamicPageForm) |
| 184 | |
| 185 | def get_template(self, page0): |
| 186 | return "formtools/form.html" |
| 187 | |
| 188 | def done(self, request): |
| 189 | return http.HttpResponse(success_string) |
| 190 | |
| 191 | class SessionWizardTests(TestCase): |
| 192 | urls = 'django.contrib.formtools.test_urls' |
| 193 | |
| 194 | def test_valid_POST(self): |
| 195 | """ |
| 196 | Tests that a post containing valid data will set session values |
| 197 | correctly and redirect to the next page. |
| 198 | """ |
| 199 | response = self.client.post('/sessionwizard/0', {"page0":"0", |
| 200 | "field":"test"}) |
| 201 | self.assertEquals(302, response.status_code) |
| 202 | self.assertEquals("http://testserver/sessionwizard/1", |
| 203 | response['Location']) |
| 204 | session = self.client.session |
| 205 | cleaned_data = session['session_wizard_data']['cleaned_data'] |
| 206 | post_data = session['session_wizard_data']['POST_data'] |
| 207 | self.assertEquals('test', cleaned_data[0]['field']) |
| 208 | self.assertEquals('test', post_data[0]['field']) |
| 209 | |
| 210 | def test_invalid_POST(self): |
| 211 | """ |
| 212 | Tests that a post containing invalid data will set session values |
| 213 | correctly and redisplay the form. |
| 214 | """ |
| 215 | response = self.client.post('/sessionwizard/0', {"page0":"0", |
| 216 | "field":""}) |
| 217 | self.assertEquals(200, response.status_code) |
| 218 | session = self.client.session |
| 219 | post_data = session['session_wizard_data']['POST_data'] |
| 220 | self.assertEquals('', post_data[0]['field']) |
| 221 | |
| 222 | def test_GET(self): |
| 223 | """ |
| 224 | Tests that a get will display a page properly. |
| 225 | """ |
| 226 | response = self.client.get('/sessionwizard/0') |
| 227 | self.assertEquals(200, response.status_code) |
| 228 | |
| 229 | def test_preprocess_submit_form(self): |
| 230 | """ |
| 231 | Tests the preprocess_submit_form hook of SessionWizard POSTs. |
| 232 | The SessionWizardClass is coded to short-circuit a POST for page index 1 |
| 233 | when form.cleaned_data['field'] == '' by returning a reference to page0 |
| 234 | index 0. |
| 235 | """ |
| 236 | response = self.client.post('/sessionwizard/1', {"page0":"1", |
| 237 | "field":""}) |
| 238 | self.assertEquals(302, response.status_code) |
| 239 | self.assertEquals("http://testserver/sessionwizard/0", |
| 240 | response['Location']) |
| 241 | |
| 242 | def test_process_submit_form(self): |
| 243 | """ |
| 244 | Tests the process_submit_form hook of SessionWizard POSTs. |
| 245 | The SessionWizardClass is coded to insert a new page at index 3 on a |
| 246 | POST for page index 2. |
| 247 | """ |
| 248 | response = self.client.post('/sessionwizard/2', {"page0":"2", |
| 249 | "field":"test"}) |
| 250 | self.assertEquals(302, response.status_code) |
| 251 | self.assertEquals("http://testserver/sessionwizard/3", |
| 252 | response['Location']) |
| 253 | self.assertEquals([SessionWizardPageOneForm, |
| 254 | SessionWizardPageTwoForm, |
| 255 | SessionWizardPageThreeForm, |
| 256 | SessionWizardDynamicPageForm], |
| 257 | self.client.session['session_wizard_data']['form_list']) |
| 258 | |
| 259 | def test_process_show_form(self): |
| 260 | """ |
| 261 | Tests the process_show_form hook. SessionWizardClass is coded to |
| 262 | return a extra_context having a specific 'form_title' attribute. |
| 263 | """ |
| 264 | response = self.client.get('/sessionwizard/0') |
| 265 | self.assertEquals(200, response.status_code) |
| 266 | self.assertEquals("Form 1", |
| 267 | response.context[0]['extra_context']['form_title']) |
| 268 | |
| 269 | def test_validate_all(self): |
| 270 | """ |
| 271 | Submits all forms, with one of them being invalid, and tests that |
| 272 | submitting the last form will catch an invalid form earlier in the |
| 273 | workflow and redisplay it. |
| 274 | """ |
| 275 | self.client.post('/sessionwizard/0', {"page0":"0", "field":""}) |
| 276 | self.client.post('/sessionwizard/1', {"page0":"1", "field":"test1"}) |
| 277 | self.client.post('/sessionwizard/2', {"page0":"2", "field":"test2"}) |
| 278 | response = self.client.post('/sessionwizard/3', |
| 279 | {"page0":"3", "field":"test3"}) |
| 280 | self.assertEquals("Form 1", |
| 281 | response.context[0]['extra_context']['form_title']) |
| 282 | |
| 283 | def test_done(self): |
| 284 | self.client.post('/sessionwizard/0', {"page0":"0", "field":"test0"}) |
| 285 | self.client.post('/sessionwizard/1', {"page0":"1", "field":"test1"}) |
| 286 | self.client.post('/sessionwizard/2', {"page0":"2", "field":"test2"}) |
| 287 | response = self.client.post('/sessionwizard/3', |
| 288 | {"page0":"3", "field":"test3"}) |
| 289 | self.assertEqual(response.content, success_string) |