mirror of
https://github.com/anyproto/anytype-heart.git
synced 2025-06-08 05:47:07 +09:00
99 lines
2.2 KiB
Go
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
|
|
}
|