Skip to content

Commit

Permalink
Merge pull request #183 from traPtitech/feat/contest_test
Browse files Browse the repository at this point in the history
Feat/contest test
  • Loading branch information
Hosshii committed Dec 20, 2021
2 parents 66c54e1 + ed26935 commit 44052c5
Show file tree
Hide file tree
Showing 2 changed files with 155 additions and 64 deletions.
6 changes: 3 additions & 3 deletions interfaces/handler/contest.go
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ func (h *ContestHandler) GetContestTeamMember(_c echo.Context) error {
return c.JSON(http.StatusOK, res)
}

type PostContestTeamMember struct {
type PostContestTeamMemberRequest struct {
ContestID uuid.UUID `param:"contestID" validate:"is-uuid"`
TeamID uuid.UUID `param:"teamID" validate:"is-uuid"`
Members []uuid.UUID `json:"members" validate:"required"`
Expand All @@ -393,7 +393,7 @@ func (h *ContestHandler) PostContestTeamMember(_c echo.Context) error {
c := Context{_c}
ctx := c.Request().Context()
// todo contestIDが必要ない
req := PostContestTeamMember{}
req := PostContestTeamMemberRequest{}
err := c.BindAndValidate(&req)
if err != nil {
return c.String(http.StatusBadRequest, err.Error())
Expand All @@ -411,7 +411,7 @@ func (h *ContestHandler) DeleteContestTeamMember(_c echo.Context) error {
c := Context{_c}
ctx := c.Request().Context()
// todo contestIDが必要ない
req := PostContestTeamMember{} // TODO: 構造体分けたいかも
req := PostContestTeamMemberRequest{} // TODO: 構造体分けたいかも
err := c.BindAndValidate(&req)
if err != nil {
return c.String(http.StatusBadRequest, err.Error())
Expand Down
213 changes: 152 additions & 61 deletions interfaces/handler/contest_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -921,64 +921,155 @@ func TestContestHandler_GetContestTeamMember(t *testing.T) {
}
}

// func TestContestHandler_PostContestTeamMember(t *testing.T) {
// type fields struct {
// srv service.ContestService
// }
// type args struct {
// _c echo.Context
// }
// tests := []struct {
// name string
// fields fields
// args args
// setup func(f fields, args args)
// assertion assert.ErrorAssertionFunc
// }{
// // TODO: Add test cases.
// }
// for _, tt := range tests {
// t.Run(tt.name, func(t *testing.T) {
// // Setup mock
// ctrl := gomock.NewController(t)
// tt.fields = fields{
// srv: mock_service.NewMockContestService(ctrl),
// }
// tt.setup(tt.fields, tt.args)
// h := NewContestHandler(tt.fields.srv)
// // Assertion
// tt.assertion(t, h.PostContestTeamMember(tt.args._c))
// })
// }
// }

// func TestContestHandler_DeleteContestTeamMember(t *testing.T) {
// type fields struct {
// srv service.ContestService
// }
// type args struct {
// _c echo.Context
// }
// tests := []struct {
// name string
// fields fields
// args args
// setup func(f fields, args args)
// assertion assert.ErrorAssertionFunc
// }{
// // TODO: Add test cases.
// }
// for _, tt := range tests {
// t.Run(tt.name, func(t *testing.T) {
// // Setup mock
// ctrl := gomock.NewController(t)
// tt.fields = fields{
// srv: mock_service.NewMockContestService(ctrl),
// }
// tt.setup(tt.fields, tt.args)
// h := NewContestHandler(tt.fields.srv)
// // Assertion
// tt.assertion(t, h.DeleteContestTeamMember(tt.args._c))
// })
// }
// }
func TestContestHandler_PostContestTeamMember(t *testing.T) {
t.Parallel()

type Req struct {
Members []uuid.UUID `json:"members"`
}
tests := []struct {
name string
setup func(th *handler.TestHandlers) (reqBody *Req, path string)
statusCode int
}{
{
name: "Success",
setup: func(th *handler.TestHandlers) (*Req, string) {
contestID := random.UUID()
teamID := random.UUID()
reqBody := &Req{
Members: []uuid.UUID{
random.UUID(),
random.UUID(),
},
}
th.Service.MockContestService.EXPECT().AddContestTeamMembers(gomock.Any(), teamID, reqBody.Members).Return(nil)
return reqBody, fmt.Sprintf("/api/v1/contests/%s/teams/%s/members", contestID, teamID)
},
statusCode: http.StatusNoContent,
},
{
name: "BadRequest: Invalid contest ID",
setup: func(th *handler.TestHandlers) (*Req, string) {
teamID := random.UUID()
return nil, fmt.Sprintf("/api/v1/contests/%s/teams/%s/members", invalidID, teamID)
},
statusCode: http.StatusBadRequest,
},
{
name: "BadRequest: Invalid team ID",
setup: func(th *handler.TestHandlers) (*Req, string) {
contestID := random.UUID()
return nil, fmt.Sprintf("/api/v1/contests/%s/teams/%s/members", contestID, invalidID)
},
statusCode: http.StatusBadRequest,
},
{
name: "Contest or team not exist",
setup: func(th *handler.TestHandlers) (*Req, string) {
contestID := random.UUID()
teamID := random.UUID()
reqBody := &Req{
Members: []uuid.UUID{
random.UUID(),
random.UUID(),
},
}
th.Service.MockContestService.EXPECT().AddContestTeamMembers(gomock.Any(), teamID, reqBody.Members).Return(repository.ErrNotFound)
return reqBody, fmt.Sprintf("/api/v1/contests/%s/teams/%s/members", contestID, teamID)
},
statusCode: http.StatusNotFound,
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
// Setup mock
ctrl := gomock.NewController(t)
handlers := SetupTestHandlers(t, ctrl)

reqBody, path := tt.setup(&handlers)

statusCode, _ := doRequest(t, handlers.API, http.MethodPost, path, reqBody, nil)

// Assertion
assert.Equal(t, tt.statusCode, statusCode)
})
}
}

func TestContestHandler_DeleteContestTeamMember(t *testing.T) {
t.Parallel()

type Req struct {
Members []uuid.UUID `json:"members"`
}
tests := []struct {
name string
setup func(th *handler.TestHandlers) (*Req, string)
statusCode int
}{
{
name: "Success",
setup: func(th *handler.TestHandlers) (*Req, string) {
contestID := random.UUID()
teamID := random.UUID()
reqBody := &Req{
Members: []uuid.UUID{
random.UUID(),
random.UUID(),
},
}
th.Service.MockContestService.EXPECT().DeleteContestTeamMembers(gomock.Any(), teamID, reqBody.Members).Return(nil)
return reqBody, fmt.Sprintf("/api/v1/contests/%s/teams/%s/members", contestID, teamID)
},
statusCode: http.StatusNoContent,
},
{
name: "BadRequest: Invalid contest ID",
setup: func(th *handler.TestHandlers) (*Req, string) {
teamID := random.UUID()
return nil, fmt.Sprintf("/api/v1/contests/%s/teams/%s/members", invalidID, teamID)
},
statusCode: http.StatusBadRequest,
},
{
name: "BadRequest: Invalid team ID",
setup: func(th *handler.TestHandlers) (*Req, string) {
contestID := random.UUID()
return nil, fmt.Sprintf("/api/v1/contests/%s/teams/%s/members", contestID, invalidID)
},
statusCode: http.StatusBadRequest,
},
{
name: "Contest or team not exist",
setup: func(th *handler.TestHandlers) (*Req, string) {
contestID := random.UUID()
teamID := random.UUID()
reqBody := &Req{
Members: []uuid.UUID{
random.UUID(),
random.UUID(),
},
}
th.Service.MockContestService.EXPECT().DeleteContestTeamMembers(gomock.Any(), teamID, reqBody.Members).Return(repository.ErrNotFound)
return reqBody, fmt.Sprintf("/api/v1/contests/%s/teams/%s/members", contestID, teamID)
},
statusCode: http.StatusNotFound,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Setup mock
ctrl := gomock.NewController(t)
handlers := SetupTestHandlers(t, ctrl)

reqBody, path := tt.setup(&handlers)

statusCode, _ := doRequest(t, handlers.API, http.MethodDelete, path, reqBody, nil)

// Assertion
assert.Equal(t, tt.statusCode, statusCode)
})
}
}

0 comments on commit 44052c5

Please sign in to comment.