github.com/soulteary/pocket-bookcase@v0.0.0-20240428065142-0b5a9a0fc98a/internal/http/routes/api/v1/bookmarks_test.go (about) 1 package api_v1 2 3 import ( 4 "context" 5 "net/http" 6 "testing" 7 "time" 8 9 "github.com/gin-gonic/gin" 10 "github.com/sirupsen/logrus" 11 "github.com/soulteary/pocket-bookcase/internal/http/middleware" 12 "github.com/soulteary/pocket-bookcase/internal/model" 13 "github.com/soulteary/pocket-bookcase/internal/testutil" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestUpdateBookmarkCache(t *testing.T) { 18 logger := logrus.New() 19 ctx := context.TODO() 20 21 g := gin.New() 22 23 _, deps := testutil.GetTestConfigurationAndDependencies(t, ctx, logger) 24 g.Use(middleware.AuthMiddleware(deps)) 25 26 router := NewBookmarksAPIRoutes(logger, deps) 27 router.Setup(g.Group("/")) 28 29 account := model.Account{ 30 Username: "test", 31 Password: "test", 32 Owner: false, 33 } 34 require.NoError(t, deps.Database.SaveAccount(ctx, account)) 35 token, err := deps.Domains.Auth.CreateTokenForAccount(&account, time.Now().Add(time.Minute)) 36 require.NoError(t, err) 37 38 t.Run("require authentication", func(t *testing.T) { 39 w := testutil.PerformRequest(g, "PUT", "/cache") 40 require.Equal(t, http.StatusUnauthorized, w.Code) 41 }) 42 43 t.Run("require owner", func(t *testing.T) { 44 w := testutil.PerformRequest(g, "PUT", "/cache", testutil.WithHeader(model.AuthorizationHeader, model.AuthorizationTokenType+" "+token)) 45 require.Equal(t, http.StatusForbidden, w.Code) 46 }) 47 } 48 49 func TestReadableeBookmarkContent(t *testing.T) { 50 logger := logrus.New() 51 ctx := context.TODO() 52 53 g := gin.New() 54 55 _, deps := testutil.GetTestConfigurationAndDependencies(t, ctx, logger) 56 g.Use(middleware.AuthMiddleware(deps)) 57 58 router := NewBookmarksAPIRoutes(logger, deps) 59 router.Setup(g.Group("/")) 60 61 account := model.Account{ 62 Username: "test", 63 Password: "test", 64 Owner: false, 65 } 66 require.NoError(t, deps.Database.SaveAccount(ctx, account)) 67 token, err := deps.Domains.Auth.CreateTokenForAccount(&account, time.Now().Add(time.Minute)) 68 require.NoError(t, err) 69 70 bookmark := testutil.GetValidBookmark() 71 _, err = deps.Database.SaveBookmarks(ctx, true, *bookmark) 72 require.NoError(t, err) 73 response := `{"ok":true,"message":{"content":"","html":""}}` 74 75 t.Run("require authentication", func(t *testing.T) { 76 w := testutil.PerformRequest(g, "GET", "/1/readable") 77 require.Equal(t, http.StatusUnauthorized, w.Code) 78 }) 79 t.Run("get content but invalid id", func(t *testing.T) { 80 w := testutil.PerformRequest(g, "GET", "/invalidId/readable", testutil.WithHeader(model.AuthorizationHeader, model.AuthorizationTokenType+" "+token)) 81 require.Equal(t, http.StatusInternalServerError, w.Code) 82 }) 83 t.Run("get content but 0 id", func(t *testing.T) { 84 w := testutil.PerformRequest(g, "GET", "/0/readable", testutil.WithHeader(model.AuthorizationHeader, model.AuthorizationTokenType+" "+token)) 85 require.Equal(t, http.StatusNotFound, w.Code) 86 }) 87 t.Run("get content but not exist", func(t *testing.T) { 88 w := testutil.PerformRequest(g, "GET", "/2/readable", testutil.WithHeader(model.AuthorizationHeader, model.AuthorizationTokenType+" "+token)) 89 require.Equal(t, http.StatusNotFound, w.Code) 90 }) 91 t.Run("get content", func(t *testing.T) { 92 w := testutil.PerformRequest(g, "GET", "/1/readable", testutil.WithHeader(model.AuthorizationHeader, model.AuthorizationTokenType+" "+token)) 93 require.Equal(t, response, w.Body.String()) 94 require.Equal(t, http.StatusOK, w.Code) 95 }) 96 97 }