github.com/covergates/covergates@v0.2.2-0.20201009050117-42ef8a19fb95/routers/api/user/oauth_test.go (about) 1 package user_test 2 3 import ( 4 "bytes" 5 "context" 6 "encoding/json" 7 "errors" 8 "io/ioutil" 9 "mime/multipart" 10 "net/http" 11 "net/http/httptest" 12 "testing" 13 14 "github.com/covergates/covergates/core" 15 "github.com/covergates/covergates/mock" 16 "github.com/covergates/covergates/routers/api/request" 17 "github.com/covergates/covergates/routers/api/user" 18 "github.com/gin-gonic/gin" 19 "github.com/golang/mock/gomock" 20 "github.com/google/go-cmp/cmp" 21 ) 22 23 func testRequest(r *gin.Engine, req *http.Request, f func(w *httptest.ResponseRecorder)) { 24 w := httptest.NewRecorder() 25 r.ServeHTTP(w, req) 26 f(w) 27 } 28 29 func TestTokenCreate(t *testing.T) { 30 ctrl := gomock.NewController(t) 31 defer ctrl.Finish() 32 33 mockUser := &core.User{ 34 Login: "user", 35 } 36 mockToken := &core.OAuthToken{ 37 Name: "token", 38 Access: "access", 39 } 40 41 mockService := mock.NewMockOAuthService(ctrl) 42 mockService.EXPECT().CreateToken( 43 gomock.Any(), 44 gomock.Eq(mockToken.Name), 45 ).Return( 46 mockToken, nil, 47 ) 48 49 mockService.EXPECT().WithUser( 50 gomock.Any(), 51 gomock.Eq(mockUser), 52 ).Return(context.Background()) 53 54 r := gin.Default() 55 r.Use(func(c *gin.Context) { 56 request.WithUser(c, mockUser) 57 }) 58 59 r.POST("/tokens", user.HandleCreateToken(mockService)) 60 61 buf := &bytes.Buffer{} 62 w := multipart.NewWriter(buf) 63 w.WriteField("name", mockToken.Name) 64 w.Close() 65 request, _ := http.NewRequest("POST", "/tokens", buf) 66 request.Header.Set("Content-Type", w.FormDataContentType()) 67 testRequest(r, request, func(w *httptest.ResponseRecorder) { 68 respond := w.Result() 69 if respond.StatusCode != 200 { 70 t.Fatal() 71 } 72 defer respond.Body.Close() 73 data, _ := ioutil.ReadAll(respond.Body) 74 if diff := cmp.Diff(string(data), mockToken.Access); diff != "" { 75 t.Fatal(diff) 76 } 77 }) 78 } 79 80 func TestListTokens(t *testing.T) { 81 ctrl := gomock.NewController(t) 82 defer ctrl.Finish() 83 84 mockService := mock.NewMockOAuthService(ctrl) 85 86 c1 := mockService.EXPECT().ListTokens( 87 gomock.Any(), 88 ).Return( 89 []*core.OAuthToken{ 90 { 91 ID: 1, 92 Name: "token1", 93 }, 94 }, 95 nil, 96 ) 97 98 mockService.EXPECT().ListTokens( 99 gomock.Any(), 100 ).Return(nil, errors.New("")).After(c1) 101 102 mockService.EXPECT().WithUser( 103 gomock.Any(), gomock.Any(), 104 ).Return(context.Background()).AnyTimes() 105 106 t.Run("should check user", func(t *testing.T) { 107 r := gin.Default() 108 r.GET("/tokens", user.HandleListTokens(mockService)) 109 request, _ := http.NewRequest("GET", "/tokens", nil) 110 testRequest(r, request, func(w *httptest.ResponseRecorder) { 111 respond := w.Result() 112 if respond.StatusCode != 401 { 113 t.Fatal() 114 } 115 }) 116 }) 117 118 r := gin.Default() 119 r.Use(func(c *gin.Context) { 120 request.WithUser(c, &core.User{Login: "login"}) 121 }) 122 r.GET("/tokens", user.HandleListTokens(mockService)) 123 t.Run("should get tokens", func(t *testing.T) { 124 request, _ := http.NewRequest("GET", "/tokens", nil) 125 testRequest(r, request, func(w *httptest.ResponseRecorder) { 126 respond := w.Result() 127 if respond.StatusCode != 200 { 128 t.Fatal() 129 } 130 defer respond.Body.Close() 131 data, _ := ioutil.ReadAll(respond.Body) 132 var tokens []*user.Token 133 json.Unmarshal(data, &tokens) 134 if len(tokens) < 1 || tokens[0].Name != "token1" { 135 t.Fatal() 136 } 137 }) 138 }) 139 t.Run("should return 500 when error", func(t *testing.T) { 140 request, _ := http.NewRequest("GET", "/tokens", nil) 141 testRequest(r, request, func(w *httptest.ResponseRecorder) { 142 respond := w.Result() 143 if respond.StatusCode != 500 { 144 t.Fatal() 145 } 146 }) 147 }) 148 } 149 150 func TestDeleteToken(t *testing.T) { 151 ctrl := gomock.NewController(t) 152 defer ctrl.Finish() 153 154 mockService := mock.NewMockOAuthService(ctrl) 155 mockStore := mock.NewMockOAuthStore(ctrl) 156 157 t.Run("should check user", func(t *testing.T) { 158 r := gin.Default() 159 r.DELETE("/tokens/:id", user.HandleDeleteToken(mockService, mockStore)) 160 request, _ := http.NewRequest("DELETE", "/tokens/1", nil) 161 testRequest(r, request, func(w *httptest.ResponseRecorder) { 162 response := w.Result() 163 if response.StatusCode != 401 { 164 t.Fatal() 165 } 166 }) 167 }) 168 169 r := gin.Default() 170 r.Use(func(c *gin.Context) { 171 request.WithUser(c, &core.User{Login: "login"}) 172 }) 173 r.DELETE("/tokens/:id", user.HandleDeleteToken(mockService, mockStore)) 174 175 t.Run("should check id", func(t *testing.T) { 176 request, _ := http.NewRequest("DELETE", "/tokens/bear", nil) 177 testRequest(r, request, func(w *httptest.ResponseRecorder) { 178 response := w.Result() 179 if response.StatusCode != 400 { 180 t.Fatal() 181 } 182 }) 183 }) 184 185 t.Run("should return 500 when not found", func(t *testing.T) { 186 mockStore.EXPECT().Find(gomock.Any()).Return(nil, errors.New("")) 187 request, _ := http.NewRequest("DELETE", "/tokens/1", nil) 188 testRequest(r, request, func(w *httptest.ResponseRecorder) { 189 response := w.Result() 190 if response.StatusCode != 500 { 191 t.Fatal() 192 } 193 }) 194 }) 195 196 mockService.EXPECT().WithUser( 197 gomock.Any(), gomock.Any(), 198 ).Return(context.Background()).AnyTimes() 199 200 t.Run("should return 500 when fail deleting", func(t *testing.T) { 201 token := &core.OAuthToken{} 202 mockStore.EXPECT().Find(gomock.Any()).Return(token, nil) 203 mockService.EXPECT().DeleteToken(gomock.Any(), token).Return(errors.New("")) 204 request, _ := http.NewRequest("DELETE", "/tokens/1", nil) 205 testRequest(r, request, func(w *httptest.ResponseRecorder) { 206 resposne := w.Result() 207 if resposne.StatusCode != 500 { 208 t.Fatal() 209 } 210 }) 211 }) 212 213 t.Run("should return deleted token", func(t *testing.T) { 214 token := &core.OAuthToken{ID: 1, Name: "token"} 215 mockStore.EXPECT().Find( 216 &core.OAuthToken{ID: token.ID}, 217 ).Return(token, nil) 218 mockService.EXPECT().DeleteToken(gomock.Any(), token).Return(nil) 219 request, _ := http.NewRequest("DELETE", "/tokens/1", nil) 220 testRequest(r, request, func(w *httptest.ResponseRecorder) { 221 response := w.Result() 222 if response.StatusCode != 200 { 223 t.Fatal() 224 } 225 var token user.Token 226 defer response.Body.Close() 227 data, err := ioutil.ReadAll(response.Body) 228 if err != nil { 229 t.Fatal(err) 230 } 231 if err := json.Unmarshal(data, &token); err != nil { 232 t.Fatal(err) 233 } 234 if diff := cmp.Diff(user.Token{ID: 1, Name: "token"}, token); diff != "" { 235 t.Fatal(diff) 236 } 237 }) 238 }) 239 240 }