1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-08 05:47:07 +09:00
anytype-heart/tests/util_test.go
2024-01-19 13:32:19 +00:00

99 lines
2.2 KiB
Go

//go:build integration
package tests
import (
"context"
"fmt"
"os"
"path/filepath"
"reflect"
"runtime"
"strings"
"testing"
"github.com/anyproto/anytype-heart/util/reflection"
"github.com/stretchr/testify/require"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
)
const cacheDir = ".cache"
func cacheFilename(key string) string {
return filepath.Join(cacheDir, key)
}
func readStringFromCache(key string) (string, error) {
raw, err := os.ReadFile(cacheFilename(key))
return string(raw), err
}
func cachedString(key string, rewriteCache bool, proc func() (string, error)) (string, bool, error) {
result, err := readStringFromCache(key)
if rewriteCache || os.IsNotExist(err) || result == "" {
res, err := proc()
if err != nil {
return "", false, fmt.Errorf("running proc for caching %s: %w", key, err)
}
err = os.WriteFile(cacheFilename(key), []byte(res), 0600)
if err != nil {
return "", false, fmt.Errorf("writing cache for %s: %w", key, err)
}
return res, false, nil
}
return result, true, nil
}
type callCtx struct {
t *testing.T
token string
}
func (c callCtx) newContext() context.Context {
return metadata.AppendToOutgoingContext(context.Background(), "token", c.token)
}
func (s testSession) newCallCtx(t *testing.T) callCtx {
return callCtx{
t: t,
token: s.token,
}
}
func call[reqT, respT any](
cctx callCtx,
method func(context.Context, reqT, ...grpc.CallOption) (respT, error),
req reqT,
) respT {
resp, err := callReturnError(cctx, method, req)
require.NoError(cctx.t, err)
require.NotNil(cctx.t, resp)
return resp
}
func callReturnError[reqT any, respT any](
cctx callCtx,
method func(context.Context, reqT, ...grpc.CallOption) (respT, error),
req reqT,
) (respT, error) {
name := runtime.FuncForPC(reflect.ValueOf(method).Pointer()).Name()
name = name[strings.LastIndex(name, ".")+1:]
name = name[:strings.LastIndex(name, "-")]
cctx.t.Logf("calling %s", name)
var nilResp respT
resp, err := method(cctx.newContext(), req)
if err != nil {
return nilResp, err
}
_, _, err = reflection.GetError(resp)
if err != nil {
return nilResp, err
}
require.NotNil(cctx.t, resp)
return resp, nil
}