def _get_import_data(model1, model2, unmap): """Returns data for csv import of the respective objects""" name1 = model1.__name__ name2 = model2.__name__ title1 = utils.title_from_camelcase(name1) with factories.single_commit(): with mock.patch('ggrc.models.relationship.is_external_app_user', return_value=True): obj1 = factories.get_model_factory(name1)() obj2 = factories.get_model_factory(name2)() if unmap: factories.RelationshipFactory(source=obj1, destination=obj2, is_external=True) slug1 = obj1.slug slug2 = obj2.slug data_block = [ collections.OrderedDict([ ("object_type", name1), ("Code*", slug1), ]), collections.OrderedDict([ ("object_type", name2), ("Code*", slug2), ("{}:{}".format("unmap" if unmap else "map", title1), slug1), ]), ] return data_block
def test_system_unmap_on_update(self, readonly, rel_obj_type): """Test unmapping on update System with readonly={0}""" rel_factory = factories.get_model_factory(rel_obj_type) with factories.single_commit(): obj = factories.SystemFactory(title='a', readonly=readonly) obj_id = obj.id rel_obj = rel_factory() rel_obj_id = rel_obj.id factories.RelationshipFactory(source=obj, destination=rel_obj) data = OrderedDict([ ("object_type", "System"), ("Code*", obj.slug), ("unmap:{}".format(rel_obj_type), rel_obj.slug), ]) response = self.import_data(data) self._check_csv_response(response, {}) obj = get_model("System").query.get(obj_id) rel_obj = get_model(rel_obj_type).query.get(rel_obj_id) rel = all_models.Relationship.find_related(obj, rel_obj) self.assertIsNone(rel)
def test_system_map_on_post(self, readonly, rel_obj_type): """Test mapping on post System with readonly={0}""" rel_factory = factories.get_model_factory(rel_obj_type) with factories.single_commit(): rel_obj = rel_factory() rel_obj_id = rel_obj.id data = OrderedDict([ ("object_type", "System"), ("Code*", "CODE"), ("Admin", "*****@*****.**"), ("Assignee", "*****@*****.**"), ("Verifier", "*****@*****.**"), ("Title", "b"), ("Read-only", readonly), ("map:{}".format(rel_obj_type), rel_obj.slug), ]) response = self.import_data(data) self._check_csv_response(response, {}) obj = get_model("System").query.filter_by(slug="CODE").one() rel_ids = list(o.id for o in obj.related_objects([rel_obj_type])) self.assertIn(rel_obj_id, rel_ids)
def test_403_if_delete_readonly_without_perms(self, obj_type): """Test {0} with readonly=True DELETE returns 401 This test ensures that user without permission for the object cannot obtain value for flag readonly """ role_obj = all_models.Role.query.filter( all_models.Role.name == "Creator").one() factory = factories.get_model_factory(obj_type) with factories.single_commit(): # create Global Creator person = factories.PersonFactory() person_id = person.id rbac_factories.UserRoleFactory(role=role_obj, person=person) # Create object obj = factory(title='a', readonly=True) obj_id = obj.id self.object_generator.api.set_user( all_models.Person.query.get(person_id)) obj = get_model(obj_type).query.get(obj_id) resp = self.object_generator.api.delete(obj) self.assert403(resp) obj = get_model(obj_type).query.get(obj_id) self.assertIsNotNone(obj)
def test_system_map_on_post(self, readonly, rel_obj_type): """Test mapping on post System with readonly={0}""" rel_factory = factories.get_model_factory(rel_obj_type) with factories.single_commit(): rel_obj = rel_factory() rel_obj_id = rel_obj.id data = OrderedDict([ ("object_type", "System"), ("Code*", ""), ("Admin", "*****@*****.**"), ("Assignee", "*****@*****.**"), ("Verifier", "*****@*****.**"), ("Title", "b"), ("Read-only", readonly), ("map:{}".format(rel_obj_type), rel_obj.slug), ]) response = self.import_data(data) self._check_csv_response(response, {}) obj = get_model("System").query.filter_by(title="b").one() rel_ids = list(o.id for o in obj.related_objects([rel_obj_type])) self.assertIn(rel_obj_id, rel_ids)
def test_403_if_delete_readonly_without_perms(self, obj_type): """Test {0} with readonly=True DELETE returns 401 This test ensures that user without permission for the object cannot obtain value for flag readonly """ role_obj = all_models.Role.query.filter( all_models.Role.name == "Creator").one() factory = factories.get_model_factory(obj_type) with factories.single_commit(): # create Global Creator person = factories.PersonFactory() person_id = person.id rbac_factories.UserRoleFactory(role=role_obj, person=person) # Create object obj = factory(title='a', readonly=True) obj_id = obj.id self.object_generator.api.set_user(all_models.Person.query.get(person_id)) obj = get_model(obj_type).query.get(obj_id) resp = self.object_generator.api.delete(obj) self.assert403(resp) obj = get_model(obj_type).query.get(obj_id) self.assertIsNotNone(obj)
def test_relationship_post(self, obj_type, readonly, rel_obj_type, swap, expected_code): """Test PUT relationship {0}.readonly={1}, related object type {2}""" factory = factories.get_model_factory(obj_type) rel_factory = factories.get_model_factory(rel_obj_type) with factories.single_commit(): obj = factory(title='a', readonly=readonly) rel_obj = rel_factory() if swap: source, destination = rel_obj, obj else: source, destination = obj, rel_obj resp, _ = self.object_generator.generate_relationship( source=source, destination=destination) self.assertStatus(resp, expected_code)
def test_relationship_post(self, obj_type, readonly, rel_obj_type, swap, expected_code): """Test PUT relationship {0}.readonly={1}, related object type {2}""" factory = factories.get_model_factory(obj_type) rel_factory = factories.get_model_factory(rel_obj_type) with factories.single_commit(): obj = factory(title='a', readonly=readonly) rel_obj = rel_factory() if swap: source, destination = rel_obj, obj else: source, destination = obj, rel_obj resp, _ = self.object_generator.generate_relationship( source=source, destination=destination ) self.assertStatus(resp, expected_code)
def test_unmap_objects(self, model1, model2): """Test deprecated unmapping between {0.__name__} and {1.__name__} """ name1 = model1.__name__ name2 = model2.__name__ title1 = title_from_camelcase(name1) with factories.single_commit(): with mock.patch('ggrc.models.relationship.is_external_app_user', return_value=True): obj1 = factories.get_model_factory(name1)() obj2 = factories.get_model_factory(name2)() factories.RelationshipFactory(source=obj1, destination=obj2, is_external=True) slug1 = obj1.slug slug2 = obj2.slug data_block = [ OrderedDict([ ("object_type", name1), ("Code*", slug1), ]), OrderedDict([ ("object_type", name2), ("Code*", slug2), ("unmap:{}".format(title1), slug1), ]), ] response = self.import_data(*data_block) # Check that mapping is not added self.assertEqual(len(response[1]['row_warnings']), 1) self.assertIn( u'Line 7: You do not have the necessary permissions to unmap', response[1]['row_warnings'][0])
def _create_model(obj_type, cad_map, cavs): """Create model and assign CAVs""" with factories.single_commit(): obj = factories.get_model_factory(obj_type)() for name, value in cavs.iteritems(): cad = get_model('CustomAttributeDefinition').query.get(cad_map[name]) factories.CustomAttributeValueFactory( custom_attribute=cad, attributable=obj, attribute_value=value, ) return obj.id
def test_delete(self, obj_type, readonly, exp_code, exp_deleted): """Test {0} DELETE if readonly={1}""" factory = factories.get_model_factory(obj_type) with factories.single_commit(): obj = factory(title='a', readonly=readonly) obj_id = obj.id resp = self.object_generator.api.delete(obj) self.assertStatus(resp, exp_code) obj = get_model(obj_type).query.get(obj_id) if exp_deleted: self.assertIsNone(obj) else: self.assertIsNotNone(obj)
def test_put(self, obj_type, current, new, exp_code): """Test {0} PUT readonly={2} for current readonly={1}""" factory = factories.get_model_factory(obj_type) with factories.single_commit(): obj = factory(title='a', readonly=current) obj_id = obj.id data = {'title': 'b'} if new is not _NOT_SPECIFIED: data['readonly'] = new resp = self.object_generator.api.put(obj, data) self.assertStatus(resp, exp_code) obj = get_model(obj_type).query.get(obj_id) self.assertEqual(obj.readonly, current)
def test_readonly_add_folder_with_global_role(self, obj_type, role_name, expected_status): """Test add_folder read-only {0} by user with global role {1}""" role_obj = all_models.Role.query.filter( all_models.Role.name == role_name).one() factory = factories.get_model_factory(obj_type) with factories.single_commit(): obj_id = factory(folder="a", readonly=True).id person = factories.PersonFactory() rbac_factories.UserRoleFactory(role=role_obj, person=person) person_id = person.id self.api.set_user(all_models.Person.query.get(person_id)) response = self.api.client.post( self.PATH_ADD_FOLDER, content_type="application/json", data=self._get_request_data(obj_type, obj_id, folder="b")) self.assertStatus(response, expected_status) obj = get_model(obj_type).query.get(obj_id) self.assertEqual(obj.folder, "a")
def test_readonly_remove_folder_with_global_role(self, obj_type, role_name, expected_status): """Test remove_folder read-only {0} by user with global role {1}""" role_obj = all_models.Role.query.filter( all_models.Role.name == role_name).one() factory = factories.get_model_factory(obj_type) with factories.single_commit(): obj_id = factory(folder="a", readonly=True).id person = factories.PersonFactory() rbac_factories.UserRoleFactory(role=role_obj, person=person) person_id = person.id self.api.set_user(all_models.Person.query.get(person_id)) response = self.api.client.post( self.PATH_REMOVE_FOLDER, content_type="application/json", data=self._get_request_data(obj_type, obj_id, folder="a")) self.assertStatus(response, expected_status) obj = get_model(obj_type).query.get(obj_id) self.assertEqual(obj.folder, "a")
def test_delete(self, obj_type, is_external, readonly, exp_code, exp_deleted): """Test {0} DELETE if readonly={1}""" factory = factories.get_model_factory(obj_type) with factories.single_commit(): obj = factory(title='a', readonly=readonly) obj_id = obj.id if is_external: self.object_generator.api.login_as_external() else: self.object_generator.api.login_as_normal() obj = get_model(obj_type).query.get(obj_id) resp = self.object_generator.api.delete(obj) self.assertStatus(resp, exp_code) obj = get_model(obj_type).query.get(obj_id) if exp_deleted: self.assertIsNone(obj) else: self.assertIsNotNone(obj)