From 3daf2c50b813597a1d3ab27240ba5397cfe653fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sw=C3=A4rd?= Date: Thu, 5 Jan 2023 12:50:33 +0700 Subject: [PATCH] Modify GetEducationSchool to accept schoolNumber as well as id --- services/graph/pkg/identity/ldap_school.go | 16 ++- .../graph/pkg/identity/ldap_school_test.go | 103 +++++++++++++++++- 2 files changed, 115 insertions(+), 4 deletions(-) diff --git a/services/graph/pkg/identity/ldap_school.go b/services/graph/pkg/identity/ldap_school.go index f344a8d043..5401b6d6ca 100644 --- a/services/graph/pkg/identity/ldap_school.go +++ b/services/graph/pkg/identity/ldap_school.go @@ -150,10 +150,10 @@ func (i *LDAP) DeleteEducationSchool(ctx context.Context, id string) error { } // GetEducationSchool implements the EducationBackend interface for the LDAP backend. -func (i *LDAP) GetEducationSchool(ctx context.Context, nameOrID string, queryParam url.Values) (*libregraph.EducationSchool, error) { +func (i *LDAP) GetEducationSchool(ctx context.Context, numberOrID string, queryParam url.Values) (*libregraph.EducationSchool, error) { logger := i.logger.SubloggerWithRequestID(ctx) logger.Debug().Str("backend", "ldap").Msg("GetEducationSchool") - e, err := i.getSchoolByID(nameOrID) + e, err := i.getSchoolByNumberOrID(numberOrID) if err != nil { return nil, err } @@ -353,6 +353,18 @@ func (i *LDAP) getSchoolByID(id string) (*ldap.Entry, error) { return i.getSchoolByFilter(filter) } +func (i *LDAP) getSchoolByNumberOrID(numberOrId string) (*ldap.Entry, error) { + numberOrId = ldap.EscapeFilter(numberOrId) + filter := fmt.Sprintf( + "(|(%s=%s)(%s=%s))", + i.educationConfig.schoolAttributeMap.id, + numberOrId, + i.educationConfig.schoolAttributeMap.schoolNumber, + numberOrId, + ) + return i.getSchoolByFilter(filter) +} + func (i *LDAP) getSchoolByFilter(filter string) (*ldap.Entry, error) { filter = fmt.Sprintf("(&%s(objectClass=%s)%s)", i.educationConfig.schoolFilter, diff --git a/services/graph/pkg/identity/ldap_school_test.go b/services/graph/pkg/identity/ldap_school_test.go index 0f1b980b24..6c77a616c4 100644 --- a/services/graph/pkg/identity/ldap_school_test.go +++ b/services/graph/pkg/identity/ldap_school_test.go @@ -115,12 +115,79 @@ func TestDeleteEducationSchool(t *testing.T) { } func TestGetEducationSchool(t *testing.T) { + tests := []struct { + name string + numberOrId string + filter string + expectedItemNotFound bool + }{ + { + name: "Test search school using schoolId", + numberOrId: "abcd-defg", + filter: "(&(objectClass=ocEducationSchool)(|(owncloudUUID=abcd-defg)(ocEducationSchoolNumber=abcd-defg)))", + expectedItemNotFound: false, + }, + { + name: "Test search school using unknown schoolId", + numberOrId: "xxxx-xxxx", + filter: "(&(objectClass=ocEducationSchool)(|(owncloudUUID=xxxx-xxxx)(ocEducationSchoolNumber=xxxx-xxxx)))", + expectedItemNotFound: true, + }, + { + name: "Test search school using schoolNumber", + numberOrId: "0123", + filter: "(&(objectClass=ocEducationSchool)(|(owncloudUUID=0123)(ocEducationSchoolNumber=0123)))", + expectedItemNotFound: false, + }, + { + name: "Test search school using unknown schoolNumber", + numberOrId: "3210", + filter: "(&(objectClass=ocEducationSchool)(|(owncloudUUID=3210)(ocEducationSchoolNumber=3210)))", + expectedItemNotFound: true, + }, + } + + for _, tt := range tests { + lm := &mocks.Client{} + sr := &ldap.SearchRequest{ + BaseDN: "", + Scope: 2, + SizeLimit: 1, + Filter: tt.filter, + Attributes: []string{"ou", "owncloudUUID", "ocEducationSchoolNumber"}, + Controls: []ldap.Control(nil), + } + if tt.expectedItemNotFound { + lm.On("Search", sr).Return(&ldap.SearchResult{Entries: []*ldap.Entry{}}, nil) + } else { + lm.On("Search", sr).Return(&ldap.SearchResult{Entries: []*ldap.Entry{schoolEntry}}, nil) + } + + b, err := getMockedBackend(lm, eduConfig, &logger) + assert.Nil(t, err) + + school, err := b.GetEducationSchool(context.Background(), tt.numberOrId, nil) + lm.AssertNumberOfCalls(t, "Search", 1) + + if tt.expectedItemNotFound { + assert.NotNil(t, err) + assert.Equal(t, "itemNotFound", err.Error()) + } else { + assert.Nil(t, err) + assert.Equal(t, "Test School", school.GetDisplayName()) + assert.Equal(t, "abcd-defg", school.GetId()) + assert.Equal(t, "0123", school.GetSchoolNumber()) + } + } +} + +func TestGetEducationSchoolOld(t *testing.T) { lm := &mocks.Client{} sr1 := &ldap.SearchRequest{ BaseDN: "", Scope: 2, SizeLimit: 1, - Filter: "(&(objectClass=ocEducationSchool)(owncloudUUID=abcd-defg))", + Filter: "(&(objectClass=ocEducationSchool)(|(owncloudUUID=abcd-defg)(ocEducationSchoolNumber=abcd-defg)))", Attributes: []string{"ou", "owncloudUUID", "ocEducationSchoolNumber"}, Controls: []ldap.Control(nil), } @@ -128,14 +195,33 @@ func TestGetEducationSchool(t *testing.T) { BaseDN: "", Scope: 2, SizeLimit: 1, - Filter: "(&(objectClass=ocEducationSchool)(owncloudUUID=xxxx-xxxx))", + Filter: "(&(objectClass=ocEducationSchool)(|(owncloudUUID=xxxx-xxxx)(ocEducationSchoolNumber=xxxx-xxxx)))", + Attributes: []string{"ou", "owncloudUUID", "ocEducationSchoolNumber"}, + Controls: []ldap.Control(nil), + } + sr3 := &ldap.SearchRequest{ + BaseDN: "", + Scope: 2, + SizeLimit: 1, + Filter: "(&(objectClass=ocEducationSchool)(|(owncloudUUID=0123)(ocEducationSchoolNumber=0123)))", + Attributes: []string{"ou", "owncloudUUID", "ocEducationSchoolNumber"}, + Controls: []ldap.Control(nil), + } + sr4 := &ldap.SearchRequest{ + BaseDN: "", + Scope: 2, + SizeLimit: 1, + Filter: "(&(objectClass=ocEducationSchool)(|(owncloudUUID=3210)(ocEducationSchoolNumber=3210)))", Attributes: []string{"ou", "owncloudUUID", "ocEducationSchoolNumber"}, Controls: []ldap.Control(nil), } lm.On("Search", sr1).Return(&ldap.SearchResult{Entries: []*ldap.Entry{schoolEntry}}, nil) lm.On("Search", sr2).Return(&ldap.SearchResult{Entries: []*ldap.Entry{}}, nil) + lm.On("Search", sr3).Return(&ldap.SearchResult{Entries: []*ldap.Entry{schoolEntry}}, nil) + lm.On("Search", sr4).Return(&ldap.SearchResult{Entries: []*ldap.Entry{}}, nil) b, err := getMockedBackend(lm, eduConfig, &logger) assert.Nil(t, err) + school, err := b.GetEducationSchool(context.Background(), "abcd-defg", nil) lm.AssertNumberOfCalls(t, "Search", 1) assert.Nil(t, err) @@ -147,6 +233,19 @@ func TestGetEducationSchool(t *testing.T) { lm.AssertNumberOfCalls(t, "Search", 2) assert.NotNil(t, err) assert.Equal(t, "itemNotFound", err.Error()) + + school, err = b.GetEducationSchool(context.Background(), "0123", nil) + lm.AssertNumberOfCalls(t, "Search", 3) + assert.Nil(t, err) + assert.Equal(t, "Test School", school.GetDisplayName()) + assert.Equal(t, "abcd-defg", school.GetId()) + assert.Equal(t, "0123", school.GetSchoolNumber()) + + school, err = b.GetEducationSchool(context.Background(), "3210", nil) + lm.AssertNumberOfCalls(t, "Search", 4) + assert.NotNil(t, err) + assert.Equal(t, "itemNotFound", err.Error()) + } func TestGetEducationSchools(t *testing.T) {