def test_navigation_entry_handles_other_components(self): user = user_with_perms(["testapp.view_sighting"]) self.assertEqual( navigation_component_entry(SightingViewSet().links["other_list"], user=user), ("Another list is possible", "/sighting/other/"), )
def test_navigation_entry_uses_model_name_as_list_label(self): user = user_with_perms(["testapp.view_dragonfly"]) self.assertEqual( navigation_component_entry(DragonflyViewSet().links["list"], user=user), ("dragonflys", "/dragonfly/"), )
def test_using_update_view_creates_a_revision(django_user_model): user = user_with_perms(django_user_model, ["testapp.change_dragonfly"]) alpha = Dragonfly.objects.create(name="alpha", age=47) update_view = VersionedDragonflyViewSet()._get_view( VersionedDragonflyViewSet().components["update"] ) request = RequestFactory().post( "/dragonfly/update/{}/".format(alpha.pk), data={ "name": "beta", "age": 81, "sighting_set-TOTAL_FORMS": 0, "sighting_set-INITIAL_FORMS": 0, "sighting_set-MIN_NUM_FORMS": 0, "sighting_set-MAX_NUM_FORMS": 10, }, ) request.user = user response = update_view(request, pk=alpha.pk) assert response.status_code == 302 fly_version = Version.objects.get_for_object_reference(Dragonfly, alpha.pk).latest( "revision__created_date" ) assert fly_version.object.name == "beta" assert fly_version.field_dict["name"] == "beta" assert fly_version.revision.user == user assert fly_version.revision.comment == "update"
def test_check_string_permission(self): user = user_with_perms(["testapp.change_dragonfly"]) self.assertTrue( check_permission("testapp.change_dragonfly", user=user, obj=user)) self.assertFalse( check_permission("testapp.view_dragonfly", user=user, obj=user))
def test_no_interaction_with_multiple_inlines(self): self.dragonfly.sighting_set.create(name="interaction-test-sighting", pk=999) self.dragonfly.protectedsighting_set.create( name="interaction-test-protected-sighting", pk=999 ) detail_page = self.app.get( DragonflyViewSet().links["detail"].reverse(self.dragonfly), user=user_with_perms( [ "testapp.view_dragonfly", "testapp.delete_sighting", "testapp.delete_protectedsighting", ] ), ) self.assertTrue(Sighting.objects.filter(pk=999).exists()) self.assertTrue(ProtectedSighting.objects.filter(pk=999).exists()) sighting_form = detail_page.forms["sighting_set-action-form"] sighting_form["_action_choice"] = "sighting_set-0-delete" sighting_form["_action_select[]"] = [999] sighting_response = sighting_form.submit().follow() self.assertContains(sighting_response, "Deleted 1 sighting") self.assertFalse(Sighting.objects.filter(pk=999).exists()) self.assertTrue(ProtectedSighting.objects.filter(pk=999).exists()) protected_sighting_form = detail_page.forms["protectedsighting_set-action-form"] protected_sighting_form["_action_choice"] = "protectedsighting_set-0-delete" protected_sighting_form["_action_select[]"] = ["999"] protected_sighting_response = protected_sighting_form.submit().follow() self.assertContains(protected_sighting_response, "Deleted 1 protected sighting") self.assertFalse(Sighting.objects.filter(pk=999).exists()) self.assertFalse(ProtectedSighting.objects.filter(pk=999).exists())
def test_using_update_view_creates_a_revision(self): user = user_with_perms(["testapp.change_dragonfly"]) alpha = Dragonfly.objects.create(name="alpha", age=47) update_view = VersionedDragonflyViewSet()._get_view( VersionedDragonflyViewSet().components["update"]) request = RequestFactory().post( "/dragonfly/update/{}/".format(alpha.pk), data={ "name": "beta", "age": 81, "sighting_set-TOTAL_FORMS": 0, "sighting_set-INITIAL_FORMS": 0, "sighting_set-MIN_NUM_FORMS": 0, "sighting_set-MAX_NUM_FORMS": 10, }, ) request.user = user middleware = SessionMiddleware() middleware.process_request(request) messages = FallbackStorage(request) setattr(request, "_messages", messages) response = update_view(request, pk=alpha.pk) self.assertEqual(response.status_code, 302) fly_version = Version.objects.get_for_object_reference( Dragonfly, alpha.pk).latest("revision__created_date") self.assertEqual(fly_version.object.name, "beta") self.assertEqual(fly_version.field_dict["name"], "beta") self.assertEqual(fly_version.revision.user, user) self.assertEqual(fly_version.revision.comment, "update")
def test_revision_is_visible_in_list(self): alpha = Dragonfly.objects.create(name="alpha", age=47) request = RequestFactory().get("/", {}) request.user = user_with_perms(["testapp.view_dragonfly"]) with VersionedDragonflyViewSet().create_revision(request): set_comment("number one") alpha.save() with VersionedDragonflyViewSet().create_revision(request): set_comment("number two") alpha.save() with VersionedDragonflyViewSet().create_revision(request): set_comment("number three") alpha.save() self.assertEqual( Version.objects.get_for_object_reference(Dragonfly, alpha.pk).count(), 3) view = VersionedDragonflyViewSet()._get_view( VersionedDragonflyViewSet().components["version_list"]) response = view(request, pk=alpha.pk) self.assertContains(response, "number one") self.assertContains(response, "number two") self.assertContains(response, "number three")
def test_revision_is_visible_in_list(django_user_model): alpha = Dragonfly.objects.create(name="alpha", age=47) request = RequestFactory().get("/", {}) request.user = user_with_perms(django_user_model, ["testapp.view_dragonfly"]) with VersionedDragonflyViewSet().create_revision(request): set_comment("number one") alpha.save() with VersionedDragonflyViewSet().create_revision(request): set_comment("number two") alpha.save() with VersionedDragonflyViewSet().create_revision(request): set_comment("number three") alpha.save() assert Version.objects.get_for_object_reference(Dragonfly, alpha.pk).count() == 3 view = VersionedDragonflyViewSet()._get_view( VersionedDragonflyViewSet().components["version_list"] ) response = view(request, pk=alpha.pk) response_content = response.rendered_content assert "number one" in response_content assert "number two" in response_content assert "number three" in response_content
def test_revert_to_previous_version(django_user_model): alpha = Dragonfly.objects.create(name="alpha", age=47) sighting = Sighting.objects.create(name="Berlin", dragonfly=alpha) request = RequestFactory().post("/", {}) request.user = user_with_perms(django_user_model, ["testapp.change_dragonfly"]) SessionMiddleware().process_request(request) MessageMiddleware().process_request(request) with VersionedDragonflyViewSet().create_revision(request): alpha.save() version = Version.objects.get_for_object_reference(Dragonfly, alpha.pk).latest( "revision__created_date" ) alpha.name = "beta" alpha.save() sighting.name = "Tokyo" sighting.save() version_view = VersionedDragonflyViewSet()._get_view( VersionedDragonflyViewSet().components["version_restore"] ) response = version_view(request, pk=alpha.pk, version_id=version.pk) assert response.status_code == 302 alpha.refresh_from_db() sighting.refresh_from_db() assert alpha.name == "alpha" assert sighting.name == "Berlin"
def test_filter_interaction(self): user = user_with_perms(["testapp.view_dragonfly", "testapp.delete_sighting"],) detail_page = self.app.get( DragonflyViewSet().links["detail"].reverse(self.dragonfly), user=user, ) self.assertContains(detail_page, "regular-sighting-0") self.assertContains(detail_page, "regular-sighting-1") filter_form = detail_page.forms["sighting_set-filter-form"] filter_form["sighting_set-filter-name"] = "regular-sighting-0" filtered_page = filter_form.submit() self.assertContains(filtered_page, "regular-sighting-0") self.assertNotContains(filtered_page, "regular-sighting-1") action_form = filtered_page.forms["sighting_set-action-form"] action_form["_action_choice"] = "sighting_set-0-delete" action_form["_action_select_across"] = "all" action_response = action_form.submit().follow() self.assertContains(action_response, "Deleted 1 sighting") self.assertFalse(Sighting.objects.filter(name="regular-sighting-0").exists()) self.assertTrue(Sighting.objects.filter(name="regular-sighting-1").exists())
def test_check_callable_permission(self): user = user_with_perms([]) def check(user, obj=None): return user == obj self.assertTrue(check_permission(check, user=user, obj=user)) self.assertFalse(check_permission(check, user=user, obj=None))
def test_no_permission_hides_action_from_menu(self): list_page = self.app.get( DragonflyViewSet().links["list"].reverse(), user=user_with_perms( ["testapp.view_dragonfly", "testapp.change_dragonfly",] ), ) form = list_page.forms["list-action-form"] with self.assertRaises(ValueError): form["_action_choice"] = "0-delete"
def test_navigation_entry_respects_permissions(self): user = user_with_perms(["testapp.view_dragonfly"]) self.assertEqual( navigation_component_entry(DragonflyViewSet().links["list"], user=user), ("dragonflys", "/dragonfly/"), ) self.assertEqual( navigation_component_entry(SightingViewSet().links["list"], user=user), None)
def test_autocomplete_requires_permission(django_user_model): alpha = Dragonfly.objects.create(name="alpha", age=47) request = RequestFactory().get("/", {}) request.user = user_with_perms(django_user_model, []) view = AutocompleteDragonflyViewSet()._get_view( AutocompleteDragonflyViewSet().components["autocomplete"]) with pytest.raises(PermissionDenied): response = view(request)
def test_autocomplete_requires_permission(self): Dragonfly.objects.create(name="alpha", age=47) request = RequestFactory().get("/", {}) request.user = user_with_perms([]) view = AutocompleteDragonflyViewSet()._get_view( AutocompleteDragonflyViewSet().components["autocomplete"]) with self.assertRaises(PermissionDenied): view(request)
def test_action_shown_only_where_permission(self): detail_page = self.app.get( DragonflyViewSet().links["detail"].reverse(self.dragonfly), user=user_with_perms( [ "testapp.view_dragonfly", "testapp.delete_sighting", "testapp.delete_protectedsighting", ], username="******", ), ) self.assertContains(detail_page, "sighting_set-0-delete") self.assertContains(detail_page, "protectedsighting_set-0-delete") detail_page_only_sighting = self.app.get( DragonflyViewSet().links["detail"].reverse(self.dragonfly), user=user_with_perms( ["testapp.view_dragonfly", "testapp.delete_sighting",], username="******", ), ) self.assertContains(detail_page_only_sighting, "sighting_set-0-delete") self.assertNotContains( detail_page_only_sighting, "protectedsighting_set-0-delete" ) detail_page_only_protected_sighting = self.app.get( DragonflyViewSet().links["detail"].reverse(self.dragonfly), user=user_with_perms( ["testapp.view_dragonfly", "testapp.delete_protectedsighting",], username="******", ), ) self.assertContains( detail_page_only_protected_sighting, "sighting_set-0-delete" ) self.assertContains( detail_page_only_protected_sighting, "protectedsighting_set-0-delete" )
def test_no_list_items_selected_does_nothing(self): list_page = self.app.get( DragonflyViewSet().links["list"].reverse(), user=user_with_perms( ["testapp.view_dragonfly", "testapp.delete_dragonfly",] ), ) form = list_page.forms["list-action-form"] form["_action_choice"] = "0-delete" response = form.submit().follow() self.assertContains(response, "alpha") self.assertContains(response, "omega") self.assertEqual(Dragonfly.objects.count(), 2)
def test_autocomplete_search(self): request = RequestFactory().get("/", {"q": "Al"}) request.user = user_with_perms(["testapp.view_dragonfly"]) Dragonfly.objects.create(name="alpha", age=12) Dragonfly.objects.create(name="omega", age=99) view = AutocompleteDragonflyViewSet()._get_view( AutocompleteDragonflyViewSet().components["autocomplete"]) response = view(request) self.assertContains(response, "alpha") self.assertNotContains(response, "omega")
def test_version_list_requires_view_permission(self): alpha = Dragonfly.objects.create(name="alpha", age=47) request = RequestFactory().get("/", {}) request.user = user_with_perms([]) with VersionedDragonflyViewSet().create_revision(request): set_comment("number one") alpha.save() view = VersionedDragonflyViewSet()._get_view( VersionedDragonflyViewSet().components["version_list"]) with self.assertRaises(PermissionDenied): view(request, pk=alpha.pk)
def test_autocomplete_search(django_user_model): request = RequestFactory().get("/", {"q": "Al"}) request.user = user_with_perms(django_user_model, ["testapp.view_dragonfly"]) Dragonfly.objects.create(name="alpha", age=12) Dragonfly.objects.create(name="omega", age=99) view = AutocompleteDragonflyViewSet()._get_view( AutocompleteDragonflyViewSet().components["autocomplete"]) response = view(request) assert b"alpha" in response.content assert b"omega" not in response.content
def test_version_detail_requires_view_perm(self): alpha = Dragonfly.objects.create(name="alpha", age=47) Sighting.objects.create(name="Berlin", dragonfly=alpha) request = RequestFactory().get("/", {}) request.user = user_with_perms([]) with VersionedDragonflyViewSet().create_revision(request): alpha.save() Version.objects.get_for_object_reference( Dragonfly, alpha.pk).latest("revision__created_date") detail_view = VersionedDragonflyViewSet()._get_view( VersionedDragonflyViewSet().components["detail"]) with self.assertRaises(PermissionDenied): detail_view(request, pk=alpha.pk)
def test_action_with_selection(self): detail_page = self.app.get( DragonflyViewSet().links["detail"].reverse(self.dragonfly), user=user_with_perms( ["testapp.view_dragonfly", "testapp.delete_sighting",] ), ) form = detail_page.forms["sighting_set-action-form"] form["_action_choice"] = "sighting_set-0-delete" form["_action_select[]"] = [Sighting.objects.get(name="regular-sighting-0").pk] response = form.submit().follow() self.assertContains(response, "Deleted 1 sighting") self.assertNotContains(response, "regular-sighting-0") self.assertContains(response, "regular-sighting-1") self.assertEqual(Sighting.objects.count(), 1)
def test_selection_across_page_boundary(self): list_page = self.app.get( DragonflyViewSet().links["list"].reverse(), user=user_with_perms( ["testapp.view_dragonfly", "testapp.delete_dragonfly",] ), ) form = list_page.forms["list-action-form"] form["_action_choice"] = "0-delete" form["_action_select_across"] = "all" response = form.submit().follow() self.assertNotContains(response, "alpha") self.assertNotContains(response, "omega") self.assertEqual(Dragonfly.objects.count(), 0)
def test_search_interaction(self): list_page = self.app.get( DragonflyViewSet().links["list"].reverse() + "?q=omega", user=user_with_perms( ["testapp.view_dragonfly", "testapp.delete_dragonfly",] ), ) form = list_page.forms["list-action-form"] form["_action_choice"] = "0-delete" form["_action_select_across"] = "all" response = form.submit().follow() self.assertContains(response, "Deleted 1 dragonflys") self.assertTrue(Dragonfly.objects.filter(name="alpha").exists()) self.assertFalse(Dragonfly.objects.filter(name="omega").exists())
def test_no_permission_prevents_action(self): list_page = self.app.get( DragonflyViewSet().links["list"].reverse(), user=user_with_perms( ["testapp.view_dragonfly", "testapp.change_dragonfly",] ), ) form = list_page.forms["list-action-form"] form["_action_choice"].force_value("0-delete") form["_action_select_across"] = "all" response = form.submit() self.assertContains(response, "alpha") self.assertContains(response, "omega") self.assertEqual(Dragonfly.objects.count(), 2)
def test_revert_to_previous_version_requires_change_perm(django_user_model): alpha = Dragonfly.objects.create(name="alpha", age=47) sighting = Sighting.objects.create(name="Berlin", dragonfly=alpha) request = RequestFactory().post("/", {}) request.user = user_with_perms(django_user_model, []) with VersionedDragonflyViewSet().create_revision(request): alpha.save() version = Version.objects.get_for_object_reference(Dragonfly, alpha.pk).latest( "revision__created_date" ) version_view = VersionedDragonflyViewSet()._get_view( VersionedDragonflyViewSet().components["version_restore"] ) with pytest.raises(PermissionDenied): response = version_view(request, pk=alpha.pk, version_id=version.pk)
def test_http_response_from_action(self): user = user_with_perms(["testapp.view_dragonfly", "testapp.view_sighting"],) detail_page = self.app.get( DragonflyViewSet().links["detail"].reverse(self.dragonfly), user=user, ) form = detail_page.forms["sighting_set-action-form"] form["_action_choice"] = "sighting_set-2-csv_export" form["_action_select_across"] = "all" response = form.submit() self.assertEqual( response.content.decode("utf-8"), "{},regular-sighting-0\r\n" "{},regular-sighting-1\r\n".format( Sighting.objects.get(name="regular-sighting-0").pk, Sighting.objects.get(name="regular-sighting-1").pk, ), )
def test_invalid_form_shows_error_and_preserves_action_choice(self): list_page = self.app.get( DragonflyViewSet().links["list"].reverse(), user=user_with_perms( ["testapp.view_dragonfly", "testapp.change_dragonfly",] ), ) form = list_page.forms["list-action-form"] form["_action_choice"] = "1-update_selected" form["_action_select[]"] = [self.alpha.pk] form["1-update_selected-age"] = "not_a_number" response = form.submit() self.assertContains(response, "Enter a whole number") self.assertEqual( response.forms["list-action-form"]["_action_choice"].value, "1-update_selected", )
def test_using_create_view_creates_a_revision(self): user = user_with_perms(["testapp.add_dragonfly"]) create_view = VersionedDragonflyViewSet()._get_view( VersionedDragonflyViewSet().components["create"]) request = RequestFactory().post( "/dragonfly/create/", data={ "name": "versionfly", "age": 81, "sighting_set-TOTAL_FORMS": 1, "sighting_set-INITIAL_FORMS": 0, "sighting_set-MIN_NUM_FORMS": 0, "sighting_set-MAX_NUM_FORMS": 10, "sighting_set-0-name": "Tokyo", }, ) request.user = user middleware = SessionMiddleware() middleware.process_request(request) messages = FallbackStorage(request) setattr(request, "_messages", messages) response = create_view(request) self.assertEqual(response.status_code, 302) fly = Dragonfly.objects.get() fly_version = Version.objects.get_for_object_reference( Dragonfly, fly.pk).get() self.assertEqual(fly_version.object.name, "versionfly") self.assertEqual(fly_version.field_dict["name"], "versionfly") self.assertEqual(fly_version.revision.user, user) self.assertEqual(fly_version.revision.comment, "create") sighting_version = Version.objects.get_for_object_reference( Sighting, fly.sighting_set.get().pk).get() self.assertEqual(sighting_version.field_dict["name"], "Tokyo")
def test_mass_update_form(self): detail_page = self.app.get( DragonflyViewSet().links["detail"].reverse(self.dragonfly), user=user_with_perms( [ "testapp.view_dragonfly", "testapp.delete_sighting", "testapp.change_sighting", ] ), ) form = detail_page.forms["sighting_set-action-form"] form["_action_choice"] = "sighting_set-1-update_selected" form["_action_select_across"] = "all" form["sighting_set-1-update_selected-name"] = "a new name" response = form.submit().follow() self.assertNotContains(response, "regular-sighting-0") self.assertEqual(Sighting.objects.filter(name="a new name").count(), 2) self.assertEqual(Sighting.objects.exclude(name="a new name").count(), 0)