mirror of https://github.com/usememos/memos
fix(memo): enforce parent visibility for comments
parent
1df6479443
commit
4a1e401bd9
@ -0,0 +1,86 @@
|
|||||||
|
package rss
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/labstack/echo/v5"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/usememos/memos/internal/markdown"
|
||||||
|
"github.com/usememos/memos/internal/profile"
|
||||||
|
"github.com/usememos/memos/store"
|
||||||
|
teststore "github.com/usememos/memos/store/test"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPublicRSSExcludesComments(t *testing.T) {
|
||||||
|
ctx := context.Background()
|
||||||
|
stores := teststore.NewTestingStore(ctx, t)
|
||||||
|
defer stores.Close()
|
||||||
|
|
||||||
|
user, err := stores.CreateUser(ctx, &store.User{
|
||||||
|
Username: "rss-comment-owner",
|
||||||
|
Role: store.RoleUser,
|
||||||
|
Email: "rss-comment-owner@example.com",
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
parent, err := stores.CreateMemo(ctx, &store.Memo{
|
||||||
|
UID: "rss-public-parent",
|
||||||
|
CreatorID: user.ID,
|
||||||
|
Content: "public parent should stay in rss",
|
||||||
|
Visibility: store.Public,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
comment, err := stores.CreateMemo(ctx, &store.Memo{
|
||||||
|
UID: "rss-public-comment",
|
||||||
|
CreatorID: user.ID,
|
||||||
|
Content: "public comment should not be in rss",
|
||||||
|
Visibility: store.Public,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
_, err = stores.UpsertMemoRelation(ctx, &store.MemoRelation{
|
||||||
|
MemoID: comment.ID,
|
||||||
|
RelatedMemoID: parent.ID,
|
||||||
|
Type: store.MemoRelationComment,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
service := NewRSSService(&profile.Profile{}, stores, markdown.NewService())
|
||||||
|
|
||||||
|
exploreRSS := renderRSS(t, service, "/explore/rss.xml", "")
|
||||||
|
require.Contains(t, exploreRSS, "public parent should stay in rss")
|
||||||
|
require.NotContains(t, exploreRSS, "public comment should not be in rss")
|
||||||
|
|
||||||
|
userRSS := renderRSS(t, service, "/u/rss-comment-owner/rss.xml", user.Username)
|
||||||
|
require.Contains(t, userRSS, "public parent should stay in rss")
|
||||||
|
require.NotContains(t, userRSS, "public comment should not be in rss")
|
||||||
|
}
|
||||||
|
|
||||||
|
func renderRSS(t *testing.T, service *RSSService, target string, username string) string {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
e := echo.New()
|
||||||
|
req := httptest.NewRequest(http.MethodGet, target, strings.NewReader(""))
|
||||||
|
req.Host = "example.com"
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
c := e.NewContext(req, rec)
|
||||||
|
if username != "" {
|
||||||
|
c.SetPathValues(echo.PathValues{{Name: "username", Value: username}})
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
if username == "" {
|
||||||
|
err = service.GetExploreRSS(c)
|
||||||
|
} else {
|
||||||
|
err = service.GetUserRSS(c)
|
||||||
|
}
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, http.StatusOK, rec.Code)
|
||||||
|
return rec.Body.String()
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue