Files

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
})
}