Skip to content

Commit 9b9e1d3

Browse files
Add test for group state (#133)
Adding unit tests for groups.py
1 parent 15662c3 commit 9b9e1d3

File tree

1 file changed

+138
-0
lines changed

1 file changed

+138
-0
lines changed

tests/unit/test_group.py

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
from unittest.mock import Mock
2+
3+
from databricks.sdk.service.iam import Group, ResourceMeta
4+
5+
from databricks.labs.ucx.config import GroupsConfig
6+
from databricks.labs.ucx.managers.group import GroupManager
7+
from databricks.labs.ucx.providers.groups_info import MigrationGroupInfo
8+
9+
10+
def test_account_groups_should_not_be_considered():
11+
client = Mock()
12+
users_group = Group(display_name="analysts", meta=ResourceMeta(resource_type="WorkspaceGroup"))
13+
account_admins_group = Group(display_name="account admins", meta=ResourceMeta(resource_type="AccountGroup"))
14+
client.groups.list.return_value = [users_group, account_admins_group]
15+
16+
group_conf = GroupsConfig(selected=[""])
17+
18+
assert GroupManager(client, group_conf)._find_eligible_groups() == [users_group.display_name]
19+
20+
21+
def test_if_only_account_groups_it_should_return_empty_value():
22+
client = Mock()
23+
users_group = Group(display_name="analysts", meta=ResourceMeta(resource_type="AccountGroup"))
24+
account_admins_group = Group(display_name="account admins", meta=ResourceMeta(resource_type="AccountGroup"))
25+
client.groups.list.return_value = [users_group, account_admins_group]
26+
27+
group_conf = GroupsConfig(selected=[""])
28+
29+
assert GroupManager(client, group_conf)._find_eligible_groups() == []
30+
31+
32+
def test_backup_group_should_be_created_with_name_defined_in_conf():
33+
client = Mock()
34+
35+
analysts_group = Group(display_name="analysts", meta=ResourceMeta(resource_type="WorkspaceGroup"))
36+
client.groups.list.return_value = []
37+
38+
analysts_group_backup = Group(
39+
display_name="dbr_backup_analysts_group_backup", meta=ResourceMeta(resource_type="WorkspaceGroup")
40+
)
41+
client.groups.create.return_value = analysts_group_backup
42+
43+
group_conf = GroupsConfig(selected=[""], backup_group_prefix="dbr_backup_")
44+
45+
assert (
46+
GroupManager(client, group_conf)._get_or_create_backup_group("analysts", analysts_group)
47+
== analysts_group_backup
48+
)
49+
50+
51+
def test_backup_group_should_not_be_created_if_already_exists():
52+
client = Mock()
53+
54+
analysts_group_backup = Group(
55+
display_name="dbr_backup_analysts_group_backup", meta=ResourceMeta(resource_type="WorkspaceGroup")
56+
)
57+
client.groups.list.return_value = [analysts_group_backup]
58+
59+
group_conf = GroupsConfig(selected=[""], backup_group_prefix="dbr_backup_")
60+
61+
assert (
62+
GroupManager(client, group_conf)._get_or_create_backup_group(
63+
"dbr_backup_analysts_group_backup", analysts_group_backup
64+
)
65+
== analysts_group_backup
66+
)
67+
68+
69+
def test_prepare_groups_in_environment_with_one_group_in_conf_should_return_migrationgroupinfo_object():
70+
client = Mock()
71+
72+
de_group = Group(display_name="de", meta=ResourceMeta(resource_type="WorkspaceGroup"))
73+
backup_de_group = Group(display_name="dbr_backup_de", meta=ResourceMeta(resource_type="WorkspaceGroup"))
74+
75+
def my_side_effect(filter, **kwargs): # noqa: A002,ARG001
76+
if filter == "displayName eq 'de'":
77+
return [de_group]
78+
elif filter == "displayName eq 'dbr_backup_de'":
79+
return [backup_de_group]
80+
81+
client.groups.list.side_effect = my_side_effect
82+
client.api_client.do.return_value = {"Resources": [de_group.as_dict()]}
83+
84+
group_conf = GroupsConfig(selected=["de"], backup_group_prefix="dbr_backup_")
85+
manager = GroupManager(client, group_conf)
86+
manager.prepare_groups_in_environment()
87+
88+
group_info = MigrationGroupInfo(workspace=de_group, account=de_group, backup=backup_de_group)
89+
assert manager._migration_state.groups == [group_info]
90+
91+
92+
def test_prepare_groups_in_environment_with_no_groups_in_conf():
93+
client = Mock()
94+
95+
de_group = Group(display_name="de", meta=ResourceMeta(resource_type="WorkspaceGroup"))
96+
backup_de_group = Group(display_name="dbr_backup_de", meta=ResourceMeta(resource_type="WorkspaceGroup"))
97+
98+
def my_side_effect(filter, **kwargs): # noqa: A002,ARG001
99+
if filter == "displayName eq 'de'":
100+
return [de_group]
101+
elif filter == "displayName eq 'dbr_backup_de'":
102+
return [backup_de_group]
103+
elif filter == 'displayName ne "users" and displayName ne "admins" and displayName ne "account users"':
104+
return [de_group]
105+
106+
client.groups.list.side_effect = my_side_effect
107+
client.api_client.do.return_value = {"Resources": [de_group.as_dict()]}
108+
109+
group_conf = GroupsConfig(backup_group_prefix="dbr_backup_", auto=True)
110+
manager = GroupManager(client, group_conf)
111+
manager.prepare_groups_in_environment()
112+
113+
group_info = MigrationGroupInfo(workspace=de_group, account=de_group, backup=backup_de_group)
114+
assert manager._migration_state.groups == [group_info]
115+
116+
117+
def test_replace_workspace_groups_with_account_groups_should_call_delete_and_do():
118+
client = Mock()
119+
120+
test_workspace_id = 100
121+
de_group = Group(display_name="de", meta=ResourceMeta(resource_type="WorkspaceGroup"), id=test_workspace_id)
122+
backup_de_group = Group(display_name="dbr_backup_de", meta=ResourceMeta(resource_type="WorkspaceGroup"))
123+
124+
client.groups.list.return_value = [de_group]
125+
126+
group_conf = GroupsConfig(backup_group_prefix="dbr_backup_", auto=True)
127+
manager = GroupManager(client, group_conf)
128+
129+
group_info = MigrationGroupInfo(workspace=de_group, account=de_group, backup=backup_de_group)
130+
manager._migration_state.groups = [group_info]
131+
manager.replace_workspace_groups_with_account_groups()
132+
133+
client.groups.delete.assert_called_with(test_workspace_id)
134+
client.api_client.do.assert_called_with(
135+
"PUT",
136+
f"/api/2.0/preview/permissionassignments/principals/{test_workspace_id}",
137+
data='{"permissions": ["USER"]}',
138+
)

0 commit comments

Comments
 (0)