Files
douyin-autojs-follower/modules/web/routes_test.go
2024-09-30 11:02:26 +08:00

268 lines
5.9 KiB
Go

package web
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http/httptest"
"testing"
"time"
"dyproxy/.gen/model"
"dyproxy/.gen/table"
"dyproxy/providers/db"
"github.com/go-faker/faker/v4"
. "github.com/go-jet/jet/v2/sqlite"
"github.com/rogeecn/fabfile"
"github.com/sirupsen/logrus"
. "github.com/smartystreets/goconvey/convey"
"github.com/stretchr/testify/suite"
)
type WebTestSuite struct {
suite.Suite
web *WebServer
}
func TestWebServer(t *testing.T) {
db, err := db.Connect(fabfile.MustFind("data.db"))
if err != nil {
t.Fatal(err)
}
defer db.Close()
app := New(
WithDB(db),
WithLogger(),
WithRecover(),
WithRoutes(),
WithPendingCleaner(),
)
suite.Run(t, &WebTestSuite{web: app})
}
func (s *WebTestSuite) Test_index() {
Convey("Test_index", s.T(), func() {
req := httptest.NewRequest("GET", "http://localhost/", nil)
resp, err := s.web.engine.Test(req)
So(err, ShouldBeNil)
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
So(err, ShouldBeNil)
s.T().Logf("BODY: %s", body)
})
}
func (s *WebTestSuite) Test_css() {
Convey("Test_css", s.T(), func() {
req := httptest.NewRequest("GET", "http://localhost/style.css", nil)
resp, err := s.web.engine.Test(req)
So(err, ShouldBeNil)
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
So(err, ShouldBeNil)
s.T().Logf("BODY: %s", body)
})
}
func (s *WebTestSuite) Test_Expert() {
Convey("Expert", s.T(), func() {
Convey("GET", func() {
t := table.Expert
db.Truncate(s.web.db, t.TableName())
var m model.Expert
So(faker.FakeData(&m), ShouldBeNil)
m.Since = 0
m.UID = "110"
_, err := t.INSERT().MODEL(m).Exec(s.web.db)
So(err, ShouldBeNil)
req := httptest.NewRequest("GET", "http://localhost/api/experts/110", nil)
resp, err := s.web.engine.Test(req)
So(err, ShouldBeNil)
body, err := io.ReadAll(resp.Body)
defer resp.Body.Close()
So(err, ShouldBeNil)
s.T().Logf("BODY: %s", body)
})
})
}
func (s *WebTestSuite) Test_Experts() {
Convey("Experts", s.T(), func() {
Convey("GET", func() {
t := table.Expert
db.Truncate(s.web.db, t.TableName())
var m model.Expert
So(faker.FakeData(&m), ShouldBeNil)
m.Since = 0
_, err := t.INSERT().MODEL(m).Exec(s.web.db)
So(err, ShouldBeNil)
req := httptest.NewRequest("GET", "http://localhost/api/experts", nil)
resp, err := s.web.engine.Test(req)
So(err, ShouldBeNil)
body, err := io.ReadAll(resp.Body)
defer resp.Body.Close()
So(err, ShouldBeNil)
s.T().Logf("BODY: %s", body)
})
Convey("PATCH", func() {
t := table.Expert
db.Truncate(s.web.db, t.TableName())
var m model.Expert
So(faker.FakeData(&m), ShouldBeNil)
m.ID = 1
m.UID = "110"
m.Since = 0
_, err := t.INSERT().MODEL(m).Exec(s.web.db)
So(err, ShouldBeNil)
req := httptest.NewRequest("PATCH", "http://localhost/api/experts/110/date", bytes.NewReader([]byte(`{"since": 1}`)))
req.Header.Set("Content-Type", "application/json")
_, err = s.web.engine.Test(req)
So(err, ShouldBeNil)
// body, err := io.ReadAll(resp.Body)
// defer resp.Body.Close()
// So(err, ShouldBeNil)
// s.T().Logf("BODY: %s", body)
var u model.Expert
err = t.SELECT(t.AllColumns).WHERE(t.ID.EQ(Int32(1))).Query(s.web.db, &u)
So(err, ShouldBeNil)
So(u.Since, ShouldEqual, 1)
})
Convey("POST", func() {
t := table.Expert
db.Truncate(s.web.db, t.TableName())
var m model.Expert
So(faker.FakeData(&m), ShouldBeNil)
m.UID = "110"
b, _ := json.Marshal(m)
req := httptest.NewRequest("POST", "http://localhost/api/experts", bytes.NewReader(b))
req.Header.Set("Content-Type", "application/json")
_, err := s.web.engine.Test(req)
So(err, ShouldBeNil)
var u model.Expert
err = t.SELECT(t.AllColumns).ORDER_BY(t.ID.DESC()).LIMIT(1).Query(s.web.db, &u)
So(err, ShouldBeNil)
So(u.UID, ShouldEqual, "110")
})
})
}
func (s *WebTestSuite) Test_Follower() {
logrus.SetLevel(logrus.DebugLevel)
FocusConvey("Follower", s.T(), func() {
Convey("GET", func() {
tu := table.Expert
t := table.Follower
db.Truncate(s.web.db, tu.TableName())
db.Truncate(s.web.db, t.TableName())
s.web.pendingItems = make(map[int32]time.Time)
var m model.Expert
So(faker.FakeData(&m), ShouldBeNil)
m.UID = "110"
m.Since = 0
_, err := tu.INSERT().MODEL(m).Exec(s.web.db)
So(err, ShouldBeNil)
var f model.Follower
So(faker.FakeData(&f), ShouldBeNil)
f.ExpertUID = "110"
f.UID = "10"
f.Followed = 0
_, err = t.INSERT().MODEL(f).Exec(s.web.db)
So(err, ShouldBeNil)
req := httptest.NewRequest("GET", "http://localhost/api/experts/110/follower", nil)
resp, err := s.web.engine.Test(req)
So(err, ShouldBeNil)
body, err := io.ReadAll(resp.Body)
defer resp.Body.Close()
So(err, ShouldBeNil)
s.T().Logf("BODY: %s", body)
})
FocusConvey("POST", func() {
tu := table.Expert
t := table.Follower
db.Truncate(s.web.db, tu.TableName())
db.Truncate(s.web.db, t.TableName())
s.web.pendingItems = make(map[int32]time.Time)
var m model.Expert
So(faker.FakeData(&m), ShouldBeNil)
m.UID = "110"
m.Since = 0
_, err := tu.INSERT().MODEL(m).Exec(s.web.db)
So(err, ShouldBeNil)
fs := []model.Follower{}
var f model.Follower
for i := 0; i < 5; i++ {
So(faker.FakeData(&f), ShouldBeNil)
f.ExpertUID = "110"
f.UID = fmt.Sprintf("%d", 10+i)
f.Followed = 0
fs = append(fs, f)
fs = append(fs, f)
}
b, _ := json.Marshal(fs)
req := httptest.NewRequest("POST", "http://localhost/api/followers", bytes.NewReader(b))
req.Header.Set("Content-Type", "application/json")
_, err = s.web.engine.Test(req)
So(err, ShouldBeNil)
var result struct {
Count int32
}
stmt := t.SELECT(COUNT(t.ID).AS("Count"))
s.T().Log(stmt.DebugSql())
err = stmt.Query(s.web.db, &result)
s.T().Logf("%+v", result)
So(err, ShouldBeNil)
So(result.Count, ShouldEqual, 5)
})
})
}