| 1 | package tinygit_test |
| 2 | |
| 3 | import ( |
| 4 | "fmt" |
| 5 | "os" |
| 6 | "os/exec" |
| 7 | "path/filepath" |
| 8 | "testing" |
| 9 | ) |
| 10 | |
| 11 | func 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 consumer |
| 25 | import ( |
| 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 | ) |
| 34 | type fakeStore struct{} |
| 35 | func (fakeStore) Query(context.Context, nostr.Filter, int64, int) ([]tinygit.Event, error) { return nil, nil } |
| 36 | func (fakeStore) Save(context.Context, tinygit.Event, int64) error { return nil } |
| 37 | func (fakeStore) Latest(context.Context, int, string, string) (tinygit.Event, bool, error) { return tinygit.Event{}, false, nil } |
| 38 | func (fakeStore) Exists(context.Context, string, int) (bool, error) { return false, nil } |
| 39 | func (fakeStore) Close() error { return nil } |
| 40 | func TestUse(t *testing.T) { |
| 41 | ctx := context.Background() |
| 42 | dir := t.TempDir() |
| 43 | var store tinygit.Store |
| 44 | var err error |
| 45 | 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 = g |
| 52 | 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 = s |
| 57 | } |
| 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 = consumer |
| 64 | // Dependencies are already in the build cache. Never use this boundary test |
| 65 | // 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 | } |