mirror of
https://github.com/Forceu/Gokapi.git
synced 2026-01-06 00:49:33 -06:00
* Require 1.9.6 for upgrade, add function to get userID from request * Automatically add user when successfully authenticated with headers / oauth, disallow modifing own user permissions * Dont show user/pw page when using header authentication * Only display redacted versions of API keys #228, fixed deployment password * Added animation for deleting API key * Only create salt once * Disable elements on upload UI if insufficient permissions * BREAKING: User field must be email for OAUTH2, added warning in setup when changing database * BREAKING: Added option to restrict to only registered users * Fixed crash due to concurrent map iteration * Replace /uploadComplete with API call, BREAKING API is now in headers * BREAKING: require true|false instead of only checking for true * BREAKING API: Renamed apiKeyToModify parameter to targetKey
363 lines
9.0 KiB
Go
363 lines
9.0 KiB
Go
//go:build test
|
|
|
|
package test
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/forceu/gokapi/internal/helper"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
wantFail bool
|
|
isFailed = false
|
|
)
|
|
|
|
type MockTest struct {
|
|
reference *testing.T
|
|
}
|
|
|
|
func (t MockTest) Errorf(format string, args ...interface{}) {
|
|
isFailed = true
|
|
}
|
|
func (t MockTest) Helper() {
|
|
}
|
|
|
|
func (t *MockTest) WantFail() {
|
|
t.Check()
|
|
isFailed = false
|
|
wantFail = true
|
|
}
|
|
func (t *MockTest) WantNoFail() {
|
|
t.Check()
|
|
isFailed = false
|
|
wantFail = false
|
|
}
|
|
|
|
func (t *MockTest) Check() {
|
|
if wantFail != isFailed {
|
|
t.reference.Helper()
|
|
t.reference.Error("Test failed")
|
|
}
|
|
}
|
|
|
|
type testStruct struct {
|
|
Value1 int64
|
|
}
|
|
|
|
func TestFunctions(t *testing.T) {
|
|
mockT := MockTest{reference: t}
|
|
mockT.WantNoFail()
|
|
IsEqualString(mockT, "test", "test")
|
|
mockT.WantNoFail()
|
|
IsNotEqualString(mockT, "test", "test2")
|
|
mockT.WantNoFail()
|
|
IsEqualBool(mockT, true, true)
|
|
mockT.WantNoFail()
|
|
IsEqualInt(mockT, 1, 1)
|
|
mockT.WantNoFail()
|
|
IsEqualInt64(mockT, 2, 2)
|
|
mockT.WantNoFail()
|
|
IsNotEmpty(mockT, "notEmpty")
|
|
mockT.WantNoFail()
|
|
IsEmpty(mockT, "")
|
|
mockT.WantNoFail()
|
|
IsNil(mockT, nil)
|
|
mockT.WantNoFail()
|
|
IsEqualByteSlice(mockT, []byte("test"), []byte("test"))
|
|
mockT.WantNoFail()
|
|
FileDoesNotExist(mockT, "testfile")
|
|
os.WriteFile("testfile", []byte("content"), 0777)
|
|
mockT.WantNoFail()
|
|
FileExists(mockT, "testfile")
|
|
mockT.WantNoFail()
|
|
IsEqual(mockT, testStruct{Value1: 1337}, testStruct{Value1: 1337})
|
|
|
|
mockT.WantNoFail()
|
|
IsNotNil(mockT, errors.New("hello"))
|
|
mockT.WantNoFail()
|
|
IsNotNil(mockT, "test")
|
|
mockT.WantFail()
|
|
IsEqualString(mockT, "test", "test2")
|
|
mockT.WantFail()
|
|
IsNotEqualString(mockT, "test", "test")
|
|
mockT.WantFail()
|
|
IsEqualByteSlice(mockT, []byte("test1"), []byte("test2"))
|
|
mockT.WantFail()
|
|
IsEqualBool(mockT, true, false)
|
|
mockT.WantFail()
|
|
IsEqualInt(mockT, 1, 2)
|
|
mockT.WantFail()
|
|
IsEqualInt64(mockT, 4, 9)
|
|
mockT.WantFail()
|
|
IsNotEmpty(mockT, "")
|
|
mockT.WantFail()
|
|
IsEmpty(mockT, "notEmpty")
|
|
mockT.WantFail()
|
|
IsNil(mockT, errors.New("hello"))
|
|
mockT.WantFail()
|
|
IsNil(mockT, "test")
|
|
mockT.WantFail()
|
|
IsNilWithMessage(mockT, errors.New("hello"), "there")
|
|
mockT.WantFail()
|
|
IsNotNil(mockT, nil)
|
|
mockT.WantFail()
|
|
IsNotNilWithMessage(mockT, nil, "hello")
|
|
mockT.WantFail()
|
|
FileDoesNotExist(mockT, "testfile")
|
|
os.Remove("testfile")
|
|
mockT.WantFail()
|
|
FileExists(mockT, "testfile")
|
|
mockT.WantFail()
|
|
IsEqual(mockT, testStruct{Value1: 1337}, testStruct{Value1: 1338})
|
|
mockT.Check()
|
|
}
|
|
|
|
func TestHttpConfig(t *testing.T) {
|
|
mockT := MockTest{reference: t}
|
|
mockT.WantFail()
|
|
test := HttpTestConfig{}
|
|
test.init(mockT)
|
|
mockT.Check()
|
|
}
|
|
|
|
func TestMockInputStdin(t *testing.T) {
|
|
original := StartMockInputStdin("test input")
|
|
result := helper.ReadLine()
|
|
StopMockInputStdin(original)
|
|
IsEqualString(t, result, "test input")
|
|
}
|
|
|
|
func TestFolderExists(t *testing.T) {
|
|
mockT := MockTest{reference: t}
|
|
mockT.WantFail()
|
|
FolderExists(mockT, "testfolder")
|
|
os.Mkdir("testfolder", 0777)
|
|
mockT.WantNoFail()
|
|
FolderExists(mockT, "testfolder")
|
|
mockT.WantFail()
|
|
os.RemoveAll("testfolder")
|
|
FolderExists(mockT, "testfolder")
|
|
mockT.Check()
|
|
}
|
|
|
|
func TestHttpPageResult(t *testing.T) {
|
|
startTestServer()
|
|
HttpPageResult(t, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
RequiredContent: []string{"TestContent", "testName", "testValue", "testPostKey", "testPostValue"},
|
|
ExcludedContent: []string{"invalid"},
|
|
PostValues: []PostBody{{
|
|
Key: "testPostKey",
|
|
Value: "testPostValue",
|
|
}},
|
|
Cookies: []Cookie{{
|
|
Name: "testName",
|
|
Value: "testValue",
|
|
}},
|
|
Headers: []Header{{
|
|
Name: "testHeader",
|
|
Value: "value",
|
|
}},
|
|
Method: "POST",
|
|
})
|
|
mockT := MockTest{reference: t}
|
|
mockT.WantFail()
|
|
HttpPageResult(mockT, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/invalid",
|
|
})
|
|
mockT.WantFail()
|
|
HttpPageResult(mockT, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
RequiredContent: []string{"invalid"},
|
|
})
|
|
mockT.WantFail()
|
|
HttpPageResult(mockT, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
ExcludedContent: []string{"TestContent"},
|
|
})
|
|
mockT.WantFail()
|
|
HttpPageResult(mockT, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
IsHtml: true,
|
|
})
|
|
mockT.Check()
|
|
}
|
|
|
|
func TestHttpPostUploadRequest(t *testing.T) {
|
|
os.WriteFile("testfile", []byte("Testbytes"), 0777)
|
|
HttpPostUploadRequest(t, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
UploadFileName: "testfile",
|
|
UploadFieldName: "file",
|
|
PostValues: []PostBody{{Key: "test", Value: "test2"}},
|
|
RequiredContent: []string{"TestContent", "testName", "testValue"},
|
|
ExcludedContent: []string{"invalid"},
|
|
Cookies: []Cookie{{
|
|
Name: "testName",
|
|
Value: "testValue",
|
|
}},
|
|
})
|
|
mockT := MockTest{reference: t}
|
|
mockT.WantFail()
|
|
HttpPostUploadRequest(mockT, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
UploadFileName: "testfile",
|
|
UploadFieldName: "file",
|
|
ExcludedContent: []string{"TestContent"}},
|
|
)
|
|
mockT.WantFail()
|
|
HttpPostUploadRequest(mockT, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
UploadFileName: "testfile",
|
|
UploadFieldName: "file",
|
|
RequiredContent: []string{"invalid"}},
|
|
)
|
|
mockT.Check()
|
|
os.Remove("testfile")
|
|
}
|
|
func TestHttpPageResultJson(t *testing.T) {
|
|
HttpPageResultJson(t, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
UploadFileName: "testfile",
|
|
UploadFieldName: "file",
|
|
PostValues: []PostBody{{Key: "test", Value: "test2"}},
|
|
RequiredContent: []string{"TestContent", "testName", "testValue"},
|
|
ExcludedContent: []string{"invalid"},
|
|
Cookies: []Cookie{{
|
|
Name: "testName",
|
|
Value: "testValue",
|
|
}},
|
|
})
|
|
mockT := MockTest{reference: t}
|
|
mockT.WantFail()
|
|
HttpPageResultJson(mockT, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
UploadFileName: "testfile",
|
|
UploadFieldName: "file",
|
|
Headers: []Header{{Name: "test", Value: "input"}},
|
|
ExcludedContent: []string{"TestContent"}},
|
|
)
|
|
mockT.WantFail()
|
|
HttpPageResultJson(mockT, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
UploadFileName: "testfile",
|
|
UploadFieldName: "file",
|
|
RequiredContent: []string{"invalid"}},
|
|
)
|
|
mockT.Check()
|
|
}
|
|
func TestHttpPostRequest(t *testing.T) {
|
|
HttpPostRequest(t, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
UploadFileName: "testfile",
|
|
UploadFieldName: "file",
|
|
PostValues: []PostBody{{Key: "test", Value: "test2"}},
|
|
RequiredContent: []string{"TestContent", "testName", "testValue"},
|
|
ExcludedContent: []string{"invalid"},
|
|
Cookies: []Cookie{{
|
|
Name: "testName",
|
|
Value: "testValue",
|
|
}},
|
|
})
|
|
mockT := MockTest{reference: t}
|
|
mockT.WantFail()
|
|
HttpPostRequest(mockT, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
UploadFileName: "testfile",
|
|
UploadFieldName: "file",
|
|
Headers: []Header{{Name: "test", Value: "input"}},
|
|
ExcludedContent: []string{"TestContent"}},
|
|
)
|
|
mockT.WantFail()
|
|
HttpPostRequest(mockT, HttpTestConfig{
|
|
Url: "http://127.0.0.1:9999/test",
|
|
UploadFileName: "testfile",
|
|
UploadFieldName: "file",
|
|
RequiredContent: []string{"invalid"}},
|
|
)
|
|
mockT.Check()
|
|
}
|
|
|
|
func TestResponseBodyContains(t *testing.T) {
|
|
mockT := MockTest{reference: t}
|
|
mockT.WantNoFail()
|
|
w := httptest.NewRecorder()
|
|
_, _ = io.WriteString(w, "TestContentWrite")
|
|
ResponseBodyContains(mockT, w, "TestContentWrite")
|
|
mockT.WantFail()
|
|
w = httptest.NewRecorder()
|
|
_, _ = io.WriteString(w, "TestContentWrite")
|
|
ResponseBodyContains(mockT, w, "invalid")
|
|
mockT.Check()
|
|
}
|
|
|
|
func startTestServer() {
|
|
http.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) {
|
|
io.WriteString(writer, "TestContent\n")
|
|
for _, cookie := range request.Cookies() {
|
|
io.WriteString(writer, "cookie name: "+cookie.Name+" cookie value: "+cookie.Value+"\n")
|
|
}
|
|
request.ParseForm()
|
|
if request.Form.Get("testPostKey") != "" {
|
|
io.WriteString(writer, "testPostKey: "+request.Form.Get("testPostKey")+"\n")
|
|
}
|
|
})
|
|
go func() { log.Fatal(http.ListenAndServe("127.0.0.1:9999", nil)) }()
|
|
time.Sleep(2 * time.Second)
|
|
}
|
|
|
|
func TestOsExit(t *testing.T) {
|
|
mockT := MockTest{reference: t}
|
|
mockT.WantNoFail()
|
|
osExit := ExitCode(mockT, 0)
|
|
osExit(0)
|
|
mockT.WantFail()
|
|
osExit(1)
|
|
mockT.Check()
|
|
}
|
|
|
|
func TestExpectPanic(t *testing.T) {
|
|
mockT := MockTest{reference: t}
|
|
mockT.WantFail()
|
|
ExpectPanic(mockT)
|
|
mockT.Check()
|
|
err := errors.New("test")
|
|
defer ExpectPanic(mockT)
|
|
panic(err)
|
|
}
|
|
|
|
func TestGetRecorder(t *testing.T) {
|
|
_, r := GetRecorder("GET", "/", []Cookie{{
|
|
Name: "test",
|
|
Value: "testvalue",
|
|
}}, []Header{{
|
|
Name: "testheader",
|
|
Value: "testheadervalue",
|
|
}}, nil)
|
|
|
|
cookie, err := r.Cookie("test")
|
|
IsNil(t, err)
|
|
IsEqualString(t, cookie.Value, "testvalue")
|
|
IsEqualString(t, r.Header.Get("testheader"), "testheadervalue")
|
|
}
|
|
|
|
func TestCompletesWithinTime(t *testing.T) {
|
|
mockT := MockTest{reference: t}
|
|
mockT.WantFail()
|
|
CompletesWithinTime(mockT, delay100ms, 50*time.Millisecond)
|
|
mockT.WantNoFail()
|
|
CompletesWithinTime(mockT, delay100ms, 150*time.Millisecond)
|
|
mockT.Check()
|
|
}
|
|
|
|
func delay100ms() {
|
|
time.Sleep(100 * time.Millisecond)
|
|
}
|