137 lines
3.1 KiB
Go
137 lines
3.1 KiB
Go
package api
|
|
|
|
import (
|
|
"TheAdversary/database"
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
url2 "net/url"
|
|
"os"
|
|
"path/filepath"
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
type testInformation struct {
|
|
Method string
|
|
Header map[string]string
|
|
Cookie map[string]string
|
|
Body interface{}
|
|
Query map[string]interface{}
|
|
|
|
ResultBody interface{}
|
|
ResultCookie []string
|
|
Code int
|
|
|
|
AfterExec func(*testInformation)
|
|
}
|
|
|
|
func initTestDatabase(name string) error {
|
|
path := filepath.Join(os.TempDir(), name)
|
|
|
|
if _, err := os.Stat(path); !os.IsNotExist(err) {
|
|
if err = os.Remove(path); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
db, err := database.NewSqlite3Connection(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
database.SetGlobDB(db)
|
|
declaration, _ := os.ReadFile("../database.sql")
|
|
db.Exec(string(declaration))
|
|
|
|
return nil
|
|
}
|
|
|
|
func initSession() string {
|
|
sessid := sessionId()
|
|
sessions[sessid] = 1
|
|
return sessid
|
|
}
|
|
|
|
func checkTestInformation(t *testing.T, url string, information []testInformation) {
|
|
for i, information := range information {
|
|
var body io.Reader
|
|
if information.Body != nil {
|
|
if b, ok := information.Body.([]byte); ok {
|
|
body = bytes.NewReader(b)
|
|
} else {
|
|
buf, _ := json.Marshal(information.Body)
|
|
body = bytes.NewReader(buf)
|
|
}
|
|
}
|
|
|
|
query := url2.Values{}
|
|
if information.Query != nil {
|
|
for key, value := range information.Query {
|
|
query.Add(key, fmt.Sprintf("%v", value))
|
|
}
|
|
}
|
|
|
|
req, _ := http.NewRequest(information.Method, fmt.Sprintf("%s?%s", url, query.Encode()), body)
|
|
if information.Cookie != nil {
|
|
for name, value := range information.Cookie {
|
|
req.AddCookie(&http.Cookie{
|
|
Name: name,
|
|
Value: value,
|
|
})
|
|
}
|
|
}
|
|
if information.Header != nil {
|
|
for name, value := range information.Header {
|
|
req.Header.Set(name, value)
|
|
}
|
|
}
|
|
|
|
resp, _ := http.DefaultClient.Do(req)
|
|
|
|
if information.AfterExec != nil {
|
|
information.AfterExec(&information)
|
|
}
|
|
|
|
if resp.StatusCode != information.Code {
|
|
t.Errorf("Test %d sent invalid status code: expected %d, got %d", i+1, information.Code, resp.StatusCode)
|
|
}
|
|
|
|
if resp.Body != nil {
|
|
var respBody, informationBody interface{}
|
|
json.NewDecoder(resp.Body).Decode(&respBody)
|
|
resp.Body.Close()
|
|
|
|
tmpInformationBytes, _ := json.Marshal(information.ResultBody)
|
|
json.Unmarshal(tmpInformationBytes, &informationBody)
|
|
|
|
if !reflect.DeepEqual(respBody, informationBody) {
|
|
respBytes, _ := json.Marshal(respBody)
|
|
informationBytes, _ := json.Marshal(informationBody)
|
|
|
|
// for some reason the maps are sometimes not matched as equal.
|
|
// this is an additional checks if the map bytes are equal
|
|
if !bytes.Equal(respBytes, informationBytes) {
|
|
t.Errorf("Test %d sent invalid response body: expected %s, got %s", i+1, informationBytes, respBytes)
|
|
}
|
|
}
|
|
}
|
|
|
|
if information.ResultCookie != nil {
|
|
for _, cookie := range information.ResultCookie {
|
|
var found bool
|
|
for _, respCookie := range resp.Cookies() {
|
|
if cookie == respCookie.Name {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
t.Errorf("Test %d sent invalid cookies: expected %s, got none", i+1, cookie)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|