package dev import ( "path/filepath" "slices" "strings" "testing" "dappco.re/go/io" ) func TestRunTestGen_Good(t *testing.T) { tmpDir := t.TempDir() t.Setenv("CORE_WORKING_DIRECTORY", tmpDir) serviceDir := filepath.Join(tmpDir, "pkg", "demo") if err := io.Local.EnsureDir(serviceDir); err != nil { t.Fatalf("create service dir: %v", err) } if err := io.Local.Write(filepath.Join(serviceDir, "demo.go"), `package demo type Example struct{} const Answer = 42 var Value = Example{} func Run() {} `); err != nil { t.Fatalf("write demo.go: %v", err) } if err := io.Local.Write(filepath.Join(serviceDir, "extra.go"), `package demo type Another struct{} func Extra() {} `); err != nil { t.Fatalf("write extra.go: %v", err) } if err := io.Local.Write(filepath.Join(serviceDir, "demo_test.go"), `package demo func Ignored() {} `); err != nil { t.Fatalf("write demo_test.go: %v", err) } if err := runTestGen(); err != nil { t.Fatalf("run test generator: %v", err) } generatedPath := filepath.Join(tmpDir, "demo", "demo_test.go") content, err := io.Local.Read(generatedPath) if err != nil { t.Fatalf("read generated file: %v", err) } for _, want := range []string{ `// Code generated by "core dev api test-gen"; DO NOT EDIT.`, `package demo`, `impl "dappco.re/go/cli/demo"`, `type _ = impl.Example`, `type _ = impl.Another`, `const _ = impl.Answer`, `var _ = impl.Value`, `var _ = impl.Run`, `var _ = impl.Extra`, } { if !strings.Contains(content, want) { t.Fatalf("generated content missing %q", want) } } if strings.Contains(content, `Ignored`) { t.Fatal("generated content includes ignored symbol") } } func TestGeneratePublicAPITestFile_Good(t *testing.T) { tmpDir := t.TempDir() if err := generatePublicAPITestFile( filepath.Join(tmpDir, "demo"), filepath.Join(tmpDir, "demo", "demo_test.go"), "demo", []symbolInfo{ {Name: "Example", Kind: "type"}, {Name: "Answer", Kind: "const"}, }, ); err != nil { t.Fatalf("generate public API test file: %v", err) } content, err := io.Local.Read(filepath.Join(tmpDir, "demo", "demo_test.go")) if err != nil { t.Fatalf("read generated public API test file: %v", err) } for _, want := range []string{`type _ = impl.Example`, `const _ = impl.Answer`} { if !strings.Contains(content, want) { t.Fatalf("generated content missing %q", want) } } } func TestGetExportedSymbols_MultiFile_Good(t *testing.T) { tmpDir := t.TempDir() serviceDir := filepath.Join(tmpDir, "demo") if err := io.Local.EnsureDir(serviceDir); err != nil { t.Fatalf("create service dir: %v", err) } if err := io.Local.Write(filepath.Join(serviceDir, "demo.go"), `package demo type Example struct{} const Answer = 42 `); err != nil { t.Fatalf("write demo.go: %v", err) } if err := io.Local.Write(filepath.Join(serviceDir, "extra.go"), `package demo var Value = Example{} func Run() {} `); err != nil { t.Fatalf("write extra.go: %v", err) } if err := io.Local.Write(filepath.Join(serviceDir, "demo_test.go"), `package demo type Ignored struct{} `); err != nil { t.Fatalf("write demo_test.go: %v", err) } symbols, err := getExportedSymbols(serviceDir) if err != nil { t.Fatalf("get exported symbols: %v", err) } want := []symbolInfo{ {Name: "Answer", Kind: "const"}, {Name: "Example", Kind: "type"}, {Name: "Run", Kind: "func"}, {Name: "Value", Kind: "var"}, } if !slices.Equal(symbols, want) { t.Fatalf("symbols = %v, want %v", symbols, want) } }