Beispiel #1
0
    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
Beispiel #2
0
    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)
Beispiel #3
0
  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)
Beispiel #4
0
    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)
Beispiel #5
0
    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)
Beispiel #6
0
  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)
Beispiel #7
0
  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)
Beispiel #8
0
    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)
Beispiel #9
0
  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)
Beispiel #10
0
    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])
Beispiel #11
0
  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])
Beispiel #12
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)
Beispiel #14
0
  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)
Beispiel #15
0
    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)
Beispiel #16
0
  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")
Beispiel #18
0
  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)