clone

a self-hosted multitenant nostr relay with sites, file storage, git hosting, and inbox and outbox delivery

main
tinyrelay / tinygit / external_test.go
external_test.go 2.6K
1package tinygit_test23import (4 "fmt"5 "os"6 "os/exec"7 "path/filepath"8 "testing"9)1011func TestExternalModuleCanUsePublicAPI(t *testing.T) {12 if testing.Short() {13 t.Skip("compiles an independent consumer module")14 }15 root, err := filepath.Abs("..")16 if err != nil {17 t.Fatal(err)18 }19 consumer := t.TempDir()20 mod := fmt.Sprintf("module example.invalid/tinygit-consumer\n\ngo 1.27.1\n\nrequire github.com/FelineStateMachine/tinyrelay v0.0.0\nreplace github.com/FelineStateMachine/tinyrelay => %s\n", filepath.ToSlash(root))21 if err := os.WriteFile(filepath.Join(consumer, "go.mod"), []byte(mod), 0600); err != nil {22 t.Fatal(err)23 }24 source := `package consumer25import (26 "context"27 "net/http"28 "path/filepath"29 "strings"30 "testing"31 "github.com/FelineStateMachine/tinyrelay/tinygit"32 "github.com/FelineStateMachine/tinyrelay/protocol/nostr"33)34type fakeStore struct{}35func (fakeStore) Query(context.Context, nostr.Filter, int64, int) ([]tinygit.Event, error) { return nil, nil }36func (fakeStore) Save(context.Context, tinygit.Event, int64) error { return nil }37func (fakeStore) Latest(context.Context, int, string, string) (tinygit.Event, bool, error) { return tinygit.Event{}, false, nil }38func (fakeStore) Exists(context.Context, string, int) (bool, error) { return false, nil }39func (fakeStore) Close() error { return nil }40func TestUse(t *testing.T) {41 ctx := context.Background()42 dir := t.TempDir()43 var store tinygit.Store44 var err error45 store, err = tinygit.OpenStore(ctx, filepath.Join(dir, "events.db"))46 if err != nil { t.Fatal(err) }47 defer store.Close()48 p := tinygit.DefaultPolicy("")49 g, err := tinygit.New(tinygit.Config{Store: fakeStore{}, Root: filepath.Join(dir, "git"), Policy: func() tinygit.Policy { return p }, Authorize: func(context.Context, tinygit.Event, tinygit.Repository) error { return nil }})50 if err != nil { t.Fatal(err) }51 var _ http.Handler = g52 if err := g.Publish(ctx, tinygit.Event{}); err == nil { t.Fatal("invalid event accepted") }53 s, err := tinygit.OpenServer(ctx, tinygit.ServerConfig{DataDir: t.TempDir(), Owner: strings.Repeat("a", 64)})54 if err != nil { t.Fatal(err) }55 defer s.Close()56 var _ http.Handler = s57}58`59 if err := os.WriteFile(filepath.Join(consumer, "consumer_test.go"), []byte(source), 0600); err != nil {60 t.Fatal(err)61 }62 cmd := exec.Command("go", "test", "-mod=mod", ".")63 cmd.Dir = consumer64 // Dependencies are already in the build cache. Never use this boundary test65 // as a reason to make a network request or change the root module files.66 cmd.Env = append(os.Environ(), "GOWORK=off", "GOPROXY=off", "GOSUMDB=off")67 if out, err := cmd.CombinedOutput(); err != nil {68 t.Fatalf("external consumer: %v\n%s", err, out)69 }70}