def test_partial_update(self): a = self.author( name='Randall Munroe', slug='randall-munroe', ) view = views.AuthorUpdate.as_view(partial_updates=True) res = view(DummyRequest(), pk=a.id) self.assertEqual(res.status_code, 200) self.assertIsInstance(res.context['form'], ModelForm) self.assertEqual(res.context['form']._fields['name'].object_data, 'Randall Munroe') self.assertEqual(res.context['form']._fields['slug'].object_data, 'randall-munroe') self.assertEqual(res.context['object'], Session.query(Author).filter(Author.id==a.id).one()) self.assertEqual(res.context['author'], Session.query(Author).filter(Author.id==a.id).one()) self.assertTemplateUsed(res, 'tests:templates/author_form.html') self.assertIsInstance(res.context['macros']['my_macros']['testmacro'], Macro) # Modification with both POST and PUT (browser compatible) res = view(DummyRequest( method='POST', params=MultiDict({'name': 'Randall Munroe (xkcd)'}), ), pk=a.id) self.assertEqual(res.status_code, 302) self.assertRedirects(res, '/list/authors/') author = Session.query(Author).one() self.assertQuerysetEqual(author.name, 'Randall Munroe (xkcd)') self.assertQuerysetEqual(author.slug, 'randall-munroe')
def test_allow_empty_false(self): self.artist() view = views.ArtistList.as_view(allow_empty=False) res = view(DummyRequest()) self.assertEqual(res.status_code, 200) Session.query(Artist).delete() self.assertRaises(httpexceptions.HTTPNotFound, view, DummyRequest())
def test_create_with_interpolated_redirect(self): view = views.NaiveAuthorCreate.as_view(success_url='/edit/author/%(id)d/update/') res = view(DummyRequest( method='POST', params=MultiDict({'name': 'Randall Munroe', 'slug': 'randall-munroe'}) )) self.assertQuerysetEqual(Session.query(Author).all(), ['<Author: Randall Munroe>']) self.assertEqual(res.status_code, 302) id = Session.query(Author).all()[0].id self.assertRedirects(res, '/edit/author/%d/update/' % id)
def test_create_with_object_url(self): view = views.ArtistCreate.as_view() res = view(DummyRequest( method='POST', params=MultiDict({'name': 'Rene Magritte'}) )) self.assertEqual(res.status_code, 302) artist = Session.query(Artist).filter(Artist.name=='Rene Magritte').one() self.assertRedirects(res, '/detail/artist/%d/' % artist.id) self.assertQuerysetEqual(Session.query(Artist).all(), ['<Artist: Rene Magritte>'])
def test_delete_with_special_properties(self): a = self.author(name='Randall Munroe', slug='randall-munroe') view = views.SpecializedAuthorDelete.as_view() res = view(DummyRequest(), pk=a.id) self.assertEqual(res.status_code, 200) self.assertEqual(res.context['object'], Session.query(Author).filter(Author.id==a.id).one()) self.assertEqual(res.context['thingy'], Session.query(Author).filter(Author.id==a.id).one()) self.assertFalse('author' in res.context) self.assertTemplateUsed(res, 'tests:templates/confirm_delete.html') res = view(DummyRequest(method='POST'), pk=a.id) self.assertEqual(res.status_code, 302) self.assertRedirects(res, '/list/authors/') self.assertQuerysetEqual(Session.query(Author).all(), [])
def test_update_with_interpolated_redirect(self): a = self.author( name='Randall Munroe', slug='randall-munroe', ) view = views.NaiveAuthorUpdate.as_view(success_url='/edit/author/%(id)d/update/') res = view(DummyRequest( method='POST', params=MultiDict({'name': 'Randall Munroe (author of xkcd)', 'slug': 'randall-munroe'}), ), pk=a.id) self.assertQuerysetEqual(Session.query(Author).all(), ['<Author: Randall Munroe (author of xkcd)>']) self.assertEqual(res.status_code, 302) pk = Session.query(Author).all()[0].id self.assertRedirects(res, '/edit/author/%d/update/' % pk)
def test_delete_by_post(self): a = self.author(name='Randall Munroe', slug='randall-munroe') view = views.AuthorDelete.as_view() res = view(DummyRequest(), pk=a.id) self.assertEqual(res.status_code, 200) self.assertEqual(res.context['object'], Session.query(Author).filter(Author.id==a.id).one()) self.assertEqual(res.context['author'], Session.query(Author).filter(Author.id==a.id).one()) self.assertTemplateUsed(res, 'tests:templates/author_confirm_delete.html') self.assertIsInstance(res.context['macros']['my_macros']['testmacro'], Macro) # Deletion with POST res = view(DummyRequest(method='POST'), pk=a.id) self.assertEqual(res.status_code, 302) self.assertRedirects(res, '/list/authors/') self.assertQuerysetEqual(Session.query(Author).all(), [])
def test_update_put(self): # Note that this test doesn't work under Django as it doesn't process # PUT data specially, but it does work here as we are interacting # directly with the view. a = self.author( name='Randall Munroe', slug='randall-munroe', ) view = views.AuthorUpdate.as_view() res = view(DummyRequest(), pk=a.id) self.assertEqual(res.status_code, 200) self.assertTemplateUsed(res, 'tests:templates/author_form.html') res = view(DummyRequest( method='PUT', params=MultiDict({'name': 'Randall Munroe (author of xkcd)', 'slug': 'randall-munroe'}), ), pk=a.id) # Here is the expected failure. PUT data are not processed in any special # way by django. So the request will equal to a POST without data, hence # the form will be invalid and redisplayed with errors (status code 200). # See also #12635 self.assertEqual(res.status_code, 302) self.assertRedirects(res, '/list/authors/') self.assertQuerysetEqual(Session.query(Author).all(), ['<Author: Randall Munroe (author of xkcd)>'])
def test_template_name_suffix(self): view = views.AuthorList.as_view(template_name_suffix='_objects') res = view(DummyRequest()) self.assertEqual(res.status_code, 200) self.assertEqual(list(res.context['object_list']), list(Session.query(Author).all())) self.assertIs(res.context['author_list'], res.context['object_list']) self.assertTemplateUsed(res, 'tests:templates/author_objects.html')
def test_paginate_by_no_allow_empty(self): self.author() view = views.AuthorList.as_view(allow_empty=False, paginate_by=2) res = view(DummyRequest()) self.assertEqual(list(res.context['object_list']), list(Session.query(Author).all())) self.assertIs(res.context['author_list'], res.context['object_list']) self.assertTemplateUsed(res, 'tests:templates/author_list.html')
def test_delete_with_interpolated_redirect(self): a = self.author(name='Randall Munroe', slug='randall-munroe') view = views.AuthorDelete.as_view(success_url='/edit/authors/create/?deleted=%(id)s') res = view(DummyRequest(method='POST'), pk=a.id) self.assertEqual(res.status_code, 302) self.assertRedirects(res, '/edit/authors/create/?deleted=%d' % a.id) self.assertQuerysetEqual(Session.query(Author).all(), [])
def test_create_with_special_properties(self): view = views.SpecializedAuthorCreate.as_view() res = view(DummyRequest()) self.assertEqual(res.status_code, 200) self.assertIsInstance(res.context['form'], AuthorForm) self.assertFalse('object' in res.context) self.assertFalse('author' in res.context) self.assertTemplateUsed(res, 'tests:templates/form.html') res = view(DummyRequest( method='POST', params=MultiDict({'name': 'Randall Munroe', 'slug': 'randall-munroe'}) )) self.assertEqual(res.status_code, 302) obj = Session.query(Author).filter(Author.slug=='randall-munroe').one() self.assertRedirects(res, '/detail/author/%s/' % obj.id) self.assertQuerysetEqual(Session.query(Author).all(), ['<Author: Randall Munroe>'])
def test_duplicate_context_object_name(self): view = views.AuthorList.as_view(context_object_name='object_list') res = view(DummyRequest()) self.assertEqual(res.status_code, 200) self.assertEqual(list(res.context['object_list']), list(Session.query(Author).all())) self.assertNotIn('authors', res.context) self.assertNotIn('author_list', res.context) self.assertTemplateUsed(res, 'tests:templates/author_list.html')
def test_delete_by_delete(self): # Deletion with browser compatible DELETE method a = self.author(name='Randall Munroe', slug='randall-munroe') view = views.AuthorDelete.as_view() res = view(DummyRequest(method='DELETE'), pk=a.id) self.assertEqual(res.status_code, 302) self.assertRedirects(res, '/list/authors/') self.assertQuerysetEqual(Session.query(Author).all(), [])
def test_create_invalid(self): view = views.AuthorCreate.as_view() res = view(DummyRequest( method='POST', params=MultiDict({'name': 'A' * 101, 'slug': 'randall-munroe'}) )) self.assertEqual(res.status_code, 200) self.assertTemplateUsed(res, 'tests:templates/author_form.html') self.assertEqual(len(res.context['form'].errors), 1) self.assertEqual(Session.query(Author).count(), 0)
def test_create_endpoint_invalid(self): view = views.AuthorCreate.as_view(endpoint=True) res = view(DummyRequest( method='POST', params=MultiDict({'name': 'A' * 101, 'slug': 'randall-munroe'}) )) self.assertEqual(res.status_code, 400) self.assertEqual(Session.query(Author).count(), 0) decoded = json.loads(res.body) self.assertIn('errors', decoded)
def test_update_endpoint_with_url(self): a = self.artist(name='Rene Magritte') view = views.ArtistUpdate.as_view(endpoint=True) res = view(DummyRequest( method='POST', params=MultiDict({'name': 'Rene Magritte'}), ), pk=a.id) self.assertEqual(res.status_code, 302) self.assertRedirects(res, '/detail/artist/%d/' % a.id) self.assertQuerysetEqual(Session.query(Artist).all(), ['<Artist: Rene Magritte>'])
def test_verbose_name(self): self.author() view = views.ArtistList.as_view() res = view(DummyRequest()) self.assertEqual(res.status_code, 200) self.assertTemplateUsed(res, 'tests:templates/list.html') self.assertEqual(list(res.context['object_list']), list(Session.query(Artist).all())) self.assertIs(res.context['artist_list'], res.context['object_list']) self.assertIsNone(res.context['paginator']) self.assertIsNone(res.context['page_obj']) self.assertFalse(res.context['is_paginated'])
def test_query(self): view = views.AuthorList.as_view() res = view(DummyRequest()) self.assertEqual(res.status_code, 200) self.assertTemplateUsed(res, 'tests:templates/author_list.html') self.assertEqual(list(res.context['object_list']), list(Session.query(Author).all())) self.assertIsInstance(res.context['view'], View) self.assertIs(res.context['author_list'], res.context['object_list']) self.assertIsNone(res.context['paginator']) self.assertIsNone(res.context['page_obj']) self.assertFalse(res.context['is_paginated']) self.assertIsInstance(res.context['macros']['my_macros']['testmacro'], Macro)
def test_update_endpoint(self): a = self.author( name='Randall Munroe', slug='randall-munroe', ) view = views.AuthorUpdate.as_view(endpoint=True, success_url=None) res = view(DummyRequest( method='POST', params=MultiDict({'name': 'Randall Munroe (xkcd)', 'slug': 'randall-munroe'}), ), pk=a.id) self.assertEqual(res.status_code, 200) self.assertQuerysetEqual(Session.query(Author).all(), ['<Author: Randall Munroe (xkcd)>'])
def test_update_with_special_properties(self): a = self.author( name='Randall Munroe', slug='randall-munroe', ) view = views.SpecializedAuthorUpdate.as_view() res = view(DummyRequest(), pk=a.id) self.assertEqual(res.status_code, 200) self.assertIsInstance(res.context['form'], views.AuthorForm) self.assertEqual(res.context['object'], Session.query(Author).filter(Author.id==a.id).one()) self.assertEqual(res.context['thingy'], Session.query(Author).filter(Author.id==a.id).one()) self.assertFalse('author' in res.context) self.assertTemplateUsed(res, 'tests:templates/form.html') res = view(DummyRequest( method='POST', params=MultiDict({'name': 'Randall Munroe (author of xkcd)', 'slug': 'randall-munroe'}), ), pk=a.id) self.assertEqual(res.status_code, 302) self.assertRedirects(res, '/detail/author/%d/' % a.id) self.assertQuerysetEqual(Session.query(Author).all(), ['<Author: Randall Munroe (author of xkcd)>'])
def test_paginated_query_shortdata(self): # Test that short datasets ALSO result in a paginated view. self.author() view = views.AuthorList.as_view(paginate_by=30) res = view(DummyRequest()) self.assertEqual(res.status_code, 200) self.assertTemplateUsed(res, 'tests:templates/author_list.html') self.assertEqual(list(res.context['object_list']), list(Session.query(Author).all())) self.assertIs(res.context['author_list'], res.context['object_list']) self.assertEqual(res.context['page_obj'].number, 1) self.assertEqual(res.context['paginator'].num_pages, 1) self.assertFalse(res.context['is_paginated'])
def test_update_get_object(self): a = self.author( name='Randall Munroe', slug='randall-munroe', ) view = views.OneAuthorUpdate.as_view() res = view(DummyRequest()) self.assertEqual(res.status_code, 200) self.assertIsInstance(res.context['form'], ModelForm) self.assertIsInstance(res.context['view'], View) self.assertEqual(res.context['object'], Session.query(Author).filter(Author.id==a.id).one()) self.assertEqual(res.context['author'], Session.query(Author).filter(Author.id==a.id).one()) self.assertTemplateUsed(res, 'tests:templates/author_form.html') # Modification with both POST and PUT (browser compatible) res = view(DummyRequest( method='POST', params=MultiDict({'name': 'Randall Munroe (xkcd)', 'slug': 'randall-munroe'}), )) self.assertEqual(res.status_code, 302) self.assertRedirects(res, '/list/authors/') self.assertQuerysetEqual(Session.query(Author).all(), ['<Author: Randall Munroe (xkcd)>'])
def test_create_endpoint(self): view = views.AuthorCreate.as_view(endpoint=True, success_url=None) res = view(DummyRequest()) self.assertEqual(res.status_code, 501) self.assertEqual(res.body, '') res = view(DummyRequest( method='POST', params=MultiDict({'name': 'Randall Munroe', 'slug': 'randall-munroe'}) )) self.assertEqual(res.status_code, 200) self.assertEqual(res.body, '') self.assertQuerysetEqual(Session.query(Author).all(), ['<Author: Randall Munroe>'])
def test_update_invalid(self): a = self.author( name='Randall Munroe', slug='randall-munroe', ) view = views.AuthorUpdate.as_view() res = view(DummyRequest( method='PUT', params=MultiDict({'name': 'a' * 101, 'slug': 'randall-munroe'}), ), pk=a.id) self.assertEqual(res.status_code, 200) self.assertTemplateUsed(res, 'tests:templates/author_form.html') self.assertEqual(len(res.context['form'].errors), 1) self.assertQuerysetEqual(Session.query(Author).all(), ['<Author: Randall Munroe>'])
def test_update_invalid_endpoint_with_url(self): a = self.author( name='Randall Munroe', slug='randall-munroe', ) view = views.AuthorUpdate.as_view(endpoint=True) res = view(DummyRequest( method='PUT', params=MultiDict({'name': 'a' * 101, 'slug': 'randall-munroe'}), ), pk=a.id) self.assertEqual(res.status_code, 400) decoded = json.loads(res.body) self.assertIn('errors', decoded) self.assertQuerysetEqual(Session.query(Author).all(), ['<Author: Randall Munroe>'])
def test_create_endpoint_with_url(self): view = views.AuthorCreate.as_view(endpoint=True) res = view(DummyRequest()) self.assertEqual(res.status_code, 501) self.assertEqual(res.body, '') res = view(DummyRequest( method='POST', params=MultiDict({'name': 'Randall Munroe', 'slug': 'randall-munroe'}) )) self.assertEqual(res.status_code, 302) self.assertEqual(res.body, '') self.assertRedirects(res, '/list/authors/') self.assertQuerysetEqual(Session.query(Author).all(), ['<Author: Randall Munroe>'])
def test_paginated_orphaned_query(self): self.assertEqual(Session.query(Author).count(), 0) self._make_authors(92) view = views.AuthorList.as_view(paginate_by=30, paginate_orphans=2) res = view(DummyRequest()) self.assertEqual(res.status_code, 200) self.assertEqual(res.context['page_obj'].number, 1) res = view(DummyRequest(params={'page': 'last'})) self.assertEqual(res.status_code, 200) self.assertEqual(res.context['page_obj'].number, 3) res = view(DummyRequest(params={'page': '3'})) self.assertEqual(res.status_code, 200) self.assertEqual(res.context['page_obj'].number, 3) self.assertRaises(httpexceptions.HTTPNotFound, view, DummyRequest(params={'page': '4'}))
def test_create(self): view = views.AuthorCreate.as_view() res = view(DummyRequest()) self.assertEqual(res.status_code, 200) self.assertIsInstance(res.context['form'], ModelForm) self.assertIsInstance(res.context['view'], View) self.assertFalse('object' in res.context) self.assertFalse('author' in res.context) self.assertTemplateUsed(res, 'tests:templates/author_form.html') self.assertIsInstance(res.context['macros']['my_macros']['testmacro'], Macro) res = view(DummyRequest( method='POST', params=MultiDict({'name': 'Randall Munroe', 'slug': 'randall-munroe'}) )) self.assertEqual(res.status_code, 302) self.assertRedirects(res, '/list/authors/') self.assertQuerysetEqual(Session.query(Author).all(), ['<Author: Randall Munroe>'])
def get_query(self): return Session.query(Book).filter(Book.id==123)