Skip to content

Commit c37f778

Browse files
authored
Add: bulk modify DN (#908)
1 parent 3871a03 commit c37f778

3 files changed

Lines changed: 91 additions & 1 deletion

File tree

app/api/main/router.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,18 @@ async def modify_dn(
111111
return await request.handle_api(req.state.dishka_container)
112112

113113

114+
@entry_router.post("/update_many/dn", error_map=error_map)
115+
async def modify_dn_many(
116+
requests: list[ModifyDNRequest],
117+
req: Request,
118+
) -> list[LDAPResult]:
119+
"""LDAP MODIFY entry DN request."""
120+
results = []
121+
for request in requests:
122+
results.append(await request.handle_api(req.state.dishka_container))
123+
return results
124+
125+
114126
@entry_router.delete("/delete", error_map=error_map)
115127
async def delete(
116128
request: DeleteRequest,

interface

tests/test_api/test_main/test_router/test_modify_dn.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,3 +540,81 @@ async def test_api_update_dn_invalid_new_superior(
540540

541541
assert isinstance(data, dict)
542542
assert data.get("resultCode") == LDAPCodes.INVALID_DN_SYNTAX
543+
544+
545+
@pytest.mark.asyncio
546+
@pytest.mark.usefixtures("adding_test_user")
547+
@pytest.mark.usefixtures("setup_session")
548+
@pytest.mark.usefixtures("session")
549+
async def test_api_modify_dn_many(http_client: AsyncClient) -> None:
550+
"""Test API for bulk modify DN."""
551+
entry_dn_1 = "cn=test,dc=md,dc=test"
552+
entry_dn_2 = "cn=test2,dc=md,dc=test"
553+
554+
response = await http_client.post(
555+
"/entry/add",
556+
json={
557+
"entry": entry_dn_2,
558+
"password": None,
559+
"attributes": [
560+
{"type": "name", "vals": ["test2"]},
561+
{"type": "cn", "vals": ["test2"]},
562+
{"type": "objectClass", "vals": ["organization", "top"]},
563+
],
564+
},
565+
)
566+
assert response.json()["resultCode"] == LDAPCodes.SUCCESS
567+
568+
response = await http_client.post(
569+
"/entry/update_many/dn",
570+
json=[
571+
{
572+
"entry": entry_dn_1,
573+
"newrdn": "cn=test",
574+
"deleteoldrdn": True,
575+
"new_superior": "ou=testModifyDn1,dc=md,dc=test",
576+
},
577+
{
578+
"entry": entry_dn_2,
579+
"newrdn": "cn=test2",
580+
"deleteoldrdn": True,
581+
"new_superior": "ou=testModifyDn1,dc=md,dc=test",
582+
},
583+
],
584+
)
585+
586+
data = response.json()
587+
assert all(
588+
result.get("resultCode") == LDAPCodes.SUCCESS for result in data
589+
)
590+
591+
592+
@pytest.mark.asyncio
593+
@pytest.mark.usefixtures("adding_test_user")
594+
@pytest.mark.usefixtures("setup_session")
595+
@pytest.mark.usefixtures("session")
596+
async def test_api_modify_dn_many_with_error(http_client: AsyncClient) -> None:
597+
"""Test bulk modify DN with one invalid entry."""
598+
entry_dn = "cn=test,dc=md,dc=test"
599+
600+
response = await http_client.post(
601+
"/entry/update_many/dn",
602+
json=[
603+
{
604+
"entry": entry_dn,
605+
"newrdn": "cn=test",
606+
"deleteoldrdn": True,
607+
"new_superior": "ou=testModifyDn1,dc=md,dc=test",
608+
},
609+
{
610+
"entry": "cn=nonExistent,dc=md,dc=test",
611+
"newrdn": "cn=nonExistent",
612+
"deleteoldrdn": True,
613+
"new_superior": "dc=md,dc=test",
614+
},
615+
],
616+
)
617+
618+
data = response.json()
619+
assert data[0].get("resultCode") == LDAPCodes.SUCCESS
620+
assert data[1].get("resultCode") == LDAPCodes.NO_SUCH_OBJECT

0 commit comments

Comments
 (0)