def test_apps_cloning_validation(self): """Checks that the target is properly validated when cloning""" home, blog = self._apps_validation_models() client = self.login() clone_url = reverse("admin:testapp_page_clone", args=(blog.pk, )) response = client.get(clone_url) self.assertContains(response, "_set_content") self.assertContains(response, "set_application") response = client.post(clone_url, { "target": home.pk, "set_application": True }) self.assertContains(response, "Apps may not have any descendants in the tree.") # The other way round works clone_url = reverse("admin:testapp_page_clone", args=(home.pk, )) response = client.post(clone_url, { "target": blog.pk, "set_application": True }) self.assertRedirects( response, reverse("admin:testapp_page_change", args=(blog.pk, ))) # No apps in tree anymore self.assertEqual(Page.objects.exclude(application="").count(), 0)
def test_invalid_move(self): root, p1, p2 = self.prepare_for_move() client = self.login() response = client.post( reverse("admin:testapp_page_move", args=(root.pk, )), {}) self.assertContains(response, "This field is required.", 1) response = client.post( reverse("admin:testapp_page_move", args=(root.pk, )), { "move_to": "first", "of": p1.pk }, ) self.assertContains( response, "Select a valid choice. That choice is not one of the available choices.", # noqa ) response = client.post( reverse("admin:testapp_page_move", args=(root.pk, )), { "move_to": "first", "of": root.pk }, ) self.assertContains( response, "Cannot move node to a position relative to itself.")
def test_move_to_root_last(self): root, p1, p2 = self.prepare_for_move() client = self.login() response = client.get( reverse('admin:testapp_page_move', args=(p1.pk, )), ) self.assertContains(response, '*** p1', 1) self.assertContains(response, '--- p2', 1) response = client.post( reverse('admin:testapp_page_move', args=(p1.pk, )), { 'move_to': 'last', 'of': '', }, ) self.assertEqual( [(p.pk, p.parent_id, p.position) for p in Page.objects.all()], [ (root.pk, None, 10), (p2.pk, root.pk, 20), (p1.pk, None, 20), ], )
def test_content_cloning(self): """Test that cloning the content works and replaces everything""" home_en = Page.objects.create( title="home", slug="home", path="/en/", static_path=True, language_code="en", is_active=True, menu="main", ) home_en.testapp_snippet_set.create(template_name="snippet.html", ordering=10, region="main") home_de = Page.objects.create( title="home", slug="home", path="/de/", static_path=True, language_code="de", is_active=True, menu="main", ) home_de.testapp_snippet_set.create(template_name="snippet-33.html", ordering=10, region="main") client = self.login() response = client.post( reverse("admin:testapp_page_clone", args=(home_en.pk, )), { "target": home_de.pk, "_set_content": True }, ) print(response.content.decode("utf-8")) self.assertRedirects( response, reverse("admin:testapp_page_change", args=(home_de.pk, ))) self.assertEqual( list( home_de.testapp_snippet_set.values_list("template_name", flat=True)), ["snippet.html"], )
def test_invalid_parent(self): root, p1, p2 = self.prepare_for_move() p1.application = "blog" p1.save() p2 = Page.objects.get(pk=p2.pk) p2.parent_id = p1.pk # Apps may not have descendants self.assertRaises(ValidationError, p2.full_clean) client = self.login() response = client.post( reverse("admin:testapp_page_move", args=(p2.pk, )), { "move_to": "first", "of": p1.pk }, ) self.assertContains( response, "<li>Invalid parent: Apps may not have any descendants.</li>", status_code=200, )
def test_reorder_siblings(self): root, p1, p2 = self.prepare_for_move() p3 = Page.objects.create( title='p3', slug='p3', parent=root, ) client = self.login() client.post( reverse('admin:testapp_page_move', args=(p3.pk, )), { 'move_to': 'right', 'of': p1.pk, }, ) self.assertEqual( [(p.pk, p.parent_id, p.position) for p in Page.objects.all()], [ (root.pk, None, 10), (p1.pk, root.pk, 10), (p3.pk, root.pk, 20), (p2.pk, root.pk, 30), ], )
def test_reorder_siblings(self): root, p1, p2 = self.prepare_for_move() p3 = Page.objects.create(title="p3", slug="p3", parent=root) client = self.login() client.post( reverse("admin:testapp_page_move", args=(p3.pk, )), { "move_to": "right", "of": p1.pk }, ) self.assertEqual( [(p.pk, p.parent_id, p.position) for p in Page.objects.all()], [ (root.pk, None, 10), (p1.pk, root.pk, 10), (p3.pk, root.pk, 20), (p2.pk, root.pk, 30), ], ) client.post( reverse("admin:testapp_page_move", args=(p3.pk, )), { "move_to": "left", "of": p1.pk }, ) self.assertEqual( [(p.pk, p.parent_id, p.position) for p in Page.objects.all()], [ (root.pk, None, 10), (p3.pk, root.pk, 10), (p1.pk, root.pk, 20), (p2.pk, root.pk, 30), ], )
def test_move_to_root_last(self): root, p1, p2 = self.prepare_for_move() client = self.login() response = client.get( reverse("admin:testapp_page_move", args=(p1.pk, ))) self.assertContains(response, "*** p1", 1) self.assertContains(response, "--- p2", 1) self.assertContains(response, 'name="_save"', 1) response = client.post( reverse("admin:testapp_page_move", args=(p1.pk, )), { "move_to": "last", "of": "" }, ) self.assertEqual( [(p.pk, p.parent_id, p.position) for p in Page.objects.all()], [(root.pk, None, 10), (p2.pk, root.pk, 20), (p1.pk, None, 20)], )
def test_invalid_move(self): root, p1, p2 = self.prepare_for_move() client = self.login() response = client.post( reverse('admin:testapp_page_move', args=(root.pk, )), { 'move_to': 'first', 'of': p1.pk, }) self.assertContains( response, 'Select a valid choice. That choice is not one of the available choices.', # noqa )
def test_move_to_child(self): root, p1, p2 = self.prepare_for_move() client = self.login() client.post(reverse('admin:testapp_page_move', args=(p2.pk, )), { 'move_to': 'first', 'of': p1.pk, }) self.assertEqual([(p.pk, p.parent_id, p.position) for p in Page.objects.all()], [ (root.pk, None, 10), (p1.pk, root.pk, 10), (p2.pk, p1.pk, 10), ])
def test_move_to_child(self): root, p1, p2 = self.prepare_for_move() client = self.login() client.post( reverse("admin:testapp_page_move", args=(p2.pk, )), { "move_to": "first", "of": p1.pk }, ) self.assertEqual( [(p.pk, p.parent_id, p.position) for p in Page.objects.all()], [(root.pk, None, 10), (p1.pk, root.pk, 10), (p2.pk, p1.pk, 10)], )
def test_move_clean_and_save(self): """Test that a page move does the right thing (model state should be restored after clean() so that save() updates the MPTT attributes for real, without a ROLLBACK""" client = self.login() r1 = Page.objects.create( title='root 1', slug='root-1', ) r2 = Page.objects.create( title='root 2', slug='root-2', ) child = Page.objects.create( parent_id=r1.id, title='child', slug='child', ) ContentType.objects.clear_cache() # because of 13. below with self.assertNumQueries(15): # NOTE NOTE NOTE! # The exact count is not actually important. What IS important is # that the query count does not change without us having a chance # to inspect. # # 1. session # 2. AppsMiddleware / apps_urlconf # 3. request.user # 4. SAVEPOINT # 5. fetch child # 6. fetch root-2 # 7. exists() new parent (root-2) # 8. fetch descendants (why?) # 9. path uniqueness check of descendants with (/root-2/child/) # 10. path uniqueness of self # 11. page.save() # 12. fetch descendants for looping # 13. get page Django content type # 14. insert into admin log # 15. RELEASE SAVEPOINT response = client.post( reverse('admin:testapp_page_change', args=(child.id, )), merge_dicts( { 'title': 'child', 'slug': 'child', 'path': '/root-1/child/', 'static_path': '', 'language_code': 'en', 'application': '', 'is_active': 1, 'menu': 'main', 'template_key': 'standard', 'parent': r2.id, }, zero_management_form_data('testapp_richtext_set'), zero_management_form_data('testapp_image_set'), zero_management_form_data('testapp_snippet_set'), zero_management_form_data('testapp_external_set'), zero_management_form_data('testapp_html_set'), ), ) self.assertEqual(response.status_code, 302) self.assertEqual([( page.pk, page.parent_id, page.position, ) for page in Page.objects.all()], [ (r1.pk, None, 10), (r2.pk, None, 20), (child.pk, r2.pk, 10), ])