SimpleCloudNotifier/scnserver/test/requestlog_test.go

149 lines
5.2 KiB
Go

package test
import (
ct "blackforestbytes.com/simplecloudnotifier/db/cursortoken"
"blackforestbytes.com/simplecloudnotifier/models"
tt "blackforestbytes.com/simplecloudnotifier/test/util"
"fmt"
"github.com/gin-gonic/gin"
"net/url"
"testing"
"time"
)
func TestRequestLogSimple(t *testing.T) {
ws, baseUrl, stop := tt.StartSimpleWebserver(t)
defer stop()
ctx := ws.NewSimpleTransactionContext(5 * time.Second)
defer ctx.Cancel()
// Ping
{
tt.RequestGet[tt.Void](t, baseUrl, fmt.Sprintf("/api/ping"))
time.Sleep(100 * time.Millisecond)
rl, _, err := ws.Database.Requests.ListRequestLogs(ctx, models.RequestLogFilter{}, nil, ct.Start())
tt.TestFailIfErr(t, err)
tt.AssertEqual(t, "requestlog.count", 1, len(rl))
tt.AssertEqual(t, "requestlog[0].Method", "GET", rl[0].Method)
tt.AssertEqual(t, "requestlog[0].KeyID", nil, rl[0].KeyID)
tt.AssertEqual(t, "requestlog[0].UserID", nil, rl[0].UserID)
tt.AssertEqual(t, "requestlog[0].Panicked", false, rl[0].Panicked)
tt.AssertEqual(t, "requestlog[0].URI", "/api/ping", rl[0].URI)
tt.AssertEqual(t, "requestlog[0].ResponseContentType", "application/json", rl[0].ResponseContentType)
}
// HTMl request
{
tt.RequestRaw(t, baseUrl, fmt.Sprintf("/"))
time.Sleep(100 * time.Millisecond)
rl, _, err := ws.Database.Requests.ListRequestLogs(ctx, models.RequestLogFilter{}, nil, ct.Start())
tt.TestFailIfErr(t, err)
tt.AssertEqual(t, "requestlog.count", 2, len(rl))
tt.AssertEqual(t, "requestlog[0].Method", "GET", rl[0].Method)
tt.AssertEqual(t, "requestlog[0].KeyID", nil, rl[0].KeyID)
tt.AssertEqual(t, "requestlog[0].UserID", nil, rl[0].UserID)
tt.AssertEqual(t, "requestlog[0].Panicked", false, rl[0].Panicked)
tt.AssertEqual(t, "requestlog[0].URI", "/", rl[0].URI)
tt.AssertEqual(t, "requestlog[0].ResponseContentType", "text/html", rl[0].ResponseContentType)
}
type R struct {
Clients []struct {
ClientId string `json:"client_id"`
UserId string `json:"user_id"`
} `json:"clients"`
ReadKey string `json:"read_key"`
SendKey string `json:"send_key"`
AdminKey string `json:"admin_key"`
UserId string `json:"user_id"`
}
usr := tt.RequestPost[R](t, baseUrl, "/api/v2/users", gin.H{
"agent_model": "DUMMY_PHONE",
"agent_version": "4X",
"client_type": "ANDROID",
"fcm_token": "DUMMY_FCM",
})
time.Sleep(100 * time.Millisecond)
// API request
{
tt.RequestAuthGet[R](t, usr.AdminKey, baseUrl, fmt.Sprintf("/api/v2/users/%s", usr.UserId))
time.Sleep(100 * time.Millisecond)
rl, _, err := ws.Database.Requests.ListRequestLogs(ctx, models.RequestLogFilter{}, nil, ct.Start())
tt.TestFailIfErr(t, err)
tt.AssertEqual(t, "requestlog.count", 4, len(rl))
tt.AssertEqual(t, "requestlog[0].Method", "GET", rl[0].Method)
tt.AssertNotEqual(t, "requestlog[0].KeyID", nil, rl[0].KeyID)
tt.AssertStrRepEqual(t, "requestlog[0].UserID", usr.UserId, rl[0].UserID)
tt.AssertEqual(t, "requestlog[0].Panicked", false, rl[0].Panicked)
tt.AssertStrRepEqual(t, "requestlog[0].Permissions", "A", rl[0].Permissions)
tt.AssertEqual(t, "requestlog[0].URI", fmt.Sprintf("/api/v2/users/%s", usr.UserId), rl[0].URI)
tt.AssertEqual(t, "requestlog[0].ResponseContentType", "application/json", rl[0].ResponseContentType)
}
// Send request
{
tt.RequestPost[gin.H](t, baseUrl, fmt.Sprintf("/?user_id=%s&key=%s&title=%s", usr.UserId, usr.SendKey, url.QueryEscape("Hello World 2134")), nil)
time.Sleep(100 * time.Millisecond)
rl, _, err := ws.Database.Requests.ListRequestLogs(ctx, models.RequestLogFilter{}, nil, ct.Start())
tt.TestFailIfErr(t, err)
tt.AssertEqual(t, "requestlog.count", 5, len(rl))
tt.AssertEqual(t, "requestlog[0].Method", "POST", rl[0].Method)
tt.AssertEqual(t, "requestlog[0].UserID", nil, rl[0].UserID)
tt.AssertEqual(t, "requestlog[0].ResponseContentType", "application/json", rl[0].ResponseContentType)
}
// Failed request
{
tt.RequestAuthGetShouldFail(t, usr.AdminKey, baseUrl, fmt.Sprintf("/api/v2/users/%s", models.NewUserID()), 0, 0)
time.Sleep(100 * time.Millisecond)
rl, _, err := ws.Database.Requests.ListRequestLogs(ctx, models.RequestLogFilter{}, nil, ct.Start())
tt.TestFailIfErr(t, err)
tt.AssertEqual(t, "requestlog.count", 6, len(rl))
tt.AssertEqual(t, "requestlog[0].Method", "GET", rl[0].Method)
tt.AssertStrRepEqual(t, "requestlog[0].UserID", usr.UserId, rl[0].UserID)
tt.AssertEqual(t, "requestlog[0].ResponseContentType", "application/json", rl[0].ResponseContentType)
tt.AssertStrRepEqual(t, "requestlog[0].ResponseStatuscode", 401, rl[0].ResponseStatuscode)
}
}
func TestRequestLogAPI(t *testing.T) {
ws, baseUrl, stop := tt.StartSimpleWebserver(t)
defer stop()
data := tt.InitDefaultData(t, ws)
time.Sleep(900 * time.Millisecond)
ctx := ws.NewSimpleTransactionContext(5 * time.Second)
defer ctx.Cancel()
rl1, _, err := ws.Database.Requests.ListRequestLogs(ctx, models.RequestLogFilter{}, nil, ct.Start())
tt.TestFailIfErr(t, err)
tt.RequestAuthGet[gin.H](t, data.User[0].ReadKey, baseUrl, "/api/v2/users/"+data.User[0].UID)
time.Sleep(900 * time.Millisecond)
rl2, _, err := ws.Database.Requests.ListRequestLogs(ctx, models.RequestLogFilter{}, nil, ct.Start())
tt.TestFailIfErr(t, err)
tt.AssertEqual(t, "requestlog.count", len(rl1)+1, len(rl2))
}