Skip to content

Commit

Permalink
Feature/mx 1660 ldap search endpoint (#294)
Browse files Browse the repository at this point in the history
# PR Context
<!-- Additional info for the reviewer -->
-  LDAP search endpoint in mex-backend
- mex-backend has a new search endpoint returning ldap persons
# Added
<!-- New features and interfaces -->
- extract ldap: get_persons methods and tests

# Changes
<!-- Changes in existing functionality -->

# Deprecated
<!-- Soon-to-be removed features -->

# Removed
<!-- Definitely removed features -->

# Fixed
<!-- Fixed bugs -->

# Security
<!-- Fixed vulnerabilities -->

---------

Signed-off-by: vyvytranngoc <[email protected]>
Co-authored-by: Nicolas Drebenstedt <[email protected]>
  • Loading branch information
vyvytranngoc and cutoffthetop authored Oct 1, 2024
1 parent a0181bf commit d581817
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Added
- added methods for extracting persons by name or ID from ldap

- `contains_only_types` to check if fields are annotated as desired
- `group_fields_by_class_name` utility to simplify filtered model/field lookups
Expand Down
41 changes: 40 additions & 1 deletion mex/common/ldap/extract.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from collections import defaultdict
from collections.abc import Iterable
from collections.abc import Generator, Iterable

from mex.common.identity import get_provider
from mex.common.ldap.connector import LDAPConnector
from mex.common.ldap.models.person import LDAPPerson, LDAPPersonWithQuery
from mex.common.models import ExtractedPrimarySource
from mex.common.types import MergedPersonIdentifier
Expand Down Expand Up @@ -111,3 +112,41 @@ def get_merged_ids_by_query_string(
MergedPersonIdentifier(identities[0].stableTargetId)
)
return merged_ids_by_attribute


def get_persons_by_name(
surname: str = "*",
given_name: str = "*",
**filters: str,
) -> Generator[LDAPPerson, None, None]:
"""Get all ldap persons matching the filters.
Args:
given_name: Given name of a person, defaults to non-null.
surname: Surname of a person, defaults to non-null.
**filters: Additional filters.
Returns:
Generator for LDAP persons.
"""
connector = LDAPConnector.get()
return connector.get_persons(surname, given_name, **filters)


def get_count_of_found_persons_by_name(
surname: str = "*",
given_name: str = "*",
**filters: str,
) -> int:
"""Get total count of found ldap persons.
Args:
given_name: Given name of a person, defaults to non-null.
surname: Surname of a person, defaults to non-null.
**filters: Additional filters.
Returns:
count of found persons.
"""
connector = LDAPConnector.get()
return len(list(connector.get_persons(surname, given_name, **filters)))
35 changes: 35 additions & 0 deletions tests/ldap/test_extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@
from mex.common.identity import get_provider
from mex.common.ldap.extract import (
_get_merged_ids_by_attribute,
get_count_of_found_persons_by_name,
get_merged_ids_by_email,
get_merged_ids_by_employee_ids,
get_merged_ids_by_query_string,
get_persons_by_name,
)
from mex.common.ldap.models.person import LDAPPerson, LDAPPersonWithQuery
from mex.common.models import ExtractedPrimarySource
from mex.common.types import Identifier
from tests.ldap.conftest import SAMPLE_PERSON_ATTRS, LDAPMocker


@pytest.fixture
Expand Down Expand Up @@ -173,3 +176,35 @@ def test_get_merged_ids_by_query_string(
ldap_persons_with_query, ldap_primary_source
)
assert merged_ids_by_query_string == expected


def test_get_persons_by_name_mocked(ldap_mocker: LDAPMocker) -> None:
ldap_mocker([[SAMPLE_PERSON_ATTRS]])
persons = get_persons_by_name(surname="Sample", given_name="Sam")
persons_list = list(persons)
expected = {
"company": "RKI",
"department": "XY",
"departmentNumber": "XY2",
"displayName": "Sample, Sam",
"employeeID": "1024",
"givenName": ["Sam"],
"mail": ["[email protected]"],
"objectGUID": UUID("00000000-0000-4000-8000-000000000000"),
"ou": ["XY"],
"sAMAccountName": "SampleS",
"sn": "Sample",
}
assert len(persons_list) == 1
assert (
persons_list[0].model_dump(exclude_none=True)["givenName"]
== expected["givenName"]
)


def test_get_count_of_found_persons_by_name_mocked(ldap_mocker: LDAPMocker) -> None:
ldap_mocker([[SAMPLE_PERSON_ATTRS]])
persons_count = get_count_of_found_persons_by_name(
surname="Sample", given_name="Sam"
)
assert persons_count == 1

0 comments on commit d581817

Please sign in to comment.