268 lines
5.9 KiB
Go
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)
|
|
})
|
|
})
|
|
}
|