コード例 #1
0
 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/"),
     )
コード例 #2
0
 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/"),
     )
コード例 #3
0
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"
コード例 #4
0
    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))
コード例 #5
0
    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())
コード例 #6
0
    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")
コード例 #7
0
    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")
コード例 #8
0
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
コード例 #9
0
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"
コード例 #10
0
    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())
コード例 #11
0
    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))
コード例 #12
0
 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"
コード例 #13
0
 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)
コード例 #14
0
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)
コード例 #15
0
    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)
コード例 #16
0
    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"
        )
コード例 #17
0
 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)
コード例 #18
0
    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")
コード例 #19
0
    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)
コード例 #20
0
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
コード例 #21
0
    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)
コード例 #22
0
    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)
コード例 #23
0
    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)
コード例 #24
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())
コード例 #25
0
    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)
コード例 #26
0
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)
コード例 #27
0
    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,
            ),
        )
コード例 #28
0
    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",
        )
コード例 #29
0
    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")
コード例 #30
0
    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)