package main import ( "bytes" "os" "path/filepath" "strings" "testing" ) func TestResolvePrefixFromFlag(t *testing.T) { prefix, err := resolvePrefix(" demo-api ", strings.NewReader(""), &bytes.Buffer{}) if err != nil { t.Fatalf("resolvePrefix() error = %v", err) } if prefix != "demo-api" { t.Fatalf("resolvePrefix() = %q, want %q", prefix, "demo-api") } } func TestInitializeEnvCreatesAndPreservesConfig(t *testing.T) { dir := t.TempDir() created, err := initializeEnv(dir) if err != nil { t.Fatalf("initializeEnv() error = %v", err) } if !created { t.Fatal("initializeEnv() created = false, want true") } target := filepath.Join(dir, ".env") want, err := deploymentAssets.ReadFile(".env.example") if err != nil { t.Fatalf("read embedded .env.example: %v", err) } got, err := os.ReadFile(target) if err != nil { t.Fatalf("read generated .env: %v", err) } if !bytes.Equal(got, want) { t.Fatal("generated .env does not match embedded .env.example") } const custom = "SECRET=keep-me\n" if err := os.WriteFile(target, []byte(custom), 0o600); err != nil { t.Fatalf("write existing .env: %v", err) } created, err = initializeEnv(dir) if err != nil { t.Fatalf("second initializeEnv() error = %v", err) } if created { t.Fatal("second initializeEnv() created = true, want false") } got, err = os.ReadFile(target) if err != nil { t.Fatalf("read preserved .env: %v", err) } if string(got) != custom { t.Fatalf("existing .env was overwritten: got %q", got) } } func TestResolvePrefixFromInput(t *testing.T) { var output bytes.Buffer prefix, err := resolvePrefix("", strings.NewReader("template_1\n"), &output) if err != nil { t.Fatalf("resolvePrefix() error = %v", err) } if prefix != "template_1" { t.Fatalf("resolvePrefix() = %q, want %q", prefix, "template_1") } if !strings.Contains(output.String(), "请输入项目前缀") { t.Fatalf("prompt = %q, want prefix prompt", output.String()) } } func TestResolvePrefixRejectsUnsafeValues(t *testing.T) { values := []string{"", "-demo", "demo api", "demo;reboot", "项目"} for _, value := range values { t.Run(value, func(t *testing.T) { if _, err := resolvePrefix(value, strings.NewReader(""), &bytes.Buffer{}); err == nil { t.Fatalf("resolvePrefix(%q) succeeded, want error", value) } }) } }