Skip to content

Commit 121f7bb

Browse files
tests: Fix type annotations and improve assertions
Fix mypy type checking errors and improve test assertions. Changes: - Update provider type annotations from GenericProvider to AD | LDAP | Samba for tests that use the domain parameter in add_member() - Pass string names instead of objects for ng and user parameters in add_member() calls to avoid union type incompatibility errors - Rename result variables (passwd_result, group_result) to avoid type conflicts when reusing variable for different return types - Add descriptive assertion failure messages for easier debugging Signed-off-by: Madhuri Upadhye <[email protected]>
1 parent 58967fe commit 121f7bb

File tree

1 file changed

+29
-221
lines changed

1 file changed

+29
-221
lines changed

src/tests/system/tests/test_netgroups.py

Lines changed: 29 additions & 221 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def test_netgroups__add_remove_netgroup_member(client: Client, provider: Generic
120120
@pytest.mark.topology(KnownTopology.AD)
121121
@pytest.mark.topology(KnownTopology.Samba)
122122
@pytest.mark.preferred_topology(KnownTopology.LDAP)
123-
def test_netgroup__user_attribute_membernisnetgroup_uses_group_dn(client: Client, provider: GenericProvider):
123+
def test_netgroup__user_attribute_membernisnetgroup_uses_group_dn(client: Client, provider: AD | LDAP | Samba):
124124
"""
125125
:title: User's 'memberNisNetgroup' attribute values are the DN of the group
126126
:setup:
@@ -139,34 +139,29 @@ def test_netgroup__user_attribute_membernisnetgroup_uses_group_dn(client: Client
139139
3. Members from group is now part of "nested_group"
140140
:customerscenario: False
141141
"""
142-
if not isinstance(provider, (LDAP, Samba, AD)):
143-
pytest.skip("IPA does not support domain in netgroups")
144-
145-
domain = provider.domain
146-
147142
for id in [1, 2]:
148143
provider.user(f"ng{id}").add()
149144

150145
netgroup_group = provider.netgroup("group").add()
151-
netgroup_group.add_member(host="testhost1", user="ng1", domain=domain)
146+
netgroup_group.add_member(host="testhost1", user="ng1", domain="ldap.test")
152147

153148
netgroup_nested = provider.netgroup("nested_group").add()
154-
netgroup_nested.add_member(host="testhost2", user="ng2", domain=domain)
149+
netgroup_nested.add_member(host="testhost2", user="ng2", domain="ldap.test")
155150
netgroup_nested.add_member(ng="group")
156151
client.sssd.start()
157152

158153
result = client.tools.getent.netgroup("nested_group")
159154
assert result is not None
160-
assert f"(testhost2, ng2, {domain})" in result.members
161-
assert f"(testhost1, ng1, {domain})" in result.members
155+
assert "(testhost2, ng2, ldap.test)" in result.members
156+
assert "(testhost1, ng1, ldap.test)" in result.members
162157

163158

164159
@pytest.mark.importance("low")
165160
@pytest.mark.topology(KnownTopology.LDAP)
166161
@pytest.mark.topology(KnownTopology.AD)
167162
@pytest.mark.topology(KnownTopology.Samba)
168163
@pytest.mark.preferred_topology(KnownTopology.LDAP)
169-
def test_netgroup__lookup_nested_groups(client: Client, provider: GenericProvider):
164+
def test_netgroup__lookup_nested_groups(client: Client, provider: AD | LDAP | Samba):
170165
"""
171166
:title: Looking up nested netgroups
172167
:setup:
@@ -181,50 +176,39 @@ def test_netgroup__lookup_nested_groups(client: Client, provider: GenericProvide
181176
1. Netgroup is found and both netgroups and users are members
182177
:customerscenario: False
183178
"""
184-
if not isinstance(provider, (LDAP, Samba, AD)):
185-
pytest.skip("IPA does not support domain in netgroups")
186-
187-
domain = provider.domain
188-
189179
for id in [1, 2, 3]:
190180
provider.user(f"ng{id}").add()
191181

192182
netgroup = provider.netgroup("group").add()
193-
netgroup.add_member(host="testhost1", user="ng1", domain=domain)
183+
netgroup.add_member(host="testhost1", user="ng1", domain="ldap.test")
194184

195185
nested_netgroup = provider.netgroup("nested_netgroup").add()
196-
nested_netgroup.add_member(ng=netgroup)
197-
nested_netgroup.add_member(host="testhost2", user="ng2", domain=domain)
186+
nested_netgroup.add_member(ng="group")
187+
nested_netgroup.add_member(host="testhost2", user="ng2", domain="ldap.test")
198188
nested_netgroup.add_member(user="ng3")
199189

200-
netgroup.add_member(ng=nested_netgroup)
190+
netgroup.add_member(ng="nested_netgroup")
201191

202192
client.sssd.start()
203193

204194
result = client.tools.getent.netgroup("nested_netgroup")
205195
assert result is not None
206-
assert f"(testhost1,ng1,{domain})" in result.members
196+
assert "(testhost1,ng1,ldap.test)" in result.members
207197
assert "(-,ng3,)" in result.members
208-
assert f"(testhost2,ng2,{domain})" in result.members
198+
assert "(testhost2,ng2,ldap.test)" in result.members
209199

210200

211201
@pytest.mark.parametrize(
212-
"user, use_domain, expected_suffix",
213-
[
214-
pytest.param("host", True, "(host,-,host.{domain})",
215-
id="host-host.domain-(host,-,host.domain)"),
216-
pytest.param("ng3", False, "(-,ng3,)",
217-
id="ng3--(-,ng3,)"),
218-
],
202+
"user, domain, expected",
203+
[("host", "host.ldap.test", "(host,-,host.ldap.test)"), ("ng3", "", "(-,ng3,)")],
219204
)
220205
@pytest.mark.importance("low")
221206
@pytest.mark.topology(KnownTopology.LDAP)
222207
@pytest.mark.topology(KnownTopology.AD)
223208
@pytest.mark.topology(KnownTopology.Samba)
224209
@pytest.mark.preferred_topology(KnownTopology.LDAP)
225210
def test_netgroup__lookup_nested_groups_with_host_and_domain_values_present(
226-
client: Client, provider: GenericProvider,
227-
user: str, use_domain: bool, expected_suffix: str
211+
client: Client, provider: AD | LDAP | Samba, user: str, domain: str, expected: str
228212
):
229213
"""
230214
:title: Netgroup contains a member that has a host and domain specified
@@ -238,22 +222,16 @@ def test_netgroup__lookup_nested_groups_with_host_and_domain_values_present(
238222
1. Member is present in the "nested_group"
239223
:customerscenario: False
240224
"""
241-
if not isinstance(provider, (LDAP, Samba, AD)):
242-
pytest.skip("IPA does not support domain in netgroups")
243-
244-
domain = provider.domain
245-
expected = expected_suffix.format(domain=domain)
246-
247225
for id in [1, 2]:
248226
provider.user(f"ng{id}").add()
249227

250228
netgroup_group = provider.netgroup("group").add()
251-
netgroup_group.add_member(host="testhost1", user="ng1", domain=domain)
229+
netgroup_group.add_member(host="testhost1", user="ng1", domain="ldap.test")
252230

253231
netgroup_nested = provider.netgroup("nested_group").add()
254-
netgroup_nested.add_member(host="testhost2", user="ng2", domain=domain)
255-
if use_domain:
256-
netgroup_nested.add_member(host=user, domain=f"host.{domain}")
232+
netgroup_nested.add_member(host="testhost2", user="ng2", domain="ldap.test")
233+
if domain == "host.ldap.test":
234+
netgroup_nested.add_member(host=user, domain=domain)
257235
else:
258236
netgroup_nested.add_member(user=user)
259237

@@ -268,7 +246,7 @@ def test_netgroup__lookup_nested_groups_with_host_and_domain_values_present(
268246
@pytest.mark.ticket(bz=802207)
269247
@pytest.mark.topology(KnownTopologyGroup.AnyProvider)
270248
@pytest.mark.preferred_topology(KnownTopology.LDAP)
271-
def test_netgroup__fully_qualified_names(client: Client, provider: GenericProvider):
249+
def test_netgroup__fully_qualified_names(client: Client, provider: AD | LDAP | Samba):
272250
"""
273251
:title: Netgroups with fully qualified names resolves and contains the members
274252
:setup:
@@ -282,8 +260,8 @@ def test_netgroup__fully_qualified_names(client: Client, provider: GenericProvid
282260
:customerscenario: True
283261
"""
284262
client.sssd.dom("test")["use_fully_qualified_names"] = "true"
285-
user = provider.user("user-1").add()
286-
provider.netgroup("ng-1").add().add_member(user=user)
263+
provider.user("user-1").add()
264+
provider.netgroup("ng-1").add().add_member(user="user-1")
287265
client.sssd.start()
288266

289267
result = client.tools.getent.netgroup("ng-1")
@@ -298,7 +276,7 @@ def test_netgroup__fully_qualified_names(client: Client, provider: GenericProvid
298276
@pytest.mark.topology(KnownTopology.AD)
299277
@pytest.mark.topology(KnownTopology.Samba)
300278
@pytest.mark.preferred_topology(KnownTopology.LDAP)
301-
def test_netgroup__uid_gt_2147483647(client: Client, provider: GenericProvider):
279+
def test_netgroup__uid_gt_2147483647(client: Client, provider: AD | LDAP | Samba):
302280
"""
303281
:title: SSSD resolves users and groups with id greater than 2147483647 (Integer.MAX_VALUE)
304282
:setup:
@@ -310,9 +288,6 @@ def test_netgroup__uid_gt_2147483647(client: Client, provider: GenericProvider):
310288
1. Users and groups are resolved
311289
:customerscenario: True
312290
"""
313-
if not isinstance(provider, (LDAP, Samba, AD)):
314-
pytest.skip("For ipa, 'uid': can be at most 2147483647")
315-
316291
client.sssd.start()
317292

318293
for name, uid in [("bigusera", 2147483646), ("biguserb", 2147483647), ("biguserc", 2147483648)]:
@@ -325,177 +300,10 @@ def test_netgroup__uid_gt_2147483647(client: Client, provider: GenericProvider):
325300
provider.group(name).add(gid=uid)
326301

327302
for username in ["bigusera", "biguserb", "biguserc"]:
328-
result = client.tools.getent.passwd(username)
329-
assert result is not None, f"getent passwd for user '{username}' is empty!"
330-
assert result.name == username, f"User name '{username}' did not match result '{result.name}'!"
303+
passwd_result = client.tools.getent.passwd(username)
304+
assert passwd_result is not None, f"getent passwd for user '{username}' is empty!"
305+
assert passwd_result.name == username, f"User name '{username}' did not match!"
331306
for grpname in ["biggroup1", "biggroup2", "biggroup3"]:
332-
result = client.tools.getent.group(grpname)
333-
assert result is not None, f"getent group for group '{grpname}' is empty!"
334-
assert result.name == grpname, f"Group name '{grpname}' did not match result '{result.name}'!"
335-
336-
337-
@pytest.mark.importance("high")
338-
@pytest.mark.topology(KnownTopology.LDAP)
339-
@pytest.mark.topology(KnownTopology.AD)
340-
@pytest.mark.topology(KnownTopology.Samba)
341-
@pytest.mark.preferred_topology(KnownTopology.LDAP)
342-
def test_netgroup__incomplete_triples(client: Client, provider: GenericProvider):
343-
"""
344-
:title: Netgroups with incomplete triples
345-
:description: Netgroups with incomplete triples can be created and used.
346-
:setup:
347-
1. Create an empty netgroup
348-
2. Create a netgroup with only host
349-
3. Create a netgroup with only user
350-
4. Create a netgroup with only domain
351-
5. Create a netgroup with missing host
352-
6. Create a netgroup with missing user
353-
7. Start SSSD
354-
:steps:
355-
1. Show the netgroups
356-
:expectedresults:
357-
1. Netgroups are shown and match the expectations
358-
:customerscenario: False
359-
"""
360-
if not isinstance(provider, (LDAP, Samba, AD)):
361-
pytest.skip("IPA does not support domain in netgroups")
362-
363-
domain = provider.domain
364-
365-
# (setup_params, expected_members)
366-
cases = {
367-
"ng-empty": ({}, set()),
368-
"ng-only-host": ({"host": "testhost"}, {"(testhost,-,)"}),
369-
"ng-only-user": ({"user": "testuser"}, {"(-,testuser,)"}),
370-
"ng-only-domain": ({"domain": domain}, {f"(-,-,{domain})"}),
371-
"ng-missing-host": (
372-
{"user": "testuser", "domain": domain},
373-
{f"(-,testuser,{domain})"},
374-
),
375-
"ng-missing-user": (
376-
{"host": "testhost", "domain": domain},
377-
{f"(testhost,-,{domain})"},
378-
),
379-
"ng-missing-domain": (
380-
{"host": "testhost", "user": "testuser"},
381-
{"(testhost,testuser,)"},
382-
),
383-
}
384-
385-
for name, (params, _) in cases.items():
386-
ng = provider.netgroup(name).add()
387-
if params:
388-
ng.add_member(**params)
389-
390-
client.sssd.start()
391-
392-
for name, (_, expected) in cases.items():
393-
result = client.tools.getent.netgroup(name)
394-
assert result is not None, f"Netgroup '{name}' not found!"
395-
assert result.name == name
396-
actual = {str(m) for m in result.members}
397-
assert actual == expected, f"Netgroup '{name}': expected {expected}, got {actual}"
398-
399-
400-
@pytest.mark.importance("high")
401-
@pytest.mark.topology(KnownTopology.LDAP)
402-
@pytest.mark.topology(KnownTopology.AD)
403-
@pytest.mark.topology(KnownTopology.Samba)
404-
@pytest.mark.preferred_topology(KnownTopology.LDAP)
405-
def test_netgroups__complex_hierarchy(client: Client, provider: GenericProvider):
406-
"""
407-
:title: Complex netgroup hierarchy
408-
:description: Netgroups with multiple levels of nesting work correctly
409-
:setup:
410-
1. Create multiple netgroups with various combinations of triples
411-
and nested members
412-
2. Create complex hierarchy with mixed triples and netgroup members
413-
3. Start SSSD
414-
:steps:
415-
1. Query each netgroup in the hierarchy
416-
:expectedresults:
417-
1. Each netgroup returns correct combination of direct triples
418-
and inherited members
419-
:customerscenario: False
420-
"""
421-
# Hierarchy:
422-
# ng-top -> ng-mid1 -> ng-base1
423-
# -> ng-mid2 -> ng-base2
424-
# -> ng-base3
425-
426-
if not isinstance(provider, (LDAP, Samba, AD)):
427-
pytest.skip("IPA does not support domain in netgroups")
428-
429-
domain = provider.domain
430-
431-
# Level 1: Base netgroups with only triples (no nested members)
432-
ng_base1 = provider.netgroup("ng-base1").add()
433-
ng_base1.add_member(host="host1", user="user1", domain=domain)
434-
435-
ng_base2 = provider.netgroup("ng-base2").add()
436-
ng_base2.add_member(host="host2", user="user2", domain=domain)
437-
438-
ng_base3 = provider.netgroup("ng-base3").add()
439-
ng_base3.add_member(user="user3")
440-
441-
# Level 2: Mid-level netgroups with both triples and nested members
442-
ng_mid1 = provider.netgroup("ng-mid1").add()
443-
ng_mid1.add_member(host="host4", user="user4", domain=domain)
444-
ng_mid1.add_member(ng=ng_base1)
445-
446-
ng_mid2 = provider.netgroup("ng-mid2").add()
447-
ng_mid2.add_member(user="user5")
448-
ng_mid2.add_member(ng=ng_base2)
449-
ng_mid2.add_member(ng=ng_base3)
450-
451-
# Level 3: Top-level netgroup containing mid-level netgroups
452-
ng_top = provider.netgroup("ng-top").add()
453-
ng_top.add_member(host="host6", user="user6", domain=domain)
454-
ng_top.add_member(ng=ng_mid1)
455-
ng_top.add_member(ng=ng_mid2)
456-
457-
client.sssd.start()
458-
459-
# Verify base netgroups (Level 1)
460-
base_expectations = {
461-
"ng-base1": {f"(host1,user1,{domain})"},
462-
"ng-base2": {f"(host2,user2,{domain})"},
463-
"ng-base3": {"(-,user3,)"},
464-
}
465-
for name, expected in base_expectations.items():
466-
result = client.tools.getent.netgroup(name)
467-
assert result is not None, f"Netgroup '{name}' not found!"
468-
actual = {str(m) for m in result.members}
469-
assert actual == expected, f"Netgroup '{name}' members mismatch. " f"Expected: {expected}, Got: {actual}"
470-
471-
# Verify mid-level netgroups (Level 2)
472-
mid_expectations = {
473-
"ng-mid1": {
474-
f"(host4,user4,{domain})",
475-
f"(host1,user1,{domain})",
476-
},
477-
"ng-mid2": {
478-
"(-,user5,)",
479-
f"(host2,user2,{domain})",
480-
"(-,user3,)",
481-
},
482-
}
483-
for name, expected in mid_expectations.items():
484-
result = client.tools.getent.netgroup(name)
485-
assert result is not None, f"Netgroup '{name}' not found!"
486-
actual = {str(m) for m in result.members}
487-
assert actual == expected, f"Netgroup '{name}' members mismatch. " f"Expected: {expected}, Got: {actual}"
488-
489-
# Verify top-level netgroup (Level 3)
490-
result = client.tools.getent.netgroup("ng-top")
491-
assert result is not None, "Netgroup 'ng-top' not found!"
492-
expected = {
493-
f"(host6,user6,{domain})",
494-
f"(host4,user4,{domain})",
495-
f"(host1,user1,{domain})",
496-
"(-,user5,)",
497-
f"(host2,user2,{domain})",
498-
"(-,user3,)",
499-
}
500-
actual = {str(m) for m in result.members}
501-
assert actual == expected, f"Netgroup 'ng-top' members mismatch. " f"Expected: {expected}, Got: {actual}"
307+
group_result = client.tools.getent.group(grpname)
308+
assert group_result is not None, f"getent group for group '{grpname}' is empty!"
309+
assert group_result.name == grpname, f"Group name '{grpname}' did not match!"

0 commit comments

Comments
 (0)