package clientgen import ( "context" "os" "path/filepath" "strings" "testing" qt "github.com/frankban/quicktest" "github.com/rogpeppe/go-internal/txtar" "encr.dev/cli/daemon/apps" "encr.dev/pkg/builder" "encr.dev/pkg/clientgen/clientgentypes" "encr.dev/pkg/golden" "encr.dev/v2/tsbuilder" "encr.dev/v2/v2builder" ) func TestMain(m *testing.M) { golden.TestMain(m) } func TestClientCodeGenerationFromGoApp(t *testing.T) { t.Helper() c := qt.New(t) tests, err := filepath.Glob("./testdata/goapp/input*.go") if err != nil { t.Fatal(err) } c.Assert(err, qt.IsNil) ctx := context.Background() bld := v2builder.New() for _, path := range tests { path := path c.Run("expected"+strings.TrimPrefix(strings.TrimSuffix(filepath.Base(path), ".go"), "input"), func(c *qt.C) { ar, err := txtar.ParseFile(path) c.Assert(err, qt.IsNil) base := t.TempDir() err = txtar.Write(ar, base) c.Assert(err, qt.IsNil) app := apps.NewInstance(base, "app", "") prepareResult, err := bld.Prepare(ctx, builder.PrepareParams{ Build: builder.DefaultBuildInfo(), App: app, WorkingDir: ".", }) c.Assert(err, qt.IsNil) res, err := bld.Parse(ctx, builder.ParseParams{ Build: builder.DefaultBuildInfo(), App: app, Experiments: nil, WorkingDir: ".", ParseTests: false, Prepare: prepareResult, }) c.Assert(err, qt.IsNil) files, err := os.ReadDir("./testdata/goapp") c.Assert(err, qt.IsNil) expectedPrefix := "expected" + strings.TrimPrefix(strings.TrimSuffix(filepath.Base(path), ".go"), "input") + "_" for _, file := range files { testName := strings.TrimPrefix(file.Name(), expectedPrefix) // Check that the trim prefix removed the expectedPrefix && there are no other underscores in the testName if testName != file.Name() && !strings.Contains(testName, "_") { c.Run(testName, func(c *qt.C) { language, ok := Detect(file.Name()) if strings.Contains(file.Name(), "openapi") { language, ok = LangOpenAPI, true } c.Assert(ok, qt.IsTrue, qt.Commentf("Unable to detect language type for %s", file.Name())) services := clientgentypes.AllServices(res.Meta) generatedClient, err := Client( language, "app", res.Meta, services, clientgentypes.TagSet{}, clientgentypes.Options{}, ) c.Assert(err, qt.IsNil) golden.TestAgainst(c, "goapp/"+file.Name(), string(generatedClient)) }) } } }) } } func TestClientCodeGenerationFromTSApp(t *testing.T) { t.Helper() c := qt.New(t) tests, err := filepath.Glob("./testdata/tsapp/input*.ts") if err != nil { t.Fatal(err) } c.Assert(err, qt.IsNil) ctx := context.Background() bld := tsbuilder.New() for _, path := range tests { path := path c.Run("expected"+strings.TrimPrefix(strings.TrimSuffix(filepath.Base(path), ".ts"), "input"), func(c *qt.C) { ar, err := txtar.ParseFile(path) c.Assert(err, qt.IsNil) base := t.TempDir() err = txtar.Write(ar, base) c.Assert(err, qt.IsNil) app := apps.NewInstance(base, "app", "") prepareResult, err := bld.Prepare(ctx, builder.PrepareParams{ Build: builder.DefaultBuildInfo(), App: app, WorkingDir: ".", }) c.Assert(err, qt.IsNil) res, err := bld.Parse(ctx, builder.ParseParams{ Build: builder.DefaultBuildInfo(), App: app, Experiments: nil, WorkingDir: ".", ParseTests: false, Prepare: prepareResult, }) c.Assert(err, qt.IsNil) files, err := os.ReadDir("./testdata/tsapp") c.Assert(err, qt.IsNil) expectedPrefix := "expected" + strings.TrimPrefix(strings.TrimSuffix(filepath.Base(path), ".ts"), "input") + "_" for _, file := range files { testName := strings.TrimPrefix(file.Name(), expectedPrefix) // Check that the trim prefix removed the expectedPrefix && there are no other underscores in the testName if testName != file.Name() && !strings.Contains(testName, "_") { c.Run(testName, func(c *qt.C) { language, ok := Detect(file.Name()) if strings.Contains(file.Name(), "openapi") { language, ok = LangOpenAPI, true } options := clientgentypes.Options{} if strings.Contains(file.Name(), "shared") { options.TSSharedTypes = true } if strings.Contains(file.Name(), "tags") && language == LangOpenAPI { options.OpenAPIEmitTags = true } c.Assert(ok, qt.IsTrue, qt.Commentf("Unable to detect language type for %s", file.Name())) services := clientgentypes.AllServices(res.Meta) generatedClient, err := Client( language, "app", res.Meta, services, clientgentypes.TagSet{}, options, ) c.Assert(err, qt.IsNil) golden.TestAgainst(c, "tsapp/"+file.Name(), string(generatedClient)) }) } } }) } }