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"]
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"]
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"]