File: test_devopsSecurityPermissionTest.py

package info (click to toggle)
azure-devops-cli-extension 1.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 22,680 kB
  • sloc: python: 160,797; xml: 198; sh: 61; makefile: 56
file content (119 lines) | stat: -rw-r--r-- 7,960 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
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
83
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
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------

import unittest
from knack.util import CLIError
from azure_devtools.scenario_tests import AllowLargeResponse
from .utilities.helper import DevopsScenarioTest, disable_telemetry, set_authentication, get_test_org_from_env_variable

DEVOPS_CLI_TEST_ORGANIZATION = get_test_org_from_env_variable() or 'https://dev.azure.com/v-anvashist0376'
_TEST_EMAIL_ID = 'new_user_test@outlook.com'


class PermissionTests(DevopsScenarioTest):
    @AllowLargeResponse(size_kb=3072)
    @disable_telemetry
    @set_authentication
    def test_devops_security_permission_tests(self):
        random_project_name = self.create_random_name(prefix='Permission_',length=15)
        self.cmd('az devops configure --defaults organization=' +  DEVOPS_CLI_TEST_ORGANIZATION + ' project=' + random_project_name)

        try:
            create_project_command = 'az devops project create --name ' + random_project_name + ' --output json --detect false'
            project_create_output = self.cmd(create_project_command).get_output_in_json()
            created_project_id = project_create_output["id"]
            #Permanently delete work items permission
            permission_bit = 32768
            #add user
            user_add_response = self.cmd('az devops user add -o json --detect false --email-id ' + _TEST_EMAIL_ID + ' --license-type stakeholder').get_output_in_json()
            user_id = user_add_response['id']
            assert user_add_response['user']['mailAddress'] == _TEST_EMAIL_ID

            #list namespace
            list_namespace = self.cmd('az devops security permission namespace list -o json --detect false').get_output_in_json()

            #Further tests are on Project namespace : 52d39943-cb85-4d7f-8fa8-c6baac873819
            project_namespace_id = '52d39943-cb85-4d7f-8fa8-c6baac873819'
            #show namespace
            show_namespace = self.cmd('az devops security permission namespace show --id '+ project_namespace_id +' -o json --detect false').get_output_in_json()
            assert show_namespace[0]['namespaceId'] == project_namespace_id

            # permission list tokens
            list_permission = self.cmd('az devops security permission list --id '+ project_namespace_id + ' --subject ' + _TEST_EMAIL_ID +' -o json --detect false').get_output_in_json()
            acl_entries = list_permission[0]['acesDictionary'].keys()
            email_id_found = False
            for entry in acl_entries:
                if _TEST_EMAIL_ID in entry:
                    email_id_found = True
                    ace_key = entry
            assert email_id_found == True

            project_token = "$PROJECT:vstfs:///Classification/TeamProject/"+created_project_id

            show_permission = self.cmd('az devops security permission show --id '+ project_namespace_id + ' --subject ' + _TEST_EMAIL_ID + ' --token "' + project_token +'" -o json --detect false').get_output_in_json()
            assert show_permission[0]['token'] == project_token
            assert show_permission[0]['includeExtendedInfo'] == True
            original_resolved_permissions = show_permission[0]['acesDictionary'][ace_key]['resolvedPermissions']
            assert original_resolved_permissions is not None
            for entry in original_resolved_permissions:
                if entry['bit'] ==  permission_bit:
                    curr_allow_value = entry['effectivePermission']
            assert curr_allow_value != 'Allow'

            update_permission = self.cmd('az devops security permission update --id '+ project_namespace_id + ' --allow-bit 65536 --subject ' + _TEST_EMAIL_ID + ' --token "' + project_token +'" -o json --detect false').get_output_in_json()
            assert update_permission[0]['token'] == project_token
            resolved_permissions = update_permission[0]['acesDictionary'][ace_key]['resolvedPermissions']
            assert resolved_permissions is not None
            for entry in resolved_permissions:
                if entry['bit'] ==  permission_bit: 
                    new_allow_value = entry['effectivePermission']
                    assert new_allow_value == 'Allow'
           
            update_permission = self.cmd('az devops security permission update --id '+ project_namespace_id + ' --deny-bit 65536 --subject ' + _TEST_EMAIL_ID + ' --token "' + project_token +'" -o json --detect false').get_output_in_json()
            assert update_permission[0]['token'] == project_token
            resolved_permissions = update_permission[0]['acesDictionary'][ace_key]['resolvedPermissions']
            assert resolved_permissions is not None
            for entry in resolved_permissions:
                if entry['bit'] ==  permission_bit: 
                    new_allow_value = entry['effectivePermission']
                    assert new_allow_value == 'Deny'

            reset_permission = self.cmd('az devops security permission reset --id '+ project_namespace_id + ' --permission-bit 65536 --subject ' + _TEST_EMAIL_ID + ' --token "' + project_token +'" -o json --detect false').get_output_in_json()
            assert reset_permission[0]['token'] == project_token
            resolved_permissions = reset_permission[0]['acesDictionary'][ace_key]['resolvedPermissions']
            assert resolved_permissions is not None
            for entry in resolved_permissions:
                if entry['bit'] ==  permission_bit: 
                    new_allow_value = entry['effectivePermission']
                    assert new_allow_value == curr_allow_value
            
            update_permission = self.cmd('az devops security permission update --id '+ project_namespace_id + ' --deny-bit 65536 --subject ' + _TEST_EMAIL_ID + ' --token "' + project_token +'" -o json --detect false').get_output_in_json()
            assert update_permission[0]['token'] == project_token
            resolved_permissions = update_permission[0]['acesDictionary'][ace_key]['resolvedPermissions']
            assert resolved_permissions is not None
            for entry in resolved_permissions:
                if entry['bit'] ==  32768: 
                    new_allow_value = entry['effectivePermission']
                    assert new_allow_value == 'Deny'
            assert resolved_permissions != original_resolved_permissions

            reset_all_permission = self.cmd('az devops security permission reset-all --id '+ project_namespace_id + ' --subject ' + _TEST_EMAIL_ID + ' --token "' + project_token +'" -y -o json --detect false').get_output_in_json()
            assert reset_all_permission == True

            show_permission = self.cmd('az devops security permission show --id '+ project_namespace_id + ' --subject ' + _TEST_EMAIL_ID + ' --token "' + project_token +'" -o json --detect false').get_output_in_json()
            assert show_permission[0]['token'] == project_token
            assert show_permission[0]['includeExtendedInfo'] == True
            resolved_permissions = show_permission[0]['acesDictionary'][ace_key]['resolvedPermissions']
            assert resolved_permissions is not None
            for entry in resolved_permissions:
                if entry['bit'] ==  32768:
                    new_allow_value = entry['effectivePermission']
            assert curr_allow_value == new_allow_value
            assert resolved_permissions == original_resolved_permissions
            
        finally:
            if created_project_id is not None:
                delete_project_command = 'az devops project delete --id ' + created_project_id + ' --output json --detect false -y'
                self.cmd(delete_project_command)