From 6136d2d355e9e4830d2f6458bc6a9ed84d2909ed Mon Sep 17 00:00:00 2001
From: Marcus <marcus@hardt-it.de>
Date: Tue, 5 Sep 2023 15:23:51 +0200
Subject: [PATCH] add tests for regex mapping

---
 tests/userinfo.py | 172 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 170 insertions(+), 2 deletions(-)

diff --git a/tests/userinfo.py b/tests/userinfo.py
index 91cc524..4586c85 100644
--- a/tests/userinfo.py
+++ b/tests/userinfo.py
@@ -1,3 +1,4 @@
+# vim: tw=100 foldmethod=expr
 import pytest
 from unittest import mock
 from itertools import repeat
@@ -259,6 +260,113 @@ def test_eppn(userinfo, eppn):
             ],
         ),
         (settings.INPUT_EGI, []),
+        (
+            settings.INPUT_EGI_MANYGROUPS,
+            [
+                "egi-eu_covid19-eosc-synergy-eu_admins",
+                "egi-eu_covid19-eosc-synergy-eu_admins",
+                "egi-eu_cryoem-instruct-eric-eu_admins",
+                "egi-eu_cryoem-instruct-eric-eu_admins",
+                "egi-eu_eosc-synergy-eu_admins",
+                "egi-eu_eosc-synergy-eu_admins",
+                "egi-eu_eosc-synergy-eu",
+                "egi-eu_eosc-synergy-eu",
+                "egi-eu_goc-egi-eu",
+                "egi-eu_goc-egi-eu",
+                "egi-eu_mteam-data-kit-edu_admins",
+                "egi-eu_mteam-data-kit-edu_admins",
+                "egi-eu_mteam-data-kit-edu_perfmon-m-d-k-e_admins",
+                "egi-eu_mteam-data-kit-edu_perfmon-m-d-k-e",
+                "egi-eu_mteam-data-kit-edu",
+                "egi-eu_mteam-data-kit-edu",
+                "egi-eu_o3as-data-kit-edu_admins",
+                "egi-eu_o3as-data-kit-edu_admins",
+                "egi-eu_o3as-data-kit-edu",
+                "egi-eu_o3as-data-kit-edu",
+                "egi-eu_registry_perfmon",
+                "egi-eu_registry_perfmon",
+                "egi-eu_saps-vo-i3m-upv-es_admins",
+                "egi-eu_saps-vo-i3m-upv-es_admins",
+                "egi-eu_umsa-cerit-sc-cz_admins",
+                "egi-eu_umsa-cerit-sc-cz_admins",
+                "egi-eu_university-eosc-synergy-eu_admins",
+                "egi-eu_university-eosc-synergy-eu_admins",
+                "egi-eu_university-eosc-synergy-eu",
+                "egi-eu_university-eosc-synergy-eu",
+                "egi-eu_worsica-vo-incd-pt",
+                "egi-eu_worsica-vo-incd-pt",
+            ],
+        ),
+        (settings.INPUT_DEEP_IAM, ["kit-cloud"]),
+        (settings.INPUT_INDIGO_IAM, ["users", "developers", "test-vo-users"]),
+        (
+            settings.INPUT_KIT,
+            [
+                "kit-edu_dfn-slcs",
+                "kit-edu_lsdf-dis",
+                "kit-edu_bw_grid",
+                "kit-edu_bw_lsdf-fs",
+                "kit-edu_bw_uni_cluster",
+                "kit-edu_bwsyncnshare",
+                "kit-edu_bwsyncnshare-idm",
+                "kit-edu_gruppenverwalter",
+            ],
+        ),
+    ],
+)
+def test_groups_classic(userinfo, groups):
+    assert sorted(userinfo.groups) == sorted(set(groups))
+
+
+@pytest.mark.parametrize(
+    "data,groups",
+    [
+        (
+            settings.INPUT_UNITY,
+            [
+                "h-df-de_imk-tro-ewcc",
+                "h-df-de_my_example_colab",
+                "h-df-de_wlcg-test",
+                "h-df-de_hdf",
+            ],
+        ),
+        (settings.INPUT_EGI, []),
+        (
+            settings.INPUT_EGI_MANYGROUPS,
+            [
+                "egi-eu_covid19-eosc-synergy-eu_admins",
+                "egi-eu_covid19-eosc-synergy-eu_admins",
+                "egi-eu_cryoem-instruct-eric-eu_admins",
+                "egi-eu_cryoem-instruct-eric-eu_admins",
+                "egi-eu_eosc-synergy-eu_admins",
+                "egi-eu_eosc-synergy-eu_admins",
+                "egi-eu_eosc-synergy-eu",
+                "egi-eu_eosc-synergy-eu",
+                "egi-eu_goc-egi-eu",
+                "egi-eu_goc-egi-eu",
+                "egi-eu_mteam-data-kit-edu_admins",
+                "egi-eu_mteam-data-kit-edu_admins",
+                "egi-eu_mteam-data-kit-edu_perfmon-m-d-k-e_admins",
+                "egi-eu_mteam-data-kit-edu_perfmon-m-d-k-e",
+                "egi-eu_mteam-data-kit-edu",
+                "egi-eu_mteam-data-kit-edu",
+                "egi-eu_o3as-data-kit-edu_admins",
+                "egi-eu_o3as-data-kit-edu_admins",
+                "egi-eu_o3as-data-kit-edu",
+                "egi-eu_o3as-data-kit-edu",
+                "egi-eu_registry_perfmon",
+                "egi-eu_registry_perfmon",
+                "egi-eu_saps-vo-i3m-upv-es_admins",
+                "egi-eu_saps-vo-i3m-upv-es_admins",
+                "egi-eu_umsa-cerit-sc-cz_admins",
+                "egi-eu_umsa-cerit-sc-cz_admins",
+                "egi-eu_university-eosc-synergy-eu_admins",
+                "egi-eu_university-eosc-synergy-eu",
+                "egi-eu_university-eosc-synergy-eu",
+                "egi-eu_worsica-vo-incd-pt",
+                "egi-eu_worsica-vo-incd-pt",
+            ],
+        ),
         (settings.INPUT_DEEP_IAM, ["kit-cloud"]),
         (settings.INPUT_INDIGO_IAM, ["users", "developers", "test-vo-users"]),
         (
@@ -276,10 +384,70 @@ def test_eppn(userinfo, eppn):
         ),
     ],
 )
-def test_groups(userinfo, groups):
+def test_groups_regex_1(userinfo, groups, monkeypatch):
+    monkeypatch.setattr(
+        "ldf_adapter.backend.local_unix.CONFIG.groups.method",
+        "regex",
+    )
+    monkeypatch.setattr(
+        "ldf_adapter.backend.local_unix.CONFIG.groups.map",
+        r"""
+        :role=(owner|member|vm_operator) -> # remove all role=member and role=owner entries
+        :role= -> : # all other roles: map to :
+        urn:geant:kit.edu:group: -> kit-edu_
+        urn:mace:egi.eu:group: -> egi-eu_
+        :perfmon -> _perfmon
+        urn:geant:h-df.de:group: -> h-df-de_
+        :admins -> _admins
+        """,
+    )
+    assert sorted(set(userinfo.groups)) == sorted(set(groups))
     assert sorted(userinfo.groups) == sorted(groups)
 
 
+@pytest.mark.parametrize(
+    "data,groups",
+    [
+        (
+            settings.INPUT_UNITY,
+            [
+                "this-is-a-test",
+            ],
+        ),
+        (settings.INPUT_EGI, []),
+        (
+            settings.INPUT_EGI_MANYGROUPS,
+            [
+                "this-is-a-test",
+            ],
+        ),
+        (
+            settings.INPUT_DEEP_IAM,
+            ["kit-cloud"],
+        ),  # group entries are (currently) not mapped
+        (settings.INPUT_INDIGO_IAM, ["developers", "test-vo-users", "users"]),
+        (
+            settings.INPUT_KIT,
+            [
+                "this-is-a-test",
+            ],
+        ),
+    ],
+)
+def test_groups_regex_2(userinfo, groups, monkeypatch):
+    monkeypatch.setattr(
+        "ldf_adapter.backend.local_unix.CONFIG.groups.method",
+        "regex",
+    )
+    monkeypatch.setattr(
+        "ldf_adapter.backend.local_unix.CONFIG.groups.map",
+        r"""
+        ^.* -> this-is-a-test
+        """,
+    )
+    assert sorted(set(userinfo.groups)) == sorted(set(groups))
+
+
 @mock.patch("ldf_adapter.userinfo.CONFIG.ldf_adapter.fallback_group", "nogroup")
 @mock.patch("ldf_adapter.userinfo.CONFIG.ldf_adapter.primary_group", "mytestgroup")
 @pytest.mark.parametrize("data", settings.ALL_INPUT)
@@ -299,7 +467,7 @@ def test_primary_group_primary_and_fallback_configured(userinfo):
     ],
 )
 def test_primary_group_no_fallback_or_primary_configured(userinfo, group):
-    logger.warning(F"userinfo.primary_group: {userinfo.primary_group} group: {group}")
+    logger.warning(f"userinfo.primary_group: {userinfo.primary_group} group: {group}")
     assert userinfo.primary_group == group
 
 
-- 
GitLab