@@ -145,6 +145,96 @@ func TestTemplateGeneratorInvalidName(t *testing.T) {
145145 }
146146}
147147
148+ func TestGenerateProjectStructure (t * testing.T ) {
149+ dir := t .TempDir ()
150+ outputDir := filepath .Join (dir , "my-plugin" )
151+
152+ gen := NewTemplateGenerator ()
153+ err := gen .Generate (GenerateOptions {
154+ Name : "my-plugin" ,
155+ Version : "0.2.0" ,
156+ Author : "TestOrg" ,
157+ Description : "Project structure test" ,
158+ OutputDir : outputDir ,
159+ })
160+ if err != nil {
161+ t .Fatalf ("Generate error: %v" , err )
162+ }
163+
164+ // Verify all expected project files exist.
165+ expectedFiles := []string {
166+ "cmd/workflow-plugin-my-plugin/main.go" ,
167+ "internal/provider.go" ,
168+ "internal/steps.go" ,
169+ "go.mod" ,
170+ ".goreleaser.yml" ,
171+ ".github/workflows/ci.yml" ,
172+ ".github/workflows/release.yml" ,
173+ "Makefile" ,
174+ "README.md" ,
175+ }
176+ for _ , f := range expectedFiles {
177+ p := filepath .Join (outputDir , f )
178+ if _ , err := os .Stat (p ); err != nil {
179+ t .Errorf ("expected file %s to exist: %v" , f , err )
180+ }
181+ }
182+
183+ // Verify main.go uses the external SDK import.
184+ mainData , err := os .ReadFile (filepath .Join (outputDir , "cmd/workflow-plugin-my-plugin/main.go" ))
185+ if err != nil {
186+ t .Fatalf ("read main.go: %v" , err )
187+ }
188+ mainSrc := string (mainData )
189+ if ! strings .Contains (mainSrc , `"github.com/GoCodeAlone/workflow/plugin/external/sdk"` ) {
190+ t .Error ("main.go should import plugin/external/sdk" )
191+ }
192+ if ! strings .Contains (mainSrc , "sdk.Serve(" ) {
193+ t .Error ("main.go should call sdk.Serve()" )
194+ }
195+
196+ // Verify provider.go uses external SDK types.
197+ provData , err := os .ReadFile (filepath .Join (outputDir , "internal/provider.go" ))
198+ if err != nil {
199+ t .Fatalf ("read provider.go: %v" , err )
200+ }
201+ provSrc := string (provData )
202+ if ! strings .Contains (provSrc , `"github.com/GoCodeAlone/workflow/plugin/external/sdk"` ) {
203+ t .Error ("provider.go should import plugin/external/sdk" )
204+ }
205+ if ! strings .Contains (provSrc , "sdk.PluginManifest" ) {
206+ t .Error ("provider.go should use sdk.PluginManifest" )
207+ }
208+ if ! strings .Contains (provSrc , "sdk.StepInstance" ) {
209+ t .Error ("provider.go should return sdk.StepInstance" )
210+ }
211+ if ! strings .Contains (provSrc , `return nil, fmt.Errorf("unknown step type:` ) {
212+ t .Error ("provider.go should return error for unknown step types" )
213+ }
214+
215+ // Verify steps.go uses external SDK types.
216+ stepsData , err := os .ReadFile (filepath .Join (outputDir , "internal/steps.go" ))
217+ if err != nil {
218+ t .Fatalf ("read steps.go: %v" , err )
219+ }
220+ stepsSrc := string (stepsData )
221+ if ! strings .Contains (stepsSrc , `"github.com/GoCodeAlone/workflow/plugin/external/sdk"` ) {
222+ t .Error ("steps.go should import plugin/external/sdk" )
223+ }
224+ if ! strings .Contains (stepsSrc , "*sdk.StepResult" ) {
225+ t .Error ("steps.go should return *sdk.StepResult" )
226+ }
227+
228+ // Verify go.mod has correct module path.
229+ modData , err := os .ReadFile (filepath .Join (outputDir , "go.mod" ))
230+ if err != nil {
231+ t .Fatalf ("read go.mod: %v" , err )
232+ }
233+ if ! strings .Contains (string (modData ), "module github.com/TestOrg/workflow-plugin-my-plugin" ) {
234+ t .Errorf ("go.mod module path unexpected: %s" , string (modData ))
235+ }
236+ }
237+
148238func TestToCamelCase (t * testing.T ) {
149239 tests := []struct {
150240 input string
0 commit comments