test_issues.py 5.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
# Copyright (C) 2022 Intel Corporation
#
# SPDX-License-Identifier: MIT

import pytest
from http import HTTPStatus
from deepdiff import DeepDiff
from copy import deepcopy

from .utils.config import post_method, patch_method

K
Kirill Sizov 已提交
12
@pytest.mark.usefixtures("restore")
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
class TestPostIssues:
    def _test_check_response(self, user, data, is_allow, **kwargs):
        response = post_method(user, 'issues', data, **kwargs)

        if is_allow:
            assert response.status_code == HTTPStatus.CREATED
            assert user == response.json()['owner']['username']
            assert data['message'] == response.json()['comments'][0]['message']
            assert DeepDiff(data, response.json(),
                exclude_regex_paths=r"root\['created_date|updated_date|comments|id|owner|message'\]") == {}
        else:
            assert response.status_code == HTTPStatus.FORBIDDEN

    @pytest.mark.parametrize('org', [''])
    @pytest.mark.parametrize('privilege, job_staff, is_allow', [
        ('admin',    True, True), ('admin',    False, True),
        ('business', True, True), ('business', False, False),
        ('worker',   True, True), ('worker',   False, False),
        ('user',     True, True), ('user',     False, False)
    ])
    def test_user_create_issue(self, org, privilege, job_staff, is_allow,
        find_job_staff_user, find_users, jobs_by_org):
        users = find_users(privilege=privilege)
        jobs = jobs_by_org[org]
        username, jid = find_job_staff_user(jobs, users, job_staff)
        job, = filter(lambda job: job['id'] == jid, jobs)

        data = {
            "assignee": None,
            "comments": [],
            "job": jid,
            "frame": job['start_frame'],
            "position": [
                0., 0., 1., 1.,
            ],
            "resolved": False,
            "message": "lorem ipsum",
        }

        self._test_check_response(username, data, is_allow)


    @pytest.mark.parametrize('org', [2])
    @pytest.mark.parametrize('role, job_staff, is_allow', [
        ('maintainer', False, True),  ('owner',  False, True),
        ('supervisor', False, False), ('worker', False, False),
        ('maintainer', True, True), ('owner',  True, True),
        ('supervisor', True, True), ('worker', True, True)
    ])
    def test_member_create_issue(self, org, role, job_staff, is_allow,
            find_job_staff_user, find_users, jobs_by_org, jobs):
        users = find_users(role=role, org=org)
        username, jid = find_job_staff_user(jobs_by_org[org], users, job_staff)
        job = jobs[jid]

        data = {
            "assignee": None,
            "comments": [],
            "job": jid,
            "frame": job['start_frame'],
            "position": [
                0., 0., 1., 1.,
            ],
            "resolved": False,
            "message": "lorem ipsum",
        }

        self._test_check_response(username, data, is_allow, org_id=org)


K
Kirill Sizov 已提交
83
@pytest.mark.usefixtures("restore")
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
class TestPatchIssues:
    def _test_check_response(self, user, issue_id, data, is_allow, **kwargs):
        response = patch_method(user, f'issues/{issue_id}', data,
            action='update', **kwargs)

        if is_allow:
            assert response.status_code == HTTPStatus.OK
            assert DeepDiff(data, response.json(),
                exclude_regex_paths=r"root\['created_date|updated_date|comments|id|owner'\]") == {}
        else:
            assert response.status_code == HTTPStatus.FORBIDDEN

    @pytest.fixture(scope='class')
    def request_data(self, issues):
        def get_data(issue_id):
            data = deepcopy(issues[issue_id])
            data['resolved'] = not data['resolved']
            data.pop('comments')
            data.pop('updated_date')
            data.pop('id')
            data.pop('owner')
            return data
        return get_data

    @pytest.mark.parametrize('org', [''])
    @pytest.mark.parametrize('privilege, issue_staff, issue_admin, is_allow', [
        ('admin',    True,  None,  True), ('admin',    False, None,  True),
        ('business', True,  None,  True), ('business', False, None,  False),
        ('user',     True,  None,  True), ('user',     False, None,  False),
        ('worker',   False, True,  True), ('worker',   True,  False, False),
        ('worker',   False, False, False)
    ])
    def test_user_update_issue(self, org, privilege, issue_staff, issue_admin, is_allow,
        find_issue_staff_user, find_users, issues_by_org, request_data):
        users = find_users(privilege=privilege)
        issues = issues_by_org[org]
        username, issue_id = find_issue_staff_user(issues, users, issue_staff, issue_admin)

        data = request_data(issue_id)
        self._test_check_response(username, issue_id, data, is_allow)

    @pytest.mark.parametrize('org', [2])
    @pytest.mark.parametrize('role, issue_staff, issue_admin, is_allow', [
        ('maintainer', True,  None,  True), ('maintainer', False, None,  True),
        ('supervisor', True,  None,  True), ('supervisor', False, None,  False),
        ('owner',      True,  None,  True), ('owner',      False, None,  True),
        ('worker',     False, True,  True), ('worker',     True,  False, False),
        ('worker',     False, False, False)
    ])
    def test_member_update_issue(self, org, role, issue_staff, issue_admin, is_allow,
        find_issue_staff_user, find_users, issues_by_org, request_data):
        users = find_users(role=role, org=org)
        issues = issues_by_org[org]
        username, issue_id = find_issue_staff_user(issues, users, issue_staff, issue_admin)

        data = request_data(issue_id)
        self._test_check_response(username, issue_id, data, is_allow, org_id=org)