Skip to content

Commit da7fe29

Browse files
authored
refactor(core): add context to git interfaces and remove type assertions (#226)
1 parent 059cea0 commit da7fe29

File tree

19 files changed

+542
-446
lines changed

19 files changed

+542
-446
lines changed

internal/commands/bump/bump_commit_tag_test.go

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package bump
22

33
import (
4+
"context"
45
"fmt"
56
"strings"
67
"testing"
@@ -50,18 +51,18 @@ func TestCommitAndTagAfterBump_Success(t *testing.T) {
5051
Prefix: "v",
5152
Annotate: true,
5253
}, &tagmanager.MockGitTagOperations{
53-
TagExistsFn: func(name string) (bool, error) { return false, nil },
54-
CreateAnnotatedTagFn: func(name, message string) error {
54+
TagExistsFn: func(ctx context.Context, name string) (bool, error) { return false, nil },
55+
CreateAnnotatedTagFn: func(ctx context.Context, name, message string) error {
5556
createdTag = name
5657
return nil
5758
},
5859
}, &tagmanager.MockGitCommitOperations{
59-
GetModifiedFilesFn: func() ([]string, error) { return []string{}, nil },
60-
StageFilesFn: func(files ...string) error {
60+
GetModifiedFilesFn: func(ctx context.Context) ([]string, error) { return []string{}, nil },
61+
StageFilesFn: func(ctx context.Context, files ...string) error {
6162
stagedFiles = append(stagedFiles, files...)
6263
return nil
6364
},
64-
CommitFn: func(message string) error {
65+
CommitFn: func(ctx context.Context, message string) error {
6566
commitMsg = message
6667
return nil
6768
},
@@ -97,17 +98,17 @@ func TestCommitAndTagAfterBump_WithModifiedFiles(t *testing.T) {
9798
Prefix: "v",
9899
Annotate: true,
99100
}, &tagmanager.MockGitTagOperations{
100-
TagExistsFn: func(name string) (bool, error) { return false, nil },
101-
CreateAnnotatedTagFn: func(name, message string) error { return nil },
101+
TagExistsFn: func(ctx context.Context, name string) (bool, error) { return false, nil },
102+
CreateAnnotatedTagFn: func(ctx context.Context, name, message string) error { return nil },
102103
}, &tagmanager.MockGitCommitOperations{
103-
GetModifiedFilesFn: func() ([]string, error) {
104+
GetModifiedFilesFn: func(ctx context.Context) ([]string, error) {
104105
return []string{"CHANGELOG.md", "package.json"}, nil
105106
},
106-
StageFilesFn: func(files ...string) error {
107+
StageFilesFn: func(ctx context.Context, files ...string) error {
107108
stagedFiles = append(stagedFiles, files...)
108109
return nil
109110
},
110-
CommitFn: func(message string) error { return nil },
111+
CommitFn: func(ctx context.Context, message string) error { return nil },
111112
})
112113

113114
registry := plugins.NewPluginRegistry()
@@ -132,9 +133,9 @@ func TestCommitAndTagAfterBump_CommitFails(t *testing.T) {
132133
AutoCreate: true,
133134
Prefix: "v",
134135
}, &tagmanager.MockGitTagOperations{}, &tagmanager.MockGitCommitOperations{
135-
GetModifiedFilesFn: func() ([]string, error) { return []string{}, nil },
136-
StageFilesFn: func(files ...string) error { return nil },
137-
CommitFn: func(message string) error { return fmt.Errorf("commit failed") },
136+
GetModifiedFilesFn: func(ctx context.Context) ([]string, error) { return []string{}, nil },
137+
StageFilesFn: func(ctx context.Context, files ...string) error { return nil },
138+
CommitFn: func(ctx context.Context, message string) error { return fmt.Errorf("commit failed") },
138139
})
139140

140141
registry := plugins.NewPluginRegistry()
@@ -159,12 +160,12 @@ func TestCommitAndTagAfterBump_TagCreationFails(t *testing.T) {
159160
Prefix: "v",
160161
Annotate: true,
161162
}, &tagmanager.MockGitTagOperations{
162-
TagExistsFn: func(name string) (bool, error) { return false, nil },
163-
CreateAnnotatedTagFn: func(name, message string) error { return fmt.Errorf("tag creation failed") },
163+
TagExistsFn: func(ctx context.Context, name string) (bool, error) { return false, nil },
164+
CreateAnnotatedTagFn: func(ctx context.Context, name, message string) error { return fmt.Errorf("tag creation failed") },
164165
}, &tagmanager.MockGitCommitOperations{
165-
GetModifiedFilesFn: func() ([]string, error) { return []string{}, nil },
166-
StageFilesFn: func(files ...string) error { return nil },
167-
CommitFn: func(message string) error { return nil },
166+
GetModifiedFilesFn: func(ctx context.Context) ([]string, error) { return []string{}, nil },
167+
StageFilesFn: func(ctx context.Context, files ...string) error { return nil },
168+
CommitFn: func(ctx context.Context, message string) error { return nil },
168169
})
169170

170171
registry := plugins.NewPluginRegistry()
@@ -189,12 +190,12 @@ func TestCommitAndTagAfterBump_WithoutBumpedPath(t *testing.T) {
189190
Prefix: "v",
190191
Annotate: true,
191192
}, &tagmanager.MockGitTagOperations{
192-
TagExistsFn: func(name string) (bool, error) { return false, nil },
193-
CreateAnnotatedTagFn: func(name, message string) error { return nil },
193+
TagExistsFn: func(ctx context.Context, name string) (bool, error) { return false, nil },
194+
CreateAnnotatedTagFn: func(ctx context.Context, name, message string) error { return nil },
194195
}, &tagmanager.MockGitCommitOperations{
195-
GetModifiedFilesFn: func() ([]string, error) { return []string{".version"}, nil },
196-
StageFilesFn: func(files ...string) error { return nil },
197-
CommitFn: func(message string) error { return nil },
196+
GetModifiedFilesFn: func(ctx context.Context) ([]string, error) { return []string{".version"}, nil },
197+
StageFilesFn: func(ctx context.Context, files ...string) error { return nil },
198+
CommitFn: func(ctx context.Context, message string) error { return nil },
198199
})
199200

200201
registry := plugins.NewPluginRegistry()
@@ -220,16 +221,16 @@ func TestCommitAndTagAfterBump_WithPush(t *testing.T) {
220221
Annotate: true,
221222
Push: true,
222223
}, &tagmanager.MockGitTagOperations{
223-
TagExistsFn: func(name string) (bool, error) { return false, nil },
224-
CreateAnnotatedTagFn: func(name, message string) error { return nil },
225-
PushTagFn: func(name string) error {
224+
TagExistsFn: func(ctx context.Context, name string) (bool, error) { return false, nil },
225+
CreateAnnotatedTagFn: func(ctx context.Context, name, message string) error { return nil },
226+
PushTagFn: func(ctx context.Context, name string) error {
226227
pushedTag = name
227228
return nil
228229
},
229230
}, &tagmanager.MockGitCommitOperations{
230-
GetModifiedFilesFn: func() ([]string, error) { return []string{}, nil },
231-
StageFilesFn: func(files ...string) error { return nil },
232-
CommitFn: func(message string) error { return nil },
231+
GetModifiedFilesFn: func(ctx context.Context) ([]string, error) { return []string{}, nil },
232+
StageFilesFn: func(ctx context.Context, files ...string) error { return nil },
233+
CommitFn: func(ctx context.Context, message string) error { return nil },
233234
})
234235

235236
registry := plugins.NewPluginRegistry()
@@ -257,12 +258,12 @@ func TestCommitAndTagAfterBump_CustomCommitMessageTemplate(t *testing.T) {
257258
Annotate: true,
258259
CommitMessageTemplate: "release: bump to {version}",
259260
}, &tagmanager.MockGitTagOperations{
260-
TagExistsFn: func(name string) (bool, error) { return false, nil },
261-
CreateAnnotatedTagFn: func(name, message string) error { return nil },
261+
TagExistsFn: func(ctx context.Context, name string) (bool, error) { return false, nil },
262+
CreateAnnotatedTagFn: func(ctx context.Context, name, message string) error { return nil },
262263
}, &tagmanager.MockGitCommitOperations{
263-
GetModifiedFilesFn: func() ([]string, error) { return []string{}, nil },
264-
StageFilesFn: func(files ...string) error { return nil },
265-
CommitFn: func(message string) error {
264+
GetModifiedFilesFn: func(ctx context.Context) ([]string, error) { return []string{}, nil },
265+
StageFilesFn: func(ctx context.Context, files ...string) error { return nil },
266+
CommitFn: func(ctx context.Context, message string) error {
266267
commitMsg = message
267268
return nil
268269
},

internal/commands/bump/bump_helpers_test.go

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package bump
33
import (
44
"testing"
55

6+
"github.com/indaco/sley/internal/plugins/tagmanager"
67
"github.com/indaco/sley/internal/semver"
78
)
89

@@ -12,21 +13,22 @@ import (
1213

1314
// mockTagManager implements tagmanager.TagManager for testing
1415
type mockTagManager struct {
15-
validateErr error
16-
createErr error
16+
validateErr error
17+
createErr error
18+
autoCreateEnabled bool
1719
}
1820

19-
func (m *mockTagManager) Name() string { return "mock-tag-manager" }
20-
func (m *mockTagManager) Description() string { return "mock tag manager" }
21-
func (m *mockTagManager) Version() string { return "1.0.0" }
22-
func (m *mockTagManager) ValidateTagAvailable(v semver.SemVersion) error { return m.validateErr }
23-
func (m *mockTagManager) CreateTag(v semver.SemVersion, msg string) error { return m.createErr }
24-
func (m *mockTagManager) FormatTagName(v semver.SemVersion) string { return "v" + v.String() }
25-
func (m *mockTagManager) TagExists(v semver.SemVersion) (bool, error) { return false, nil }
26-
func (m *mockTagManager) PushTag(v semver.SemVersion) error { return nil }
27-
func (m *mockTagManager) DeleteTag(v semver.SemVersion) error { return nil }
28-
func (m *mockTagManager) GetLatestTag() (semver.SemVersion, error) { return semver.SemVersion{}, nil }
29-
func (m *mockTagManager) ListTags() ([]string, error) { return nil, nil }
21+
func (m *mockTagManager) Name() string { return "mock-tag-manager" }
22+
func (m *mockTagManager) Description() string { return "mock tag manager" }
23+
func (m *mockTagManager) Version() string { return "1.0.0" }
24+
func (m *mockTagManager) ValidateTagAvailable(v semver.SemVersion) error { return m.validateErr }
25+
func (m *mockTagManager) CreateTag(v semver.SemVersion, msg string) error { return m.createErr }
26+
func (m *mockTagManager) FormatTagName(v semver.SemVersion) string { return "v" + v.String() }
27+
func (m *mockTagManager) TagExists(v semver.SemVersion) (bool, error) { return false, nil }
28+
func (m *mockTagManager) GetLatestTag() (semver.SemVersion, error) { return semver.SemVersion{}, nil }
29+
func (m *mockTagManager) IsAutoCreateEnabled() bool { return m.autoCreateEnabled }
30+
func (m *mockTagManager) GetConfig() *tagmanager.Config { return tagmanager.DefaultConfig() }
31+
func (m *mockTagManager) CommitChanges(_ semver.SemVersion, _ []string) error { return nil }
3032

3133
// mockVersionValidator implements versionvalidator.VersionValidator for testing
3234
type mockVersionValidator struct {
@@ -40,6 +42,7 @@ func (m *mockVersionValidator) Validate(newV, prevV semver.SemVersion, bumpType
4042
return m.validateErr
4143
}
4244
func (m *mockVersionValidator) ValidateSet(v semver.SemVersion) error { return nil }
45+
func (m *mockVersionValidator) IsEnabled() bool { return true }
4346

4447
// mockReleaseGate implements releasegate.ReleaseGate for testing
4548
type mockReleaseGate struct {
@@ -52,6 +55,7 @@ func (m *mockReleaseGate) Version() string { return "1.0.0" }
5255
func (m *mockReleaseGate) ValidateRelease(newV, prevV semver.SemVersion, bumpType string) error {
5356
return m.validateErr
5457
}
58+
func (m *mockReleaseGate) IsEnabled() bool { return true }
5559

5660
/* ------------------------------------------------------------------------- */
5761
/* HELPER FUNCTION TESTS */

internal/commands/bump/bump_plugins_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func TestValidateTagAvailable(t *testing.T) {
5454

5555
t.Run("mock tag manager returns validation error", func(t *testing.T) {
5656
registry := plugins.NewPluginRegistry()
57-
mock := &mockTagManager{validateErr: fmt.Errorf("tag exists")}
57+
mock := &mockTagManager{validateErr: fmt.Errorf("tag exists"), autoCreateEnabled: true}
5858
if err := registry.RegisterTagManager(mock); err != nil {
5959
t.Fatalf("failed to register tag manager: %v", err)
6060
}
@@ -654,7 +654,7 @@ func TestSingleModuleBump_ValidateTagAvailableFails(t *testing.T) {
654654
// Create a tag manager that fails validation
655655
cfg := &config.Config{Path: versionPath}
656656
registry := plugins.NewPluginRegistry()
657-
mock := &mockTagManager{validateErr: fmt.Errorf("tag already exists")}
657+
mock := &mockTagManager{validateErr: fmt.Errorf("tag already exists"), autoCreateEnabled: true}
658658
if err := registry.RegisterTagManager(mock); err != nil {
659659
t.Fatalf("failed to register tag manager: %v", err)
660660
}

internal/commands/bump/helpers.go

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ import (
1111
"github.com/indaco/sley/internal/plugins"
1212
"github.com/indaco/sley/internal/plugins/auditlog"
1313
"github.com/indaco/sley/internal/plugins/changeloggenerator"
14-
"github.com/indaco/sley/internal/plugins/dependencycheck"
15-
"github.com/indaco/sley/internal/plugins/releasegate"
16-
"github.com/indaco/sley/internal/plugins/tagmanager"
17-
"github.com/indaco/sley/internal/plugins/versionvalidator"
1814
"github.com/indaco/sley/internal/printer"
1915
"github.com/indaco/sley/internal/semver"
2016
)
@@ -90,11 +86,8 @@ func validateTagAvailable(registry *plugins.PluginRegistry, version semver.SemVe
9086
return nil
9187
}
9288

93-
// Check if the plugin is enabled and auto-create is on
94-
if plugin, ok := tm.(*tagmanager.TagManagerPlugin); ok {
95-
if !plugin.IsAutoCreateEnabled() {
96-
return nil
97-
}
89+
if !tm.IsAutoCreateEnabled() {
90+
return nil
9891
}
9992

10093
return tm.ValidateTagAvailable(version)
@@ -114,9 +107,7 @@ func commitAndTagAfterBump(registry *plugins.PluginRegistry, version semver.SemV
114107
return nil
115108
}
116109

117-
// Check if the plugin is enabled and auto-create is on
118-
plugin, ok := tm.(*tagmanager.TagManagerPlugin)
119-
if !ok || !plugin.IsAutoCreateEnabled() {
110+
if !tm.IsAutoCreateEnabled() {
120111
return nil
121112
}
122113

@@ -125,7 +116,7 @@ func commitAndTagAfterBump(registry *plugins.PluginRegistry, version semver.SemV
125116
if bumpedPath != "" {
126117
extraFiles = []string{bumpedPath}
127118
}
128-
if err := plugin.CommitChanges(version, extraFiles); err != nil {
119+
if err := tm.CommitChanges(version, extraFiles); err != nil {
129120
return fmt.Errorf("failed to commit release changes: %w", err)
130121
}
131122
printer.PrintSuccess(fmt.Sprintf("Committed release changes for %s", version.String()))
@@ -139,7 +130,7 @@ func commitAndTagAfterBump(registry *plugins.PluginRegistry, version semver.SemV
139130
tagName := tm.FormatTagName(version)
140131
printer.PrintSuccess(fmt.Sprintf("Created tag: %s", tagName))
141132

142-
if plugin.GetConfig().Push {
133+
if tm.GetConfig().Push {
143134
printer.PrintSuccess(fmt.Sprintf("Pushed tag: %s", tagName))
144135
}
145136

@@ -154,11 +145,8 @@ func validateVersionPolicy(registry *plugins.PluginRegistry, newVersion, previou
154145
return nil
155146
}
156147

157-
// Check if the plugin is enabled
158-
if plugin, ok := vv.(*versionvalidator.VersionValidatorPlugin); ok {
159-
if !plugin.IsEnabled() {
160-
return nil
161-
}
148+
if !vv.IsEnabled() {
149+
return nil
162150
}
163151

164152
return vv.Validate(newVersion, previousVersion, bumpType)
@@ -172,11 +160,8 @@ func validateReleaseGate(registry *plugins.PluginRegistry, newVersion, previousV
172160
return nil
173161
}
174162

175-
// Check if the plugin is enabled
176-
if plugin, ok := rg.(*releasegate.ReleaseGatePlugin); ok {
177-
if !plugin.IsEnabled() {
178-
return nil
179-
}
163+
if !rg.IsEnabled() {
164+
return nil
180165
}
181166

182167
return rg.ValidateRelease(newVersion, previousVersion, bumpType)
@@ -190,8 +175,7 @@ func validateDependencyConsistency(registry *plugins.PluginRegistry, version sem
190175
return nil
191176
}
192177

193-
plugin, ok := dc.(*dependencycheck.DependencyCheckerPlugin)
194-
if !ok || !plugin.IsEnabled() {
178+
if !dc.IsEnabled() {
195179
return nil
196180
}
197181

@@ -202,7 +186,7 @@ func validateDependencyConsistency(registry *plugins.PluginRegistry, version sem
202186

203187
if len(inconsistencies) > 0 {
204188
// If auto-sync is enabled, skip the error - inconsistencies will be fixed after the bump
205-
if plugin.GetConfig().AutoSync {
189+
if dc.GetConfig().AutoSync {
206190
return nil
207191
}
208192

@@ -226,8 +210,7 @@ func generateChangelogAfterBump(registry *plugins.PluginRegistry, version, _ sem
226210
return nil
227211
}
228212

229-
plugin, ok := cg.(*changeloggenerator.ChangelogGeneratorPlugin)
230-
if !ok || !plugin.IsEnabled() {
213+
if !cg.IsEnabled() {
231214
return nil
232215
}
233216

@@ -245,15 +228,15 @@ func generateChangelogAfterBump(registry *plugins.PluginRegistry, version, _ sem
245228
return fmt.Errorf("failed to generate changelog: %w", err)
246229
}
247230

248-
mode := plugin.GetConfig().Mode
249-
switch mode {
231+
cfg := cg.GetConfig()
232+
switch cfg.Mode {
250233
case "versioned":
251-
printer.PrintSuccess(fmt.Sprintf("Generated changelog: %s/%s.md", plugin.GetConfig().ChangesDir, versionStr))
234+
printer.PrintSuccess(fmt.Sprintf("Generated changelog: %s/%s.md", cfg.ChangesDir, versionStr))
252235
case "unified":
253-
printer.PrintSuccess(fmt.Sprintf("Updated changelog: %s", plugin.GetConfig().ChangelogPath))
236+
printer.PrintSuccess(fmt.Sprintf("Updated changelog: %s", cfg.ChangelogPath))
254237
case "both":
255238
printer.PrintSuccess(fmt.Sprintf("Generated changelog: %s/%s.md and %s",
256-
plugin.GetConfig().ChangesDir, versionStr, plugin.GetConfig().ChangelogPath))
239+
cfg.ChangesDir, versionStr, cfg.ChangelogPath))
257240
}
258241

259242
return nil
@@ -267,8 +250,7 @@ func recordAuditLogEntry(registry *plugins.PluginRegistry, version, previousVers
267250
return nil
268251
}
269252

270-
plugin, ok := al.(*auditlog.AuditLogPlugin)
271-
if !ok || !plugin.IsEnabled() {
253+
if !al.IsEnabled() {
272254
return nil
273255
}
274256

internal/commands/depsync/sync.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,11 @@ func SyncDependencies(registry *plugins.PluginRegistry, version semver.SemVersio
2121
return nil
2222
}
2323

24-
plugin, ok := dc.(*dependencycheck.DependencyCheckerPlugin)
25-
if !ok || !plugin.IsEnabled() || !plugin.GetConfig().AutoSync {
24+
if !dc.IsEnabled() || !dc.GetConfig().AutoSync {
2625
return nil
2726
}
2827

29-
files := plugin.GetConfig().Files
28+
files := dc.GetConfig().Files
3029
if len(files) == 0 {
3130
return nil
3231
}

0 commit comments

Comments
 (0)