Skip to content

Commit d5f44f6

Browse files
committed
fix(cli): address remaining review feedback
1 parent 1591590 commit d5f44f6

5 files changed

Lines changed: 70 additions & 13 deletions

File tree

cmd/modkit/main_test.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package main
22

3-
import "testing"
3+
import (
4+
"os"
5+
"testing"
6+
)
47

58
func TestRunHelp(t *testing.T) {
69
if code := run([]string{"modkit", "--help"}); code != 0 {
@@ -16,7 +19,11 @@ func TestRunInvalidCommand(t *testing.T) {
1619

1720
func TestMainInvokesExit(t *testing.T) {
1821
orig := osExit
19-
t.Cleanup(func() { osExit = orig })
22+
origArgs := os.Args
23+
t.Cleanup(func() {
24+
osExit = orig
25+
os.Args = origArgs
26+
})
2027

2128
called := false
2229
got := -1
@@ -25,12 +32,13 @@ func TestMainInvokesExit(t *testing.T) {
2532
got = code
2633
}
2734

35+
os.Args = []string{"modkit", "--help"}
2836
main()
2937

3038
if !called {
3139
t.Fatal("expected main to call osExit")
3240
}
3341
if got != 0 {
34-
t.Fatalf("expected exit code 0 from test binary args, got %d", got)
42+
t.Fatalf("expected exit code 0, got %d", got)
3543
}
3644
}

docs/specs/design-cli-tooling.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,16 @@ Run:
5151
$ cd my-service
5252
$ modkit new module users
5353
Created internal/modules/users/module.go
54-
Created internal/modules/users/module_test.go
5554
```
5655

5756
### 4.3. Adding a Provider
5857

5958
```bash
6059
$ modkit new provider service --module users
6160
Created internal/modules/users/service.go
62-
Updated internal/modules/users/module.go (registered provider)
61+
TODO: Register provider in internal/modules/users/module.go:
62+
Token: "users.service"
63+
Build: func(r module.Resolver) (any, error) { return NewServiceService(), nil }
6364
```
6465
6566
## 5. Implementation Details

internal/cli/ast/modify.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,20 @@ import (
77
"go/token"
88
"os"
99
"path/filepath"
10+
"regexp"
1011

1112
"github.com/dave/dst"
1213
"github.com/dave/dst/decorator"
1314
)
1415

16+
var providerTokenPattern = regexp.MustCompile(`^[A-Za-z0-9_]+\.[A-Za-z0-9_]+$`)
17+
1518
// AddProvider registers a new provider in the module definition.
1619
func AddProvider(filePath, providerToken, buildFunc string) error {
20+
if !providerTokenPattern.MatchString(providerToken) {
21+
return fmt.Errorf("provider token must be in module.component format: %q", providerToken)
22+
}
23+
1724
fset := token.NewFileSet()
1825
f, err := decorator.ParseFile(fset, filePath, nil, parser.ParseComments)
1926
if err != nil {

internal/cli/ast/modify_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,28 @@ type Module struct{}
9393
t.Fatal("expected error when Definition method is missing")
9494
}
9595
}
96+
97+
func TestAddProviderInvalidToken(t *testing.T) {
98+
tmp := t.TempDir()
99+
file := filepath.Join(tmp, "module.go")
100+
content := `package users
101+
102+
import "github.com/go-modkit/modkit/modkit/module"
103+
104+
type Module struct{}
105+
106+
func (m *Module) Definition() module.ModuleDef {
107+
return module.ModuleDef{
108+
Name: "users",
109+
Providers: []module.ProviderDef{},
110+
}
111+
}
112+
`
113+
if err := os.WriteFile(file, []byte(content), 0o600); err != nil {
114+
t.Fatal(err)
115+
}
116+
117+
if err := AddProvider(file, "bad token", "buildAuth"); err == nil {
118+
t.Fatal("expected error for invalid token format")
119+
}
120+
}

internal/cli/cmd/new_provider_test.go

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,37 @@ import (
1111
"github.com/spf13/cobra"
1212
)
1313

14-
func captureStdout(t *testing.T, fn func() error) (string, error) {
14+
func captureStdout(t *testing.T, fn func() error) (out string, errRun error) {
1515
t.Helper()
1616
orig := os.Stdout
1717
r, w, err := os.Pipe()
1818
if err != nil {
1919
return "", err
2020
}
21+
2122
os.Stdout = w
22-
errRun := fn()
23-
_ = w.Close()
24-
os.Stdout = orig
25-
var buf bytes.Buffer
26-
_, _ = io.Copy(&buf, r)
27-
_ = r.Close()
28-
return buf.String(), errRun
23+
var panicV any
24+
25+
defer func() {
26+
os.Stdout = orig
27+
_ = w.Close()
28+
var buf bytes.Buffer
29+
_, _ = io.Copy(&buf, r)
30+
out = buf.String()
31+
_ = r.Close()
32+
if panicV != nil {
33+
panic(panicV)
34+
}
35+
}()
36+
37+
func() {
38+
defer func() {
39+
panicV = recover()
40+
}()
41+
errRun = fn()
42+
}()
43+
44+
return out, errRun
2945
}
3046

3147
func TestCreateNewProvider(t *testing.T) {

0 commit comments

Comments
 (0)