Skip to content

Commit d250fe0

Browse files
committed
Add code from PR amitshekhariitbhu#12 - Add test for task controller
1 parent e852aca commit d250fe0

File tree

1 file changed

+182
-0
lines changed

1 file changed

+182
-0
lines changed
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
package controller_test
2+
3+
import (
4+
"encoding/json"
5+
"errors"
6+
"net/http"
7+
"net/http/httptest"
8+
"net/url"
9+
"strings"
10+
"testing"
11+
12+
"github.com/amitshekhariitbhu/go-backend-clean-architecture/api/controller"
13+
"github.com/amitshekhariitbhu/go-backend-clean-architecture/domain"
14+
"github.com/amitshekhariitbhu/go-backend-clean-architecture/domain/mocks"
15+
"github.com/gin-gonic/gin"
16+
"github.com/stretchr/testify/assert"
17+
"github.com/stretchr/testify/mock"
18+
"go.mongodb.org/mongo-driver/bson/primitive"
19+
)
20+
21+
func TestCreateTask(t *testing.T) {
22+
t.Run("success", func(t *testing.T) {
23+
userObjectID := primitive.NewObjectID()
24+
userID := userObjectID.Hex()
25+
26+
mockTaskUsecase := new(mocks.TaskUsecase)
27+
28+
mockTaskUsecase.On("Create", mock.Anything, mock.Anything).Return(nil)
29+
30+
gin := gin.Default()
31+
32+
rec := httptest.NewRecorder()
33+
34+
tc := &controller.TaskController{
35+
TaskUsecase: mockTaskUsecase,
36+
}
37+
38+
gin.Use(setUserID(userID))
39+
gin.POST("/task", tc.Create)
40+
41+
body, err := json.Marshal(domain.SuccessResponse{Message: "Task created successfully"})
42+
assert.NoError(t, err)
43+
44+
bodyString := string(body)
45+
46+
data := url.Values{}
47+
data.Set("title", "Test Task")
48+
req := httptest.NewRequest(http.MethodPost, "/task", strings.NewReader(data.Encode()))
49+
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
50+
gin.ServeHTTP(rec, req)
51+
52+
assert.Equal(t, http.StatusOK, rec.Code)
53+
54+
assert.Equal(t, bodyString, rec.Body.String())
55+
56+
mockTaskUsecase.AssertExpectations(t)
57+
})
58+
59+
t.Run("error", func(t *testing.T) {
60+
userObjectID := primitive.NewObjectID()
61+
userID := userObjectID.Hex()
62+
63+
mockTaskUsecase := new(mocks.TaskUsecase)
64+
65+
customErr := errors.New("Unexpected")
66+
67+
mockTaskUsecase.On("Create", mock.Anything, mock.Anything).Return(customErr)
68+
69+
gin := gin.Default()
70+
71+
rec := httptest.NewRecorder()
72+
73+
tc := &controller.TaskController{
74+
TaskUsecase: mockTaskUsecase,
75+
}
76+
77+
gin.Use(setUserID(userID))
78+
gin.POST("/task", tc.Create)
79+
80+
body, err := json.Marshal(domain.ErrorResponse{Message: customErr.Error()})
81+
assert.NoError(t, err)
82+
83+
bodyString := string(body)
84+
85+
data := url.Values{}
86+
data.Set("title", "Test Task")
87+
req := httptest.NewRequest(http.MethodPost, "/task", strings.NewReader(data.Encode()))
88+
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
89+
gin.ServeHTTP(rec, req)
90+
91+
assert.Equal(t, http.StatusInternalServerError, rec.Code)
92+
93+
assert.Equal(t, bodyString, rec.Body.String())
94+
95+
mockTaskUsecase.AssertExpectations(t)
96+
})
97+
}
98+
99+
func TestFetchTask(t *testing.T) {
100+
t.Run("success", func(t *testing.T) {
101+
userObjectID := primitive.NewObjectID()
102+
userID := userObjectID.Hex()
103+
104+
mockTasks := []domain.Task{
105+
{
106+
ID: primitive.NewObjectID(),
107+
Title: "Test Task",
108+
UserID: userObjectID,
109+
},
110+
{
111+
ID: primitive.NewObjectID(),
112+
Title: "Test Task2",
113+
UserID: userObjectID,
114+
},
115+
}
116+
117+
mockTaskUsecase := new(mocks.TaskUsecase)
118+
119+
mockTaskUsecase.On("FetchByUserID", mock.Anything, userID).Return(mockTasks, nil)
120+
121+
gin := gin.Default()
122+
123+
rec := httptest.NewRecorder()
124+
125+
tc := &controller.TaskController{
126+
TaskUsecase: mockTaskUsecase,
127+
}
128+
129+
gin.Use(setUserID(userID))
130+
gin.GET("/task", tc.Fetch)
131+
132+
body, err := json.Marshal(mockTasks)
133+
assert.NoError(t, err)
134+
135+
bodyString := string(body)
136+
137+
req := httptest.NewRequest(http.MethodGet, "/task", nil)
138+
gin.ServeHTTP(rec, req)
139+
140+
assert.Equal(t, http.StatusOK, rec.Code)
141+
142+
assert.Equal(t, bodyString, rec.Body.String())
143+
144+
mockTaskUsecase.AssertExpectations(t)
145+
})
146+
147+
t.Run("error", func(t *testing.T) {
148+
userObjectID := primitive.NewObjectID()
149+
userID := userObjectID.Hex()
150+
151+
mockTaskUsecase := new(mocks.TaskUsecase)
152+
153+
customErr := errors.New("Unexpected")
154+
155+
mockTaskUsecase.On("FetchByUserID", mock.Anything, userID).Return(nil, customErr)
156+
157+
gin := gin.Default()
158+
159+
rec := httptest.NewRecorder()
160+
161+
tc := &controller.TaskController{
162+
TaskUsecase: mockTaskUsecase,
163+
}
164+
165+
gin.Use(setUserID(userID))
166+
gin.GET("/task", tc.Fetch)
167+
168+
body, err := json.Marshal(domain.ErrorResponse{Message: customErr.Error()})
169+
assert.NoError(t, err)
170+
171+
bodyString := string(body)
172+
173+
req := httptest.NewRequest(http.MethodGet, "/task", nil)
174+
gin.ServeHTTP(rec, req)
175+
176+
assert.Equal(t, http.StatusInternalServerError, rec.Code)
177+
178+
assert.Equal(t, bodyString, rec.Body.String())
179+
180+
mockTaskUsecase.AssertExpectations(t)
181+
})
182+
}

0 commit comments

Comments
 (0)