Files
remark42/backend/app/cmd/cleanup_test.go
T
UmputunandGitHub d5246c9689 Deps bump (#956)
* remove redundant sprintf

* bump many deps

* missing vendors
2021-04-27 00:30:38 -05:00

216 lines
6.8 KiB
Go

package cmd
import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"sync"
"testing"
"time"
"github.com/go-chi/chi/v5"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/umputun/go-flags"
"github.com/umputun/remark42/backend/app/store"
)
type cleanedComments struct {
ids []string
lock sync.Mutex
}
func TestCleanup_IsSpam(t *testing.T) {
cc := CleanupCommand{
BadWords: []string{"bad1", "bad2", "very bad", "xyz"},
BadUsers: []string{"bu_"},
}
tbl := []struct {
text string
user string
score int
isSpam bool
spamScore float64
name string
}{
{"", "", 1, false, 0, "empty passes"},
{"one very bad two blah bad1 bad2 http://xyz.com", "bu_user", 0, true, 90, "3badwords link 0score baduser"},
{"one very bad two blah bad1 bad2", "bu_user", 0, true, 67.5, "3 bad words 1score baduser"},
{"bad1 bad2 xyz very bad", "bu_user", 0, true, 80, "4badwords 0score baduser"},
{"bad1 bad2 xyz very bad", "user", 0, true, 70, "4badwords 0score"},
{"bad1 bad2 xyz very bad", "user", 1, false, 50, "4badwords 1score"},
{"bad1 test 12345", "user", 0, false, 32.5, "1badwords 0score"},
}
for n, tt := range tbl {
tt := tt
checkName := fmt.Sprintf("check-%d-%s", n, tt.name)
t.Run(checkName, func(t *testing.T) {
c := store.Comment{ID: checkName, Text: tt.text, Score: tt.score}
c.User.ID = tt.user
r, score := cc.isSpam(c)
assert.Equal(t, tt.isSpam, r)
assert.InDelta(t, tt.spamScore, score, 0.01)
})
}
}
func TestCleanup_postsInRange(t *testing.T) {
r := chi.NewRouter()
cleanupRoutes(t, r, nil)
ts := httptest.NewServer(r)
defer ts.Close()
cmd := CleanupCommand{}
cmd.SetCommon(CommonOpts{RemarkURL: ts.URL, SharedSecret: "123456"})
p := flags.NewParser(&cmd, flags.Default)
_, err := p.ParseArgs([]string{"--site=remark", "--bword=bad1", "--bword=bad2", "--buser=bu_", "--admin-passwd=secret"})
require.NoError(t, err)
posts, err := cmd.postsInRange("20181218", "20181219")
assert.NoError(t, err)
assert.Equal(t, 2, len(posts))
posts, err = cmd.postsInRange("", "")
assert.NoError(t, err)
assert.Equal(t, 3, len(posts))
_, err = cmd.postsInRange("xxx", "yyy")
assert.Error(t, err)
}
func TestCleanup_listComments(t *testing.T) {
r := chi.NewRouter()
cleanupRoutes(t, r, nil)
ts := httptest.NewServer(r)
defer ts.Close()
cmd := CleanupCommand{}
cmd.SetCommon(CommonOpts{RemarkURL: ts.URL, SharedSecret: "123456"})
p := flags.NewParser(&cmd, flags.Default)
_, err := p.ParseArgs([]string{"--site=remark", "--bword=bad1", "--bword=bad2", "--buser=bu_", "--admin-passwd=secret"})
require.NoError(t, err)
comments, err := cmd.listComments("http://test.com/post1")
assert.NoError(t, err)
assert.Equal(t, 3, len(comments))
comments, err = cmd.listComments("http://test.com/post2")
assert.NoError(t, err)
assert.Equal(t, 1, len(comments))
comments, err = cmd.listComments("http://test.com/post-bad")
assert.NoError(t, err)
assert.Equal(t, 0, len(comments))
}
func TestCleanup_ExecuteSpam(t *testing.T) {
cleaned := cleanedComments{}
r := chi.NewRouter()
cleanupRoutes(t, r, &cleaned)
ts := httptest.NewServer(r)
defer ts.Close()
cmd := CleanupCommand{}
cmd.SetCommon(CommonOpts{RemarkURL: ts.URL, SharedSecret: "123456"})
p := flags.NewParser(&cmd, flags.Default)
_, err := p.ParseArgs([]string{"--site=remark", "--bword=bad1", "--bword=bad2", "--buser=bu_",
"--from=20181217", "--to=20181218", "--admin-passwd=secret"})
require.NoError(t, err)
err = cmd.Execute(nil)
assert.NoError(t, err)
t.Logf("deleted %+v", cleaned.ids)
assert.Equal(t, []string{"/api/v1/admin/comment/1", "/api/v1/admin/comment/3", "/api/v1/admin/comment/11"}, cleaned.ids)
}
func TestCleanup_ExecuteTitle(t *testing.T) {
titledComments := cleanedComments{}
r := chi.NewRouter()
cleanupRoutes(t, r, &titledComments)
ts := httptest.NewServer(r)
defer ts.Close()
cmd := CleanupCommand{}
cmd.SetCommon(CommonOpts{RemarkURL: ts.URL, SharedSecret: "123456"})
p := flags.NewParser(&cmd, flags.Default)
_, err := p.ParseArgs([]string{"--site=remark", "--title", "--from=20181217", "--to=20181218", "--admin-passwd=secret"})
require.NoError(t, err)
err = cmd.Execute(nil)
assert.NoError(t, err)
t.Logf("set titles for %+v", titledComments.ids)
assert.Equal(t, []string{"/api/v1/admin/title/1", "/api/v1/admin/title/2", "/api/v1/admin/title/3", "/api/v1/admin/title/11"}, titledComments.ids)
}
func cleanupRoutes(t *testing.T, r *chi.Mux, c *cleanedComments) {
r.HandleFunc("/api/v1/list", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, "GET", r.Method)
require.Equal(t, "site=remark&limit=10000", r.URL.RawQuery)
list := []store.PostInfo{
{
URL: "http://test.com/post1",
FirstTS: time.Date(2018, 12, 17, 10, 0, 0, 0, time.Local),
LastTS: time.Date(2018, 12, 17, 10, 30, 0, 0, time.Local),
},
{
URL: "http://test.com/post2",
FirstTS: time.Date(2018, 12, 18, 10, 0, 0, 0, time.Local),
LastTS: time.Date(2018, 12, 18, 10, 30, 0, 0, time.Local),
},
{
URL: "http://test.com/post3",
FirstTS: time.Date(2018, 12, 19, 10, 0, 0, 0, time.Local),
LastTS: time.Date(2018, 12, 19, 10, 30, 0, 0, time.Local),
},
}
require.NoError(t, json.NewEncoder(w).Encode(list))
})
r.HandleFunc("/api/v1/find", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, "GET", r.Method)
require.Equal(t, "remark", r.URL.Query().Get("site"))
require.Equal(t, "plain", r.URL.Query().Get("format"))
commentsWithInfo := struct {
Comments []store.Comment `json:"comments"`
Info store.PostInfo `json:"info,omitempty"`
}{}
switch r.URL.Query().Get("url") {
case "http://test.com/post1":
commentsWithInfo.Comments = []store.Comment{
{ID: "1", Text: "one very bad two blah bad1 bad2 http://xyz.com", Score: 0, User: store.User{ID: "bu_user"}},
{ID: "2", Text: "good one http://xyz.com", Score: 1, User: store.User{ID: "bu_user"}},
{ID: "3", Text: "http://xyz.com bad1 bad2", Score: 0, User: store.User{ID: "user"}},
}
case "http://test.com/post2":
commentsWithInfo.Comments = []store.Comment{
{ID: "11", Text: "one very bad two blah bad1 bad2 http://xyz.com", Score: 0, User: store.User{ID: "bu_user"}},
}
case "http://test.com/post3":
commentsWithInfo.Comments = []store.Comment{}
}
require.NoError(t, json.NewEncoder(w).Encode(commentsWithInfo))
})
r.HandleFunc("/api/v1/admin/comment/{id}", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, "DELETE", r.Method)
t.Log("delete ", r.URL.Path)
c.lock.Lock()
c.ids = append(c.ids, r.URL.Path)
c.lock.Unlock()
})
r.HandleFunc("/api/v1/admin/title/{id}", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, "PUT", r.Method)
t.Log("title for ", r.URL.Path)
c.lock.Lock()
c.ids = append(c.ids, r.URL.Path)
c.lock.Unlock()
})
}