From 610ad7ddd0b8433238b707b2156338e6b8e07a90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Franke?= Date: Mon, 30 Jan 2023 11:55:23 +0100 Subject: [PATCH] Add tests for service handlers. --- .../graph/pkg/service/v0/educationschools.go | 4 +- .../pkg/service/v0/educationschools_test.go | 105 ++++++++++++++++++ services/graph/pkg/service/v0/service.go | 3 + 3 files changed, 110 insertions(+), 2 deletions(-) diff --git a/services/graph/pkg/service/v0/educationschools.go b/services/graph/pkg/service/v0/educationschools.go index 164796ad7..e54dc0bf6 100644 --- a/services/graph/pkg/service/v0/educationschools.go +++ b/services/graph/pkg/service/v0/educationschools.go @@ -535,7 +535,7 @@ func (g Graph) PostEducationSchoolClass(w http.ResponseWriter, r *http.Request) render.NoContent(w, r) } -// DeleteEducationSchoolUser implements the Service interface. +// DeleteEducationSchoolClass implements the Service interface. func (g Graph) DeleteEducationSchoolClass(w http.ResponseWriter, r *http.Request) { logger := g.logger.SubloggerWithRequestID(r.Context()) logger.Info().Msg("calling delete school class") @@ -567,7 +567,7 @@ func (g Graph) DeleteEducationSchoolClass(w http.ResponseWriter, r *http.Request errorcode.InvalidRequest.Render(w, r, http.StatusBadRequest, "missing class id") return } - logger.Debug().Str("schoolID", schoolID).Str("userID", classID).Msg("calling delete class on backend") + logger.Debug().Str("schoolID", schoolID).Str("classID", classID).Msg("calling delete class on backend") err = g.identityEducationBackend.RemoveClassFromEducationSchool(r.Context(), schoolID, classID) if err != nil { diff --git a/services/graph/pkg/service/v0/educationschools_test.go b/services/graph/pkg/service/v0/educationschools_test.go index 226aa6278..4a30b407f 100644 --- a/services/graph/pkg/service/v0/educationschools_test.go +++ b/services/graph/pkg/service/v0/educationschools_test.go @@ -483,4 +483,109 @@ var _ = Describe("Schools", func() { identityEducationBackend.AssertNumberOfCalls(GinkgoT(), "RemoveUserFromEducationSchool", 1) }) }) + + Describe("GetEducationSchoolClasses", func() { + It("gets the list of classes", func() { + class := libregraph.NewEducationClassWithDefaults() + class.SetId("class") + identityEducationBackend.On("GetEducationSchoolClasses", mock.Anything, *newSchool.Id).Return([]*libregraph.EducationClass{class}, nil) + + r := httptest.NewRequest(http.MethodGet, "/graph/v1.0/education/schools/{schoolID}/classes", nil) + rctx := chi.NewRouteContext() + rctx.URLParams.Add("schoolID", *newSchool.Id) + r = r.WithContext(context.WithValue(ctxpkg.ContextSetUser(ctx, currentUser), chi.RouteCtxKey, rctx)) + svc.GetEducationSchoolClasses(rr, r) + Expect(rr.Code).To(Equal(http.StatusOK)) + + data, err := io.ReadAll(rr.Body) + Expect(err).ToNot(HaveOccurred()) + + var members []*libregraph.User + err = json.Unmarshal(data, &members) + Expect(err).ToNot(HaveOccurred()) + + Expect(len(members)).To(Equal(1)) + Expect(members[0].GetId()).To(Equal("class")) + }) + }) + + Describe("PostEducationSchoolClasses", func() { + It("fails on invalid body", func() { + r := httptest.NewRequest(http.MethodPost, "/graph/v1.0/education/schools/{schoolID}/classes", bytes.NewBufferString("{invalid")) + rctx := chi.NewRouteContext() + rctx.URLParams.Add("schoolID", *newSchool.Id) + r = r.WithContext(context.WithValue(ctxpkg.ContextSetUser(ctx, currentUser), chi.RouteCtxKey, rctx)) + svc.PostEducationSchoolClass(rr, r) + Expect(rr.Code).To(Equal(http.StatusBadRequest)) + }) + + It("fails on missing member refs", func() { + member := libregraph.NewMemberReference() + data, err := json.Marshal(member) + Expect(err).ToNot(HaveOccurred()) + + r := httptest.NewRequest(http.MethodPost, "/graph/v1.0/education/schools/{schoolID}/classes", bytes.NewBuffer(data)) + rctx := chi.NewRouteContext() + rctx.URLParams.Add("schoolID", *newSchool.Id) + r = r.WithContext(context.WithValue(ctxpkg.ContextSetUser(ctx, currentUser), chi.RouteCtxKey, rctx)) + svc.PostEducationSchoolClass(rr, r) + Expect(rr.Code).To(Equal(http.StatusBadRequest)) + }) + + It("fails on invalid class refs", func() { + class := libregraph.NewMemberReference() + class.SetOdataId("/invalidtype/class") + data, err := json.Marshal(class) + Expect(err).ToNot(HaveOccurred()) + + r := httptest.NewRequest(http.MethodPost, "/graph/v1.0/education/schools/{schoolID}/classesa", bytes.NewBuffer(data)) + rctx := chi.NewRouteContext() + rctx.URLParams.Add("schoolID", *newSchool.Id) + r = r.WithContext(context.WithValue(ctxpkg.ContextSetUser(ctx, currentUser), chi.RouteCtxKey, rctx)) + svc.PostEducationSchoolUser(rr, r) + Expect(rr.Code).To(Equal(http.StatusBadRequest)) + }) + + It("adds a new class", func() { + member := libregraph.NewMemberReference() + member.SetOdataId("/classes/class") + data, err := json.Marshal(member) + Expect(err).ToNot(HaveOccurred()) + identityEducationBackend.On("AddClassesToEducationSchool", mock.Anything, *newSchool.Id, []string{"class"}).Return(nil) + + r := httptest.NewRequest(http.MethodPost, "/graph/v1.0/education/schools/{schoolID}/members", bytes.NewBuffer(data)) + rctx := chi.NewRouteContext() + rctx.URLParams.Add("schoolID", *newSchool.Id) + r = r.WithContext(context.WithValue(ctxpkg.ContextSetUser(ctx, currentUser), chi.RouteCtxKey, rctx)) + svc.PostEducationSchoolClass(rr, r) + Expect(rr.Code).To(Equal(http.StatusNoContent)) + + identityEducationBackend.AssertNumberOfCalls(GinkgoT(), "AddClassesToEducationSchool", 1) + }) + }) + + Describe("DeleteEducationSchoolClass", func() { + It("handles missing or empty member id", func() { + r := httptest.NewRequest(http.MethodDelete, "/graph/v1.0/education/schools/{schoolID}/classes/{classID}/$ref", nil) + rctx := chi.NewRouteContext() + rctx.URLParams.Add("schoolID", *newSchool.Id) + r = r.WithContext(context.WithValue(ctxpkg.ContextSetUser(ctx, currentUser), chi.RouteCtxKey, rctx)) + svc.DeleteEducationSchoolClass(rr, r) + Expect(rr.Code).To(Equal(http.StatusBadRequest)) + }) + + It("deletes members", func() { + identityEducationBackend.On("RemoveClassFromEducationSchool", mock.Anything, *newSchool.Id, "/classes/class1").Return(nil) + + r := httptest.NewRequest(http.MethodDelete, "/graph/v1.0/education/schools/{schoolID}/classes/{classID}/$ref", nil) + rctx := chi.NewRouteContext() + rctx.URLParams.Add("schoolID", *newSchool.Id) + rctx.URLParams.Add("classID", "/classes/class1") + r = r.WithContext(context.WithValue(ctxpkg.ContextSetUser(ctx, currentUser), chi.RouteCtxKey, rctx)) + svc.DeleteEducationSchoolClass(rr, r) + Expect(rr.Code).To(Equal(http.StatusNoContent)) + + identityEducationBackend.AssertNumberOfCalls(GinkgoT(), "RemoveClassFromEducationSchool", 1) + }) + }) }) diff --git a/services/graph/pkg/service/v0/service.go b/services/graph/pkg/service/v0/service.go index 9ebb5000e..d535a1e4a 100644 --- a/services/graph/pkg/service/v0/service.go +++ b/services/graph/pkg/service/v0/service.go @@ -65,6 +65,9 @@ type Service interface { GetEducationSchoolUsers(http.ResponseWriter, *http.Request) PostEducationSchoolUser(http.ResponseWriter, *http.Request) DeleteEducationSchoolUser(http.ResponseWriter, *http.Request) + GetEducationSchoolClasses(http.ResponseWriter, *http.Request) + PostEducationSchoolClass(http.ResponseWriter, *http.Request) + DeleteEducationSchoolClass(http.ResponseWriter, *http.Request) GetEducationClasses(http.ResponseWriter, *http.Request) GetEducationClass(http.ResponseWriter, *http.Request)