[chore] Test fixes (#788)

* use 'test' value for testrig storage backend

* update test dependency

* add WaitFor func in testrig

* use WaitFor function instead of time.Sleep

* tidy up tests

* make SentMessages a sync.map

* go fmt
This commit is contained in:
tobi 2022-08-31 17:31:21 +02:00 committed by GitHub
commit 0245c606d7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
30 changed files with 501 additions and 222 deletions

View file

@ -19,9 +19,6 @@
package testrig
import (
"os"
"path"
"github.com/coreos/go-oidc/v3/oidc"
"github.com/superseriousbusiness/gotosocial/internal/config"
)
@ -29,12 +26,11 @@ import (
// InitTestConfig initializes viper configuration with test defaults.
func InitTestConfig() {
config.Config(func(cfg *config.Configuration) {
*cfg = TestDefaults
*cfg = testDefaults
})
}
// TestDefaults returns a Values struct with values set that are suitable for local testing.
var TestDefaults = config.Configuration{
var testDefaults = config.Configuration{
LogLevel: "trace",
LogDbQueries: true,
ApplicationName: "gotosocial",
@ -69,8 +65,11 @@ var TestDefaults = config.Configuration{
MediaDescriptionMaxChars: 500,
MediaRemoteCacheDays: 30,
StorageBackend: "local",
StorageLocalBasePath: path.Join(os.TempDir(), "gotosocial"),
// the testrig only uses in-memory storage, so we can
// safely set this value to 'test' to avoid running storage
// migrations, and other silly things like that
StorageBackend: "test",
StorageLocalBasePath: "",
StatusesMaxChars: 5000,
StatusesCWMaxChars: 100,

View file

@ -24,6 +24,7 @@ import (
"io"
"net/http"
"strings"
"sync"
"github.com/superseriousbusiness/activity/pub"
"github.com/superseriousbusiness/activity/streams"
@ -64,7 +65,7 @@ type MockHTTPClient struct {
testRemoteServices map[string]vocab.ActivityStreamsService
testRemoteAttachments map[string]RemoteAttachmentFile
SentMessages map[string][]byte
SentMessages sync.Map
}
// NewMockHTTPClient returns a client that conforms to the pub.HttpClient interface.
@ -90,8 +91,6 @@ func NewMockHTTPClient(do func(req *http.Request) (*http.Response, error), relat
mockHTTPClient.testRemoteServices = NewTestFediServices()
mockHTTPClient.testRemoteAttachments = NewTestFediAttachments(relativeMediaPath)
mockHTTPClient.SentMessages = make(map[string][]byte)
mockHTTPClient.do = func(req *http.Request) (*http.Response, error) {
responseCode := http.StatusNotFound
responseBytes := []byte(`{"error":"404 not found"}`)
@ -103,7 +102,15 @@ func NewMockHTTPClient(do func(req *http.Request) (*http.Response, error), relat
if err != nil {
panic(err)
}
mockHTTPClient.SentMessages[req.URL.String()] = b
if sI, loaded := mockHTTPClient.SentMessages.LoadOrStore(req.URL.String(), [][]byte{b}); loaded {
s, ok := sI.([][]byte)
if !ok {
panic("SentMessages entry wasn't [][]byte")
}
s = append(s, b)
mockHTTPClient.SentMessages.Store(req.URL.String(), s)
}
responseCode = http.StatusOK
responseBytes = []byte(`{"ok":"accepted"}`)

View file

@ -87,3 +87,28 @@ func TimeMustParse(timeString string) time.Time {
}
return t
}
// WaitFor calls condition every 200ms, returning true
// when condition() returns true, or false after 5s.
//
// It's useful for when you're waiting for something to
// happen, but you don't know exactly how long it will take,
// and you want to fail if the thing doesn't happen within 5s.
func WaitFor(condition func() bool) bool {
tick := time.NewTicker(200 * time.Millisecond)
defer tick.Stop()
timeout := time.NewTimer(5 * time.Second)
defer timeout.Stop()
for {
select {
case <-tick.C:
if condition() {
return true
}
case <-timeout.C:
return false
}
}
}