mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-29 22:06:38 +08:00
105 lines
3.0 KiB
Go
105 lines
3.0 KiB
Go
package router_test
|
|
|
|
import (
|
|
"atsflare/common"
|
|
"atsflare/controller"
|
|
"atsflare/router"
|
|
"bytes"
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/gin-contrib/sessions"
|
|
"github.com/gin-contrib/sessions/cookie"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type roundTripFunc func(req *http.Request) (*http.Response, error)
|
|
|
|
func (f roundTripFunc) RoundTrip(req *http.Request) (*http.Response, error) {
|
|
return f(req)
|
|
}
|
|
|
|
func TestLatestReleaseProxy(t *testing.T) {
|
|
gin.SetMode(gin.TestMode)
|
|
common.RedisEnabled = false
|
|
setupTestDB(t)
|
|
|
|
originalClient := controller.UpdateHTTPClientForTest()
|
|
controller.SetUpdateHTTPClientForTest(&http.Client{
|
|
Transport: roundTripFunc(func(req *http.Request) (*http.Response, error) {
|
|
if req.URL.String() != "https://api.github.com/repos/Rain-kl/ATSFlare/releases/latest" {
|
|
t.Fatalf("unexpected request url: %s", req.URL.String())
|
|
}
|
|
if req.Header.Get("Accept") != "application/vnd.github+json" {
|
|
t.Fatalf("unexpected accept header: %s", req.Header.Get("Accept"))
|
|
}
|
|
if req.Header.Get("User-Agent") != "ATSFlare-Server" {
|
|
t.Fatalf("unexpected user-agent header: %s", req.Header.Get("User-Agent"))
|
|
}
|
|
return &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
Header: make(http.Header),
|
|
Body: io.NopCloser(strings.NewReader(`{
|
|
"tag_name":"v1.2.3",
|
|
"body":"release notes",
|
|
"html_url":"https://github.com/Rain-kl/ATSFlare/releases/tag/v1.2.3",
|
|
"published_at":"2026-03-11T00:00:00Z"
|
|
}`)),
|
|
}, nil
|
|
}),
|
|
})
|
|
t.Cleanup(func() {
|
|
controller.SetUpdateHTTPClientForTest(originalClient)
|
|
})
|
|
|
|
engine := gin.New()
|
|
engine.Use(sessions.Sessions("session", cookie.NewStore([]byte("test-secret"))))
|
|
router.SetApiRouter(engine)
|
|
|
|
loginBody, err := json.Marshal(map[string]string{
|
|
"username": "root",
|
|
"password": "123456",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("failed to marshal login body: %v", err)
|
|
}
|
|
loginReq := httptest.NewRequest(http.MethodPost, "/api/user/login", bytes.NewReader(loginBody))
|
|
loginReq.Header.Set("Content-Type", "application/json")
|
|
loginRecorder := httptest.NewRecorder()
|
|
engine.ServeHTTP(loginRecorder, loginReq)
|
|
if loginRecorder.Code != http.StatusOK {
|
|
t.Fatalf("unexpected login status code: %d", loginRecorder.Code)
|
|
}
|
|
|
|
req := httptest.NewRequest(http.MethodGet, "/api/update/latest-release", nil)
|
|
for _, cookieValue := range loginRecorder.Result().Cookies() {
|
|
req.AddCookie(cookieValue)
|
|
}
|
|
|
|
recorder := httptest.NewRecorder()
|
|
engine.ServeHTTP(recorder, req)
|
|
if recorder.Code != http.StatusOK {
|
|
t.Fatalf("unexpected status code: %d", recorder.Code)
|
|
}
|
|
|
|
var resp apiResponse
|
|
if err := json.Unmarshal(recorder.Body.Bytes(), &resp); err != nil {
|
|
t.Fatalf("failed to decode response: %v", err)
|
|
}
|
|
if !resp.Success {
|
|
t.Fatalf("expected success response, got message: %s", resp.Message)
|
|
}
|
|
|
|
var data map[string]any
|
|
if err := json.Unmarshal(resp.Data, &data); err != nil {
|
|
t.Fatalf("failed to decode response data: %v", err)
|
|
}
|
|
if data["tag_name"] != "v1.2.3" {
|
|
t.Fatalf("unexpected tag_name: %#v", data["tag_name"])
|
|
}
|
|
}
|