129 lines
3.4 KiB
Go
129 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"net/http"
|
|
"testing"
|
|
|
|
"github.com/FernandoVideira/LK_API_Temp/internal/store"
|
|
"github.com/FernandoVideira/LK_API_Temp/internal/store/cache"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/mock"
|
|
)
|
|
|
|
func TestGetUser(t *testing.T) {
|
|
withReddis := config{
|
|
redisCfg: redisConfig{
|
|
enabled: true,
|
|
},
|
|
}
|
|
|
|
api := newTestApi(t, withReddis)
|
|
mux := api.mount()
|
|
|
|
testToken, err := api.authenticator.GenerateToken(nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
t.Run("should not allow unauthenticated requests", func(t *testing.T) {
|
|
|
|
mockStore := api.store.Users.(*store.MockUserStore)
|
|
mockStore.On("GetByID", int64(1)).Return(nil, nil)
|
|
|
|
req, err := http.NewRequest(http.MethodGet, "/v1/users/1", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
rr := executeRequest(req, mux)
|
|
|
|
assert.Equal(t, http.StatusUnauthorized, rr.Code, "should not allow unauthenticated requests")
|
|
|
|
mockStore.AssertNotCalled(t, "GetByID")
|
|
|
|
mockStore.Calls = nil // Reset the mock calls
|
|
})
|
|
|
|
t.Run("should allow authenticated requests", func(t *testing.T) {
|
|
mockCacheStore := api.cacheStore.Users.(*cache.MockUserStore)
|
|
mockStore := api.store.Users.(*store.MockUserStore)
|
|
|
|
mockCacheStore.On("Get", int64(1)).Return(nil, nil)
|
|
mockCacheStore.On("Set", mock.Anything, mock.Anything).Return(nil)
|
|
|
|
mockStore.On("GetByID", int64(1)).Return(&store.User{ID: 1}, nil)
|
|
mockStore.On("GetByID", int64(42)).Return(nil, store.ErrNotFound)
|
|
|
|
req, err := http.NewRequest(http.MethodGet, "/v1/users/1", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
req.Header.Set("Authorization", "Bearer "+testToken)
|
|
rr := executeRequest(req, mux)
|
|
|
|
assert.Equal(t, http.StatusOK, rr.Code, "should allow authenticated requests")
|
|
|
|
mockStore.AssertNumberOfCalls(t, "GetByID", 2)
|
|
|
|
mockCacheStore.Calls = nil // Reset the mock calls
|
|
})
|
|
|
|
t.Run("should hit the cache first and if not found add to cache", func(t *testing.T) {
|
|
mockCacheStore := api.cacheStore.Users.(*cache.MockUserStore)
|
|
|
|
mockCacheStore.On("Get", int64(42)).Return(nil, nil)
|
|
mockCacheStore.On("Get", int64(1)).Return(nil, nil)
|
|
mockCacheStore.On("Set", mock.Anything, mock.Anything).Return(nil)
|
|
|
|
req, err := http.NewRequest(http.MethodGet, "/v1/users/1", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
req.Header.Set("Authorization", "Bearer "+testToken)
|
|
rr := executeRequest(req, mux)
|
|
|
|
assert.Equal(t, http.StatusOK, rr.Code, "should hit the cache first and if not found add to cache")
|
|
|
|
mockCacheStore.AssertNumberOfCalls(t, "Get", 2)
|
|
|
|
mockCacheStore.Calls = nil // Reset the mock calls
|
|
})
|
|
|
|
t.Run("should not hit the cache if it is turned off", func(t *testing.T) {
|
|
withReddis := config{
|
|
redisCfg: redisConfig{
|
|
enabled: false,
|
|
},
|
|
}
|
|
|
|
api := newTestApi(t, withReddis)
|
|
mux := api.mount()
|
|
|
|
testToken, err := api.authenticator.GenerateToken(nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
mockCacheStore := api.cacheStore.Users.(*cache.MockUserStore)
|
|
mockStore := api.store.Users.(*store.MockUserStore)
|
|
|
|
mockStore.On("GetByID", int64(1)).Return(nil, nil)
|
|
|
|
req, err := http.NewRequest(http.MethodGet, "/v1/users/1", nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
req.Header.Set("Authorization", "Bearer "+testToken)
|
|
rr := executeRequest(req, mux)
|
|
|
|
assert.Equal(t, http.StatusOK, rr.Code, "should not hit the cache if it is turned off")
|
|
|
|
mockCacheStore.AssertNotCalled(t, "Get")
|
|
|
|
mockCacheStore.Calls = nil // Reset the mock calls
|
|
})
|
|
}
|