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  }