# Software Name: MOON # Version: 5.4 # SPDX-FileCopyrightText: Copyright (c) 2018-2020 Orange and its contributors # SPDX-License-Identifier: Apache-2.0 # This software is distributed under the 'Apache License 2.0', # the text of which is available at 'http://www.apache.org/licenses/LICENSE-2.0.txt' # or see the "LICENSE" file for more details. import json import hug import pytest from moon_utilities import exceptions from helpers import data_builder as builder from helpers import policy_helper from helpers import model_helper from uuid import uuid4 def get_models(): from moon_manager.api import models from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} req = hug.test.get(models, "/models", headers=auth_headers) models = req.data return req, models def add_models(name, headers, data=None, ): from moon_manager.api import models subject_category_id, object_category_id, action_category_id, meta_rule_id = \ builder.create_new_meta_rule() if not data: data = { "name": name, "description": "description of {}".format(name), "meta_rules": [meta_rule_id] } headers['Content-Type'] = 'application/json' req = hug.test.post(models, "/models", body=json.dumps(data), headers=headers) models = req.data return req, models def update_model(name, model_id, headers): from moon_manager.api import models subject_category_id, object_category_id, action_category_id, meta_rule_id = \ builder.create_new_meta_rule() data = { "name": name, "description": "description of {}".format(name), "meta_rules": [meta_rule_id] } headers['Content-Type'] = 'application/json' req = hug.test.patch(models, "/models/{}".format(model_id), body=json.dumps(data), headers=headers) if req.status == hug.HTTP_405: return req models = req.data return req, models def add_model_without_meta_rules_ids(name, headers): from moon_manager.api import models data = { "name": name, "description": "description of {}".format(name), "meta_rules": [] } headers['Content-Type'] = 'application/json' req = hug.test.post(models, "/models", body=json.dumps(data), headers=headers) models = req.data return req, models def add_model_with_empty_meta_rule_id(name, headers): from moon_manager.api import models data = { "name": name, "description": "description of {}".format(name), "meta_rules": [""] } headers['Content-Type'] = 'application/json' req = hug.test.post(models, "/models", body=json.dumps(data), headers=headers) models = req.data return req, models def update_model_without_meta_rules_ids(model_id, headers): from moon_manager.api import models name = "model_id" + uuid4().hex data = { "name": name, "description": "description of {}".format(name), "meta_rules": [] } headers['Content-Type'] = 'application/json' req = hug.test.patch(models, "/models/{}".format(model_id), body=json.dumps(data), headers=headers) models = req.data return req, models def delete_models(name, headers): request, models = get_models() for key, value in models['models'].items(): if value['name'] == name: from moon_manager.api import models req = hug.test.delete(models, "/models/{}".format(key), headers=headers) break return req def delete_models_without_id(headers): from moon_manager.api import models req = hug.test.delete(models, "/models/{}".format(""), headers=headers) return req def clean_models(headers): req, models = get_models() for key, value in models['models'].items(): print(key) print(value) from moon_manager.api import models hug.test.delete(models, "/models/{}".format(key), headers=headers) def test_delete_model_assigned_to_policy(): policy_name = "testuser" + uuid4().hex req = model_helper.add_model(model_id="mls_model_id" + uuid4().hex) model_id = list(req.keys())[0] data = { "name": policy_name, "description": "description of {}".format(policy_name), "model_id": model_id, "genre": "genre" } from moon_manager.api import policy from moon_manager.api import models from moon_utilities.auth_functions import get_api_key_for_user headers = {"X-Api-Key": get_api_key_for_user("admin"), 'Content-Type': 'application/json'} hug.test.post(policy, "/policies", body=json.dumps(data), headers=headers) with pytest.raises(exceptions.DeleteModelWithPolicy) as exception_info: req = hug.test.delete(models, "/models/{}".format(model_id), headers={"X-Api-Key": get_api_key_for_user("admin")}) assert "400: Model With Policy Error" == str(exception_info.value) # assert req.status == hug.HTTP_400 # assert req.data["message"] == '400: Model With Policy Error' def test_get_models(): req, models = get_models() assert req.status == hug.HTTP_200 assert isinstance(models, dict) assert "models" in models def test_add_models(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) req, models = add_models("testuser", auth_headers) assert req.status == hug.HTTP_200 assert isinstance(models, dict) model_id = list(models["models"])[0] assert "models" in models assert models['models'][model_id]['name'] == "testuser" assert models['models'][model_id]["description"] == "description of {}".format("testuser") def test_add_models_with_meta_rule_has_blank_subject(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) name = "testuser1" from moon_manager.api import models subject_category_id, object_category_id, action_category_id, meta_rule_id = \ builder.create_new_meta_rule(empty="subject") data = { "name": name, "description": "description of {}".format(name), "meta_rules": [meta_rule_id] } auth_headers['Content-Type'] = 'application/json' req = hug.test.post(models, "/models", body=json.dumps(data), headers=auth_headers) assert req.status == hug.HTTP_200 def test_add_models_with_meta_rule_has_blank_object(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) name = "testuser1" from moon_manager.api import models subject_category_id, object_category_id, action_category_id, meta_rule_id = \ builder.create_new_meta_rule(empty="object") data = { "name": name, "description": "description of {}".format(name), "meta_rules": [meta_rule_id] } auth_headers['Content-Type'] = 'application/json' req = hug.test.post(models, "/models", body=json.dumps(data), headers=auth_headers) assert req.status == hug.HTTP_200 def test_add_models_with_meta_rule_has_blank_action(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) name = "testuser1" from moon_manager.api import models subject_category_id, object_category_id, action_category_id, meta_rule_id = \ builder.create_new_meta_rule(empty="action") data = { "name": name, "description": "description of {}".format(name), "meta_rules": [meta_rule_id] } auth_headers['Content-Type'] = 'application/json' req = hug.test.post(models, "/models", body=json.dumps(data), headers=auth_headers) assert req.status == hug.HTTP_200 def test_delete_models(): name = uuid4().hex + "testuser" from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} add_models(name, auth_headers) req = delete_models(name, headers=auth_headers) assert req.status == hug.HTTP_200 def test_update_models_with_assigned_policy(): from moon_manager.api import models model = model_helper.add_model(model_id="mls_model_id" + uuid4().hex) model_id = list(model.keys())[0] value = { "name": "test_policy" + uuid4().hex, "model_id": model_id, "description": "test", } policy_helper.add_policies(value=value) data = { "name": "model_" + uuid4().hex, "description": "description of model_2", "meta_rules": [] } from moon_utilities.auth_functions import get_api_key_for_user headers = {"X-Api-Key": get_api_key_for_user("admin"), 'Content-Type': 'application/json'} with pytest.raises(exceptions.DeleteModelWithPolicy) as exception_info: req = hug.test.patch(models, "/models/{}".format(model_id), body=json.dumps(data), headers=headers) assert "400: Model With Policy Error" == str(exception_info.value) # assert req.status == hug.HTTP_400 # assert req.data["message"] == "400: Model With Policy Error" def test_update_models_with_no_assigned_policy(): from moon_manager.api import models model = model_helper.add_model(model_id="mls_model_id" + uuid4().hex) model_id = list(model.keys())[0] data = { "name": "model_" + uuid4().hex, "description": "description of model_2", "meta_rules": [] } from moon_utilities.auth_functions import get_api_key_for_user headers = {"X-Api-Key": get_api_key_for_user("admin"), 'Content-Type': 'application/json'} req = hug.test.patch(models, "/models/{}".format(model_id), body=json.dumps(data), headers=headers) assert req.status == hug.HTTP_200 def test_update_models_without_meta_rule_key(): from moon_manager.api import models model = model_helper.add_model(model_id="mls_model_id" + uuid4().hex) model_id = list(model.keys())[0] data = { "name": "model_" + uuid4().hex, "description": "description of model_2", } from moon_utilities.auth_functions import get_api_key_for_user headers = {"X-Api-Key": get_api_key_for_user("admin"), 'Content-Type': 'application/json'} with pytest.raises(exceptions.MetaRuleUnknown) as exception_info: req = hug.test.patch(models, "/models/{}".format(model_id), body=json.dumps(data), headers=headers) assert "400: Meta Rule Unknown" == str(exception_info.value) # assert req.status == hug.HTTP_400 # assert req.data["message"] == "400: Meta Rule Unknown" def test_delete_models_without_id(): from moon_utilities.auth_functions import get_api_key_for_user headers = {"X-Api-Key": get_api_key_for_user("admin")} req = delete_models_without_id(headers=headers) assert req.status == hug.HTTP_405 def test_add_model_with_empty_name(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) with pytest.raises(exceptions.ValidationContentError) as exception_info: req, models = add_models("
", headers=auth_headers) assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value) # assert req.status == hug.HTTP_400 # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]" def test_add_model_with_name_contain_space(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) with pytest.raises(exceptions.ValidationContentError) as exception_info: req, models = add_models("test
user", headers=auth_headers) assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value) # assert req.status == hug.HTTP_400 # assert req.data["message"] == "Key: 'name', [Forbidden characters in string]" def test_add_model_with_name_space(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) with pytest.raises(exceptions.ModelContentError) as exception_info: req, models = add_models(" ", headers=auth_headers) assert "400: Model Unknown" == str(exception_info.value) # assert req.status == hug.HTTP_400 # assert req.data["message"] == '400: Model Unknown' def test_add_model_with_empty_meta_rule_id(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) with pytest.raises(exceptions.MetaRuleUnknown) as exception_info: req, meta_rules = add_model_with_empty_meta_rule_id("testuser", headers=auth_headers) assert "400: Meta Rule Unknown" == str(exception_info.value) # assert req.status == hug.HTTP_400 # assert req.data["message"] == '400: Meta Rule Unknown' def test_add_model_with_existed_name(): name = uuid4().hex from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) req, models = add_models(name, headers=auth_headers) assert req.status == hug.HTTP_200 with pytest.raises(exceptions.ModelExisting) as exception_info: req, models = add_models(name, headers=auth_headers) assert "409: Model Error" == str(exception_info.value) # assert req.status == hug.HTTP_409 # assert req.data["message"] == '409: Model Error' def test_add_model_with_existed_meta_rules_list(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) name = uuid4().hex subject_category_id, object_category_id, action_category_id, meta_rule_id = \ builder.create_new_meta_rule() data = { "name": name, "description": "description of {}".format(name), "meta_rules": [meta_rule_id] } name = uuid4().hex req, models = add_models(name=name, headers=auth_headers, data=data) assert req.status == hug.HTTP_200 data = { "name": name, "description": "description of {}".format(name), "meta_rules": [meta_rule_id] } with pytest.raises(exceptions.ModelExisting) as exception_info: req, models = add_models(name=name, headers=auth_headers, data=data) assert "409: Model Error" == str(exception_info.value) # assert req.status == hug.HTTP_409 # assert req.data["message"] == '409: Model Error' def test_add_model_without_meta_rules(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) req, meta_rules = add_model_without_meta_rules_ids("testuser", headers=auth_headers) assert req.status == hug.HTTP_200 def test_update_model(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) req = add_models("testuser", headers=auth_headers) model_id = list(req[1]['models'])[0] req_update = update_model("testuser", model_id, headers=auth_headers) assert req_update[0].status == hug.HTTP_200 model_id = list(req_update[1]["models"])[0] assert req_update[1]["models"][model_id]["meta_rules"][0] is not None delete_models("testuser", headers=auth_headers) def test_update_model_name_with_space(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) req = add_models("testuser", headers=auth_headers) model_id = list(req[1]['models'])[0] with pytest.raises(exceptions.ModelContentError) as exception_info: req_update = update_model(" ", model_id, headers=auth_headers) assert "400: Model Unknown" == str(exception_info.value) # assert req_update[0].status == hug.HTTP_400 # assert req_update[1]["message"] == '400: Model Unknown' def test_update_model_with_empty_name(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) req = add_models("testuser", headers=auth_headers) model_id = list(req[1]['models'])[0] from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} with pytest.raises(exceptions.ModelContentError) as exception_info: req_update = update_model("", model_id, headers=auth_headers) assert "400: Model Unknown" == str(exception_info.value) # assert req_update[0].status == hug.HTTP_400 # assert req_update[1]['message'] == '400: Model Unknown' def test_update_meta_rules_without_id(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} clean_models(headers=auth_headers) req_update = update_model("testuser", "", headers=auth_headers) assert req_update.status == hug.HTTP_405 def test_update_meta_rules_without_name(): from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} with pytest.raises(exceptions.ValidationContentError) as exception_info: req_update = update_model("", "1234567", headers=auth_headers) assert "Key: 'name', [Forbidden characters in string]" == str(exception_info.value) # assert req_update[0].status == hug.HTTP_400 # assert req_update[0].data["message"] == "Key: 'name', [Forbidden characters in string]" def test_update_meta_rules_without_meta_rules(): value = { "name": "mls_model_id" + uuid4().hex, "description": "test", "meta_rules": [] } model = model_helper.add_model(value=value) model_id = list(model.keys())[0] from moon_utilities.auth_functions import get_api_key_for_user auth_headers = {"X-Api-Key": get_api_key_for_user("admin")} req_update = update_model_without_meta_rules_ids(model_id, headers=auth_headers) assert req_update[0].status == hug.HTTP_200