コード例 #1
0
  def test_system_not_updated(self, new, exp_ignored_columns):
    """Test readonly System not updated if new={0}"""

    with factories.single_commit():
      obj = factories.SystemFactory(title='a', readonly=True)

    data = OrderedDict([
        ("object_type", "System"),
        ("Code*", obj.slug),
        ("Title", "b"),
    ])
    if new is not None:
      data["Read-only"] = new

    response = self.import_data(data)
    self._check_csv_response(response, {
        "System": {
            "row_warnings": {
                errors.READONLY_ACCESS_WARNING.format(
                    line=3, columns=exp_ignored_columns),
            },
        }
    })
    obj = get_model("System").query.one()
    self.assertEqual(obj.readonly, True)
    self.assertEqual(obj.title, 'a')
コード例 #2
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)
コード例 #3
0
    def test_readonly_system_not_deleted(self):
        """Test System with readonly=True can be deleted"""

        with factories.single_commit():
            obj = factories.SystemFactory(title='a', readonly=True)
            obj_id = obj.id

        data = OrderedDict([
            ("object_type", "System"),
            ("Code*", obj.slug),
            ("Delete", "yes"),
        ])

        response = self.import_data(data)
        self._check_csv_response(
            response, {
                "System": {
                    "row_warnings": {
                        errors.READONLY_ACCESS_WARNING.format(
                            line=3, columns="'Delete'"),
                    },
                }
            })
        obj = get_model("System").query.get(obj_id)
        self.assertIsNotNone(obj)
コード例 #4
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)
コード例 #5
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)
コード例 #6
0
ファイル: __init__.py プロジェクト: weizai118/ggrc-core
    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
コード例 #7
0
    def test_system_not_updated_as_admin(self):
        """Test readonly System not updated by admin"""

        with factories.single_commit():
            obj = factories.SystemFactory(title='a', readonly=True)

        data = OrderedDict([
            ("object_type", "System"),
            ("Code*", obj.slug),
            ("Title", "b"),
        ])

        response = self.import_data(data)
        self._check_csv_response(
            response, {
                "System": {
                    "row_warnings": {
                        errors.READONLY_ACCESS_WARNING.format(
                            line=3, columns="'Title'"),
                    },
                }
            })
        obj = get_model("System").query.one()
        self.assertEqual(obj.readonly, True)
        self.assertEqual(obj.title, 'a')
コード例 #8
0
    def test_readonly_set_by_role(self, role_name, expected_readonly):
        """Test setting Read-only to true under {}."""
        role_obj = all_models.Role.query.filter(
            all_models.Role.name == role_name).one()

        with factories.single_commit():
            user = factories.PersonFactory()
            rbac_factories.UserRoleFactory(role=role_obj, person=user)

        response = self.import_data(OrderedDict([
            ("object_type", "System"),
            ("Code*", ""),
            ("Admin", user.email),
            ("Assignee", user.email),
            ("Verifier", user.email),
            ("Title", "New System"),
            ("Read-only", True),
        ]),
                                    person=user)

        expected_warning = {
            "System": {
                "row_warnings": {
                    errors.NON_ADMIN_ACCESS_ERROR.format(
                        line=3, object_type="System", column_name="Read-only")
                }
            }
        } if role_name != "Administrator" else {}
        self._check_csv_response(response, expected_warning)

        obj = all_models.System.query.filter_by(title="New System").first()
        self.assertEqual(obj.readonly, expected_readonly)
コード例 #9
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)
コード例 #10
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)
コード例 #11
0
    def test_readonly_unset_by_role(self, role_name, expected_readonly):
        """Test setting Read-only to false under {}."""
        role_obj = all_models.Role.query.filter(
            all_models.Role.name == role_name).one()

        with factories.single_commit():
            user = factories.PersonFactory()
            system = factories.SystemFactory(readonly=True)
            rbac_factories.UserRoleFactory(role=role_obj, person=user)
            system.add_person_with_role_name(user, "Admin")

            system_slug = system.slug
            user_id = user.id

        response = self.import_data(
            OrderedDict([
                ("object_type", "System"),
                ("Code*", system_slug),
                ("Read-only", "no"),
            ]),
            person=all_models.Person.query.get(user_id))

        expected_warning = {
            "System": {
                "row_warnings": {
                    errors.NON_ADMIN_ACCESS_ERROR.format(
                        line=3, object_type="System", column_name="Read-only")
                }
            }
        } if expected_readonly else {}
        self._check_csv_response(response, expected_warning)

        obj = all_models.System.query.filter_by(slug=system_slug).first()
        self.assertEqual(obj.readonly, expected_readonly)
コード例 #12
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)
コード例 #13
0
  def test_readonly_set_by_role(self, role_name, expected_readonly):
    """Test setting Read-only to true under {}."""
    role_obj = all_models.Role.query.filter(
        all_models.Role.name == role_name
    ).one()

    with factories.single_commit():
      user = factories.PersonFactory()
      rbac_factories.UserRoleFactory(role=role_obj, person=user)

    response = self.import_data(OrderedDict([
        ("object_type", "System"),
        ("Code*", "System-1"),
        ("Admin", user.email),
        ("Assignee", user.email),
        ("Verifier", user.email),
        ("Title", "New System"),
        ("Read-only", True),
    ]), person=user)

    expected_warning = {
        "System": {
            "row_warnings": {
                errors.NON_ADMIN_ACCESS_ERROR.format(
                    line=3,
                    object_type="System",
                    column_name="Read-only"
                )
            }
        }
    } if role_name != "Administrator" else {}
    self._check_csv_response(response, expected_warning)

    obj = all_models.System.query.filter_by(slug="System-1").first()
    self.assertEqual(obj.readonly, expected_readonly)
コード例 #14
0
  def test_not_empty_revisions(self):
    """Test `not_empty_revisions` returns revisions with changes."""
    self._turn_on_bg_indexing()
    with factories.single_commit():
      control = factories.ControlFactory()

    edits_count = 3
    for _ in range(edits_count):
      response = self.api.put(control, {})
      self.assert200(response)

    all_revisions_count = all_models.Revision.query.filter(
        all_models.Revision.resource_type == control.type,
        all_models.Revision.resource_id == control.id,
    ).count()
    # Revision also is created when creating an object
    self.assertEqual(all_revisions_count, edits_count + 1)

    not_empty_revisions = self._get_first_result_set(
        {
            "object_name": "Revision",
            "type": "ids",
            "filters": {
                "expression": {
                    "op": {"name": "not_empty_revisions"},
                    "resource_type": control.type,
                    "resource_id": control.id,
                },
            },
        },
        "Revision",
        "ids",
    )
    self.assertEqual(len(not_empty_revisions), 1)
    self._turn_off_bg_indexing()
コード例 #15
0
    def test_audit_ok(self):
        """ Test an operator on an audit with a non-empty result

    Make sure that the operator returns an audit object if the audit has
    relations with an issue and an assessment, and doesn't have relations with
    other assessments.
    """
        with factories.single_commit():
            audit = factories.AuditFactory()
            issue = factories.IssueFactory()
            assessment = factories.AssessmentFactory()

            factories.RelationshipFactory(source=assessment, destination=audit)
            rel_assmt_issue = factories.RelationshipFactory(source=assessment,
                                                            destination=issue)
            factories.AutomappingFactory(parent=rel_assmt_issue)

        audit_id = audit.id
        issue_id = issue.id
        assmt_id = assessment.id

        resp = self._perform_query(issue_id, assmt_id)
        self.assert200(resp)
        self.assertEqual(len(resp.json), 1)
        self.assertEqual(resp.json[0]["Audit"]["count"], 1)
        self.assertEqual(audit_id, resp.json[0]["Audit"]["values"][0]["id"])
コード例 #16
0
    def test_audit_bad(self):
        """ Test an operator on an audit with an empty result

    Make sure that the operator returns an empty result if the audit has
    relations with several different assessments.
    """
        with factories.single_commit():
            audit = factories.AuditFactory()
            issue = factories.IssueFactory()
            assessment = factories.AssessmentFactory()

            factories.RelationshipFactory(source=assessment, destination=audit)
            rel_assmt_issue = factories.RelationshipFactory(source=assessment,
                                                            destination=issue)
            factories.AutomappingFactory(parent=rel_assmt_issue)

            other_assessment = factories.AssessmentFactory()
            factories.RelationshipFactory(source=audit,
                                          destination=other_assessment)

        issue_id = issue.id
        assmt_id = assessment.id

        resp = self._perform_query(issue_id, assmt_id)
        self.assert200(resp)
        self.assertEqual(len(resp.json), 1)
        self.assertEqual(resp.json[0]["Audit"]["count"], 0)
コード例 #17
0
ファイル: test_reader.py プロジェクト: k-alexey/ggrc-core
 def test_unmap_people(self, user_role):
     """Test that global reader/creator can't unmap people from program"""
     user = self.users[user_role]
     with factories.single_commit():
         program = factories.ProgramFactory()
         mapped_person = factories.ObjectPersonFactory(
             personable=program, person=user, context=program.context)
     self.api.set_user(user)
     db.session.add(mapped_person)
     response = self.api.delete(mapped_person)
     self.assertEqual(response.status_code, 403)
コード例 #18
0
    def test_readonly_searchable(self, test_value, expected_title):
        """Test filtration by readonly attribute"""
        with factories.single_commit():
            factories.SystemFactory(title="readonly system", readonly=True)
            factories.SystemFactory(title="non readonly system")

        self.client.get("/login")
        actual_systems = self.simple_query(
            "System", expression=["readonly", "=", test_value])
        self.assertEqual([s.get("title") for s in actual_systems],
                         [expected_title])
コード例 #19
0
 def test_unmap_people(self, user_role):
   """Test that global reader/creator can't unmap people from program"""
   user = self.users[user_role]
   with factories.single_commit():
     program = factories.ProgramFactory()
     mapped_person = factories.ObjectPersonFactory(
         personable=program, person=user, context=program.context
     )
   self.api.set_user(user)
   db.session.add(mapped_person)
   response = self.api.delete(mapped_person)
   self.assert403(response)
コード例 #20
0
  def test_user_cannot_get_readonly_value_without_perms(self, new):
    """Test readonly System not updated if new={0!r} and user has no perms

    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()

    with factories.single_commit():
      person = factories.PersonFactory()
      person_id = person.id
      rbac_factories.UserRoleFactory(role=role_obj, person=person)

      obj = factories.SystemFactory(title='a', readonly=True)

    data = OrderedDict([
        ("object_type", "System"),
        ("Code*", obj.slug),
        ("Title", "b"),
    ])
    if new is not _NOT_SPECIFIED:
      data["Read-only"] = new

    response = self.import_data(
        data,
        person=all_models.Person.query.get(person_id)
    )
    exp_csv_responsse = {
        "System": {
            "row_errors": {
                errors.PERMISSION_ERROR.format(line=3),
            },
        }
    }
    if new is not _NOT_SPECIFIED:
      exp_csv_responsse['System']['row_warnings'] = {
          errors.NON_ADMIN_ACCESS_ERROR.format(
              line=3,
              object_type="System",
              column_name="Read-only",
          ),
      }

    self._check_csv_response(response, exp_csv_responsse)

    obj = get_model("System").query.one()
    self.assertEqual(obj.readonly, True)
    self.assertEqual(obj.title, 'a')
コード例 #21
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
コード例 #22
0
  def test_readonly_searchable(self, test_value, expected_title):
    """Test filtration by readonly attribute"""
    with factories.single_commit():
      factories.SystemFactory(title="readonly system", readonly=True)
      factories.SystemFactory(title="non readonly system")

    self.client.get("/login")
    actual_systems = self.simple_query(
        "System",
        expression=["readonly", "=", test_value]
    )
    self.assertEqual(
        [s.get("title") for s in actual_systems],
        [expected_title]
    )
コード例 #23
0
  def _create_cads(obj_type, names=('ATTR1', 'ATTR2', 'ATTR3')):
    """Create custom attribute definitions"""

    ret = dict()

    with factories.single_commit():
      for name in names:
        obj = factories.CustomAttributeDefinitionFactory(
            title=name,
            definition_type=obj_type.lower(),
            attribute_type="Text",
        )
        ret[name] = obj.id

    return ret
コード例 #24
0
    def test_user_cannot_get_readonly_value_without_perms(self, new):
        """Test readonly System not updated if new={0!r} and user has no perms

    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()

        with factories.single_commit():
            person = factories.PersonFactory()
            person_id = person.id
            rbac_factories.UserRoleFactory(role=role_obj, person=person)

            obj = factories.SystemFactory(title='a', readonly=True)

        data = OrderedDict([
            ("object_type", "System"),
            ("Code*", obj.slug),
            ("Title", "b"),
        ])
        if new is not _NOT_SPECIFIED:
            data["Read-only"] = new

        response = self.import_data(
            data, person=all_models.Person.query.get(person_id))
        exp_csv_responsse = {
            "System": {
                "row_errors": {
                    errors.PERMISSION_ERROR.format(line=3),
                },
            }
        }
        if new is not _NOT_SPECIFIED:
            exp_csv_responsse['System']['row_warnings'] = {
                errors.NON_ADMIN_ACCESS_ERROR.format(
                    line=3,
                    object_type="System",
                    column_name="Read-only",
                ),
            }

        self._check_csv_response(response, exp_csv_responsse)

        obj = get_model("System").query.one()
        self.assertEqual(obj.readonly, True)
        self.assertEqual(obj.title, 'a')
コード例 #25
0
  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)
コード例 #26
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)
コード例 #27
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)
コード例 #28
0
  def test_system_update_and_unset_readonly_as_admin(self):
    """Test System readonly unset and title updated by admin in same import"""

    with factories.single_commit():
      obj = factories.SystemFactory(title='a', readonly=True)

    data = OrderedDict([
        ("object_type", "System"),
        ("Code*", obj.slug),
        ("Title", "b"),
        ("Read-Only", "no"),
    ])

    response = self.import_data(data)
    self._check_csv_response(response, {})
    obj = get_model("System").query.one()
    self.assertEqual(obj.readonly, False)
    self.assertEqual(obj.title, 'b')
コード例 #29
0
    def test_system_update_and_unset_readonly_as_admin(self):
        """Test System readonly unset and title updated by admin in same import"""

        with factories.single_commit():
            obj = factories.SystemFactory(title='a', readonly=True)

        data = OrderedDict([
            ("object_type", "System"),
            ("Code*", obj.slug),
            ("Title", "b"),
            ("Read-Only", "no"),
        ])

        response = self.import_data(data)
        self._check_csv_response(response, {})
        obj = get_model("System").query.one()
        self.assertEqual(obj.readonly, False)
        self.assertEqual(obj.title, 'b')
コード例 #30
0
    def test_system_update_to_readonly_as_admin(self, new, expected):
        """Test System readonly={1} if new={0}"""

        with factories.single_commit():
            obj = factories.SystemFactory(title='a', readonly=False)

        data = OrderedDict([
            ("object_type", "System"),
            ("Code*", obj.slug),
            ("Title", "b"),
        ])
        if new is not None:
            data["Read-only"] = new

        response = self.import_data(data)
        self._check_csv_response(response, {})
        obj = get_model("System").query.one()
        self.assertEqual(obj.readonly, expected)
コード例 #31
0
  def test_system_update_to_readonly_as_admin(self, new, expected):
    """Test System readonly={1} if new={0}"""

    with factories.single_commit():
      obj = factories.SystemFactory(title='a', readonly=False)

    data = OrderedDict([
        ("object_type", "System"),
        ("Code*", obj.slug),
        ("Title", "b"),
    ])
    if new is not None:
      data["Read-only"] = new

    response = self.import_data(data)
    self._check_csv_response(response, {})
    obj = get_model("System").query.one()
    self.assertEqual(obj.readonly, expected)
コード例 #32
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)
コード例 #33
0
    def test_system_add_comments_on_update(self, readonly, comments,
                                           exp_comments):
        """Test Comment creation {1} on update System with readonly={0}"""

        with factories.single_commit():
            obj = factories.SystemFactory(title='a', readonly=readonly)

        data = OrderedDict([
            ("object_type", "System"),
            ("Code*", obj.slug),
            ("Comments", ';;'.join(comments)),
        ])

        response = self.import_data(data)
        self._check_csv_response(response, {})

        obj = get_model("System").query.one()
        created_comments = set(comment.description
                               for comment in obj.related_objects(['Comment']))
        self.assertEqual(created_comments, set(exp_comments))
コード例 #34
0
  def test_system_add_comments_on_update(self, readonly, comments,
                                         exp_comments):
    """Test Comment creation {1} on update System with readonly={0}"""

    with factories.single_commit():
      obj = factories.SystemFactory(title='a', readonly=readonly)

    data = OrderedDict([
        ("object_type", "System"),
        ("Code*", obj.slug),
        ("Comments", ';;'.join(comments)),
    ])

    response = self.import_data(data)
    self._check_csv_response(response, {})

    obj = get_model("System").query.one()
    created_comments = set(comment.description
                           for comment in obj.related_objects(['Comment']))
    self.assertEqual(created_comments, set(exp_comments))
コード例 #35
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)
コード例 #36
0
    def test_system_readonly_invalid_on_update(self):
        """Test System readonly=False on update with invalid data"""

        with factories.single_commit():
            obj = factories.SystemFactory(title='a', readonly=False)

        data = OrderedDict([("object_type", "System"), ("Code*", obj.slug),
                            ("Title", "b"), ("Read-only", "qwerty")])

        response = self.import_data(data)
        self._check_csv_response(
            response, {
                "System": {
                    "row_warnings": {
                        errors.WRONG_VALUE.format(line=3,
                                                  column_name="Read-only")
                    },
                }
            })
        obj = get_model("System").query.one()
        self.assertFalse(obj.readonly)
コード例 #37
0
  def test_readonly_system_not_deleted_without_user_perms(self):
    """Test System with readonly=True can be deleted

    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()

    with factories.single_commit():
      person = factories.PersonFactory()
      person_id = person.id
      rbac_factories.UserRoleFactory(role=role_obj, person=person)

      obj = factories.SystemFactory(title='a', readonly=True)
      obj_id = obj.id

    data = OrderedDict([
        ("object_type", "System"),
        ("Code*", obj.slug),
        ("Delete", "yes"),
    ])

    response = self.import_data(
        data,
        person=all_models.Person.query.get(person_id)
    )
    self._check_csv_response(response, {
        "System": {
            "row_errors": {
                "Line 3: Delete column is temporary disabled, please "
                "use web interface to delete current object.",
                errors.PERMISSION_ERROR.format(line=3),
            },
        }
    })
    obj = get_model("System").query.get(obj_id)
    self.assertIsNotNone(obj)
コード例 #38
0
  def test_readonly_system_not_deleted_without_user_perms(self):
    """Test System with readonly=True can be deleted

    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()

    with factories.single_commit():
      person = factories.PersonFactory()
      person_id = person.id
      rbac_factories.UserRoleFactory(role=role_obj, person=person)

      obj = factories.SystemFactory(title='a', readonly=True)
      obj_id = obj.id

    data = OrderedDict([
        ("object_type", "System"),
        ("Code*", obj.slug),
        ("Delete", "yes"),
    ])

    response = self.import_data(
        data,
        person=all_models.Person.query.get(person_id)
    )
    self._check_csv_response(response, {
        "System": {
            "row_errors": {
                "Line 3: Delete column is temporary disabled, please "
                "use web interface to delete current object.",
                errors.PERMISSION_ERROR.format(line=3),
            },
        }
    })
    obj = get_model("System").query.get(obj_id)
    self.assertIsNotNone(obj)
コード例 #39
0
  def test_system_readonly_invalid_on_update(self):
    """Test System readonly=False on update with invalid data"""

    with factories.single_commit():
      obj = factories.SystemFactory(title='a', readonly=False)

    data = OrderedDict([
        ("object_type", "System"),
        ("Code*", obj.slug),
        ("Title", "b"),
        ("Read-only", "qwerty")
    ])

    response = self.import_data(data)
    self._check_csv_response(response, {
        "System": {
            "row_warnings": {
                errors.WRONG_VALUE.format(line=3, column_name="Read-only")
            },
        }
    })
    obj = get_model("System").query.one()
    self.assertFalse(obj.readonly)
コード例 #40
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")
コード例 #41
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)
コード例 #42
0
  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")
コード例 #43
0
  def test_readonly_update_by_role(self, role, old_readonly, new_readonly):
    """Test updating readonly attribute from {1} to {2}."""
    role_obj = all_models.Role.query.filter(
        all_models.Role.name == role
    ).one()

    with factories.single_commit():
      user = factories.PersonFactory()
      system = factories.SystemFactory(readonly=old_readonly)
      rbac_factories.UserRoleFactory(role=role_obj, person=user)
      system.add_person_with_role_name(user, "Admin")

    response = self.import_data(OrderedDict([
        ("object_type", "System"),
        ("Code*", system.slug),
        ("Admin", user.email),
        ("Read-only", new_readonly),
    ]), person=user)

    expected_message = {
        "System": {
            "row_warnings": {
                errors.NON_ADMIN_ACCESS_ERROR.format(
                    line=3,
                    column_name="Read-only",
                    object_type="System",
                )
            }
        }
    } if role != "Administrator" else {}
    self._check_csv_response(response, expected_message)

    obj = all_models.System.query.get(system.id)
    self.assertEqual(
        obj.readonly,
        new_readonly if role == "Administrator" else old_readonly
    )
コード例 #44
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])
コード例 #45
0
  def test_readonly_update_by_role(self, role, old_readonly, new_readonly):
    """Test updating readonly attribute from {1} to {2} as {0}."""
    role_obj = all_models.Role.query.filter(
        all_models.Role.name == role
    ).one()

    with factories.single_commit():
      user = factories.PersonFactory()
      system = factories.SystemFactory(readonly=old_readonly)
      rbac_factories.UserRoleFactory(role=role_obj, person=user)
      system.add_person_with_role_name(user, "Admin")

    response = self.import_data(OrderedDict([
        ("object_type", "System"),
        ("Code*", system.slug),
        ("Admin", user.email),
        ("Read-only", new_readonly),
    ]), person=user)

    expected_message = {
        "System": {
            "row_warnings": {
                errors.NON_ADMIN_ACCESS_ERROR.format(
                    line=3,
                    column_name="Read-only",
                    object_type="System",
                )
            }
        }
    } if role != "Administrator" else {}
    self._check_csv_response(response, expected_message)

    obj = all_models.System.query.get(system.id)
    self.assertEqual(
        obj.readonly,
        new_readonly if role == "Administrator" else old_readonly
    )
コード例 #46
0
  def test_system_not_updated_as_admin(self):
    """Test readonly System not updated by admin"""

    with factories.single_commit():
      obj = factories.SystemFactory(title='a', readonly=True)

    data = OrderedDict([
        ("object_type", "System"),
        ("Code*", obj.slug),
        ("Title", "b"),
    ])

    response = self.import_data(data)
    self._check_csv_response(response, {
        "System": {
            "row_warnings": {
                errors.READONLY_ACCESS_WARNING.format(
                    line=3, columns="'Title'"),
            },
        }
    })
    obj = get_model("System").query.one()
    self.assertEqual(obj.readonly, True)
    self.assertEqual(obj.title, 'a')
コード例 #47
0
  def test_system_add_document_on_update(self, readonly, exp_set):
    """Test Reference URL set on update System with readonly={0}"""

    with factories.single_commit():
      obj = factories.SystemFactory(title='a', readonly=readonly)

    data = OrderedDict([
        ("object_type", "System"),
        ("Code*", obj.slug),
        ("Reference URL", "aa"),
    ])

    if exp_set:
      dct = {}
    else:
      dct = {
          "System": {
              "row_warnings": {
                  errors.READONLY_ACCESS_WARNING.format(
                      line=3, columns="'Reference URL'"),
              },
          }
      }

    response = self.import_data(data)
    self._check_csv_response(response, dct)

    obj = get_model("System").query.one()
    docs = obj.documents_reference_url

    if exp_set:
      self.assertEqual(len(docs), 1)
      doc = docs[0]
      self.assertEqual(doc.link, "aa")
    else:
      self.assertEqual(len(docs), 0)
コード例 #48
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])
コード例 #49
0
  def test_readonly_unset_by_role(self, role_name, expected_readonly):
    """Test setting Read-only to false under {}."""
    role_obj = all_models.Role.query.filter(
        all_models.Role.name == role_name
    ).one()

    with factories.single_commit():
      user = factories.PersonFactory()
      system = factories.SystemFactory(readonly=True)
      rbac_factories.UserRoleFactory(role=role_obj, person=user)
      system.add_person_with_role_name(user, "Admin")

      system_slug = system.slug
      user_id = user.id

    response = self.import_data(OrderedDict([
        ("object_type", "System"),
        ("Code*", system_slug),
        ("Read-only", "no"),
    ]), person=all_models.Person.query.get(user_id))

    expected_warning = {
        "System": {
            "row_warnings": {
                errors.NON_ADMIN_ACCESS_ERROR.format(
                    line=3,
                    object_type="System",
                    column_name="Read-only"
                )
            }
        }
    } if expected_readonly else {}
    self._check_csv_response(response, expected_warning)

    obj = all_models.System.query.filter_by(slug=system_slug).first()
    self.assertEqual(obj.readonly, expected_readonly)
コード例 #50
0
  def test_readonly_system_not_deleted(self):
    """Test System with readonly=True can be deleted"""

    with factories.single_commit():
      obj = factories.SystemFactory(title='a', readonly=True)
      obj_id = obj.id

    data = OrderedDict([
        ("object_type", "System"),
        ("Code*", obj.slug),
        ("Delete", "yes"),
    ])

    response = self.import_data(data)
    self._check_csv_response(response, {
        "System": {
            "row_warnings": {
                errors.READONLY_ACCESS_WARNING.format(line=3,
                                                      columns="'Delete'"),
            },
        }
    })
    obj = get_model("System").query.get(obj_id)
    self.assertIsNotNone(obj)
コード例 #51
0
    def test_system_add_document_on_update(self, readonly, exp_set):
        """Test Reference URL set on update System with readonly={0}"""

        with factories.single_commit():
            obj = factories.SystemFactory(title='a', readonly=readonly)

        data = OrderedDict([
            ("object_type", "System"),
            ("Code*", obj.slug),
            ("Reference URL", "aa"),
        ])

        if exp_set:
            dct = {}
        else:
            dct = {
                "System": {
                    "row_warnings": {
                        errors.READONLY_ACCESS_WARNING.format(
                            line=3, columns="'Reference URL'"),
                    },
                }
            }

        response = self.import_data(data)
        self._check_csv_response(response, dct)

        obj = get_model("System").query.one()
        docs = obj.documents_reference_url

        if exp_set:
            self.assertEqual(len(docs), 1)
            doc = docs[0]
            self.assertEqual(doc.link, "aa")
        else:
            self.assertEqual(len(docs), 0)