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  }