コード例 #1
0
    def test_publish_and_unpublish_non_baseline_recipe_only_to_capabilities_collection(
            self, rs_settings, rs_urls, requestsmock):
        ws_urls = rs_urls["workspace"]

        recipe = RecipeFactory()
        assert not recipe.uses_only_baseline_capabilities()

        # Expect calls only to the capabilities collection
        requestsmock.put(ws_urls["capabilities"]["record"].format(recipe.id),
                         json={"data": {}},
                         status_code=201)
        requestsmock.patch(ws_urls["capabilities"]["collection"],
                           json={"data": {}})

        remotesettings = exports.RemoteSettings()
        remotesettings.publish(recipe)

        requests = requestsmock.request_history
        assert len(requests) == 2
        # First it publishes the recipe
        assert requests[0].method == "PUT"
        assert requests[0].url == ws_urls["capabilities"]["record"].format(
            recipe.id)
        # and then approves the change
        assert requests[1].method == "PATCH"
        assert requests[1].url == rs_urls["workspace"]["capabilities"][
            "collection"]

        # reset request history
        requestsmock._adapter.request_history = []

        # Expect delete calls
        requestsmock.delete(ws_urls["capabilities"]["record"].format(
            recipe.id),
                            json={"data": {}})
        # Baseline is expected, just in case the recipe changed from baseline to not baseline
        requestsmock.delete(ws_urls["baseline"]["record"].format(recipe.id),
                            status_code=404)

        remotesettings.unpublish(recipe)

        requests = requestsmock.request_history
        assert len(requests) == 3
        # First it removes the recipe
        assert requests[0].method == "DELETE"
        assert requests[0].url == ws_urls["capabilities"]["record"].format(
            recipe.id)
        # Tries to delete from baseline, just in case
        assert requests[1].method == "DELETE"
        assert requests[1].url == ws_urls["baseline"]["record"].format(
            recipe.id)
        # and then approves the change only from capabilities
        assert requests[2].method == "PATCH"
        assert requests[2].url == rs_urls["workspace"]["capabilities"][
            "collection"]
コード例 #2
0
    def test_publish_reverts_changes_if_approval_fails(self, rs_urls,
                                                       rs_settings,
                                                       requestsmock):
        # This test forces the recipe to not use baseline capabilities to
        # simplify the test. This simplifies the test.
        recipe = RecipeFactory(name="Test", approver=UserFactory())
        assert not recipe.uses_only_baseline_capabilities()

        capabilities_record_url = rs_urls["workspace"]["capabilities"][
            "record"].format(recipe.id)
        # Creating the record works.
        requestsmock.request("put",
                             capabilities_record_url,
                             json={"data": {}},
                             status_code=201)
        requestsmock.register_uri(
            "patch",
            rs_urls["workspace"]["capabilities"]["collection"],
            [
                # Approving fails.
                {
                    "status_code": 403
                },
                # Rollback succeeds.
                {
                    "status_code": 200,
                    "json": {
                        "data": {}
                    }
                },
            ],
        )

        remotesettings = exports.RemoteSettings()
        with pytest.raises(kinto_http.KintoException):
            remotesettings.publish(recipe)

        requests = requestsmock.request_history
        assert len(requests) == 3
        # First it publishes a recipe
        assert requests[0].method == "PUT"
        assert requests[0].url == capabilities_record_url
        # and then tries to approve it, which fails.
        assert requests[1].method == "PATCH"
        assert requests[1].url == rs_urls["workspace"]["capabilities"][
            "collection"]
        # so it rollsback
        assert requests[2].method == "PATCH"
        assert requests[2].url == rs_urls["workspace"]["capabilities"][
            "collection"]
コード例 #3
0
    def test_publish_and_unpublish_baseline_recipe_to_both_collections(
            self, rs_settings, rs_urls, requestsmock):
        ws_urls = rs_urls["workspace"]

        recipe = RecipeFactory()
        rs_settings.BASELINE_CAPABILITIES |= recipe.capabilities
        assert recipe.uses_only_baseline_capabilities()

        # Expect publish calls to both collections
        requestsmock.put(ws_urls["baseline"]["record"].format(recipe.id),
                         json={"data": {}},
                         status_code=201)
        requestsmock.put(ws_urls["capabilities"]["record"].format(recipe.id),
                         json={"data": {}},
                         status_code=201)
        # Expect both workspaces to be approved
        requestsmock.patch(ws_urls["baseline"]["collection"],
                           json={"data": {}})
        requestsmock.patch(ws_urls["capabilities"]["collection"],
                           json={"data": {}})

        remotesettings = exports.RemoteSettings()
        remotesettings.publish(recipe)

        requests = requestsmock.request_history
        assert len(requests) == 4
        # First it publishes a recipe to both collections
        assert requests[0].method == "PUT"
        assert requests[0].url == ws_urls["capabilities"]["record"].format(
            recipe.id)
        assert requests[1].method == "PUT"
        assert requests[1].url == ws_urls["baseline"]["record"].format(
            recipe.id)
        # and then approves both changes
        assert requests[2].method == "PATCH"
        assert requests[2].url == rs_urls["workspace"]["capabilities"][
            "collection"]
        assert requests[3].method == "PATCH"
        assert requests[3].url == rs_urls["workspace"]["baseline"][
            "collection"]

        # reset request history
        requestsmock._adapter.request_history = []

        # Expect delete calls
        requestsmock.delete(ws_urls["baseline"]["record"].format(recipe.id),
                            json={"data": {}})
        requestsmock.delete(ws_urls["capabilities"]["record"].format(
            recipe.id),
                            json={"data": {}})

        remotesettings.unpublish(recipe)

        requests = requestsmock.request_history
        assert len(requests) == 4
        # First it removes the recipe from both collections
        assert requests[0].method == "DELETE"
        assert requests[0].url == ws_urls["capabilities"]["record"].format(
            recipe.id)
        assert requests[1].method == "DELETE"
        assert requests[1].url == ws_urls["baseline"]["record"].format(
            recipe.id)
        # and then approves both changes
        assert requests[2].method == "PATCH"
        assert requests[2].url == rs_urls["workspace"]["capabilities"][
            "collection"]
        assert requests[3].method == "PATCH"
        assert requests[3].url == rs_urls["workspace"]["baseline"][
            "collection"]