Skip to content

Commit d52a43c

Browse files
committed
Add MockPageMutator, MockWorkflowMutator, and fix registry completeness test
Add mock implementations of PageMutator (16 methods) and WorkflowMutator (15 methods) using the same Func-field delegation pattern as MockBackend. Both include compile-time interface checks. Fix allKnownStatements() to include 8 missing agent editor statement types (CreateAgent, DropAgent, CreateModel, DropModel, CreateConsumedMCPService, DropConsumedMCPService, CreateKnowledgeBase, DropKnowledgeBase). Add handler count snapshot test.
1 parent 34d7a58 commit d52a43c

3 files changed

Lines changed: 300 additions & 0 deletions

File tree

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
package mock
4+
5+
import (
6+
"github.com/mendixlabs/mxcli/mdl/backend"
7+
"github.com/mendixlabs/mxcli/model"
8+
"github.com/mendixlabs/mxcli/sdk/pages"
9+
)
10+
11+
var _ backend.PageMutator = (*MockPageMutator)(nil)
12+
13+
// MockPageMutator implements backend.PageMutator. Every interface method is
14+
// backed by a public function field. If the field is nil the method returns
15+
// zero values / nil error (never panics).
16+
type MockPageMutator struct {
17+
ContainerTypeFunc func() backend.ContainerKind
18+
SetWidgetPropertyFunc func(widgetRef string, prop string, value any) error
19+
SetWidgetDataSourceFunc func(widgetRef string, ds pages.DataSource) error
20+
SetColumnPropertyFunc func(gridRef string, columnRef string, prop string, value any) error
21+
InsertWidgetFunc func(widgetRef string, columnRef string, position backend.InsertPosition, widgets []pages.Widget) error
22+
DropWidgetFunc func(refs []backend.WidgetRef) error
23+
ReplaceWidgetFunc func(widgetRef string, columnRef string, widgets []pages.Widget) error
24+
FindWidgetFunc func(name string) bool
25+
AddVariableFunc func(name, dataType, defaultValue string) error
26+
DropVariableFunc func(name string) error
27+
SetLayoutFunc func(newLayout string, paramMappings map[string]string) error
28+
SetPluggablePropertyFunc func(widgetRef string, propKey string, op backend.PluggablePropertyOp, ctx backend.PluggablePropertyContext) error
29+
EnclosingEntityFunc func(widgetRef string) string
30+
WidgetScopeFunc func() map[string]model.ID
31+
ParamScopeFunc func() (map[string]model.ID, map[string]string)
32+
SaveFunc func() error
33+
}
34+
35+
func (m *MockPageMutator) ContainerType() backend.ContainerKind {
36+
if m.ContainerTypeFunc != nil {
37+
return m.ContainerTypeFunc()
38+
}
39+
return backend.ContainerPage
40+
}
41+
42+
func (m *MockPageMutator) SetWidgetProperty(widgetRef string, prop string, value any) error {
43+
if m.SetWidgetPropertyFunc != nil {
44+
return m.SetWidgetPropertyFunc(widgetRef, prop, value)
45+
}
46+
return nil
47+
}
48+
49+
func (m *MockPageMutator) SetWidgetDataSource(widgetRef string, ds pages.DataSource) error {
50+
if m.SetWidgetDataSourceFunc != nil {
51+
return m.SetWidgetDataSourceFunc(widgetRef, ds)
52+
}
53+
return nil
54+
}
55+
56+
func (m *MockPageMutator) SetColumnProperty(gridRef string, columnRef string, prop string, value any) error {
57+
if m.SetColumnPropertyFunc != nil {
58+
return m.SetColumnPropertyFunc(gridRef, columnRef, prop, value)
59+
}
60+
return nil
61+
}
62+
63+
func (m *MockPageMutator) InsertWidget(widgetRef string, columnRef string, position backend.InsertPosition, widgets []pages.Widget) error {
64+
if m.InsertWidgetFunc != nil {
65+
return m.InsertWidgetFunc(widgetRef, columnRef, position, widgets)
66+
}
67+
return nil
68+
}
69+
70+
func (m *MockPageMutator) DropWidget(refs []backend.WidgetRef) error {
71+
if m.DropWidgetFunc != nil {
72+
return m.DropWidgetFunc(refs)
73+
}
74+
return nil
75+
}
76+
77+
func (m *MockPageMutator) ReplaceWidget(widgetRef string, columnRef string, widgets []pages.Widget) error {
78+
if m.ReplaceWidgetFunc != nil {
79+
return m.ReplaceWidgetFunc(widgetRef, columnRef, widgets)
80+
}
81+
return nil
82+
}
83+
84+
func (m *MockPageMutator) FindWidget(name string) bool {
85+
if m.FindWidgetFunc != nil {
86+
return m.FindWidgetFunc(name)
87+
}
88+
return false
89+
}
90+
91+
func (m *MockPageMutator) AddVariable(name, dataType, defaultValue string) error {
92+
if m.AddVariableFunc != nil {
93+
return m.AddVariableFunc(name, dataType, defaultValue)
94+
}
95+
return nil
96+
}
97+
98+
func (m *MockPageMutator) DropVariable(name string) error {
99+
if m.DropVariableFunc != nil {
100+
return m.DropVariableFunc(name)
101+
}
102+
return nil
103+
}
104+
105+
func (m *MockPageMutator) SetLayout(newLayout string, paramMappings map[string]string) error {
106+
if m.SetLayoutFunc != nil {
107+
return m.SetLayoutFunc(newLayout, paramMappings)
108+
}
109+
return nil
110+
}
111+
112+
func (m *MockPageMutator) SetPluggableProperty(widgetRef string, propKey string, op backend.PluggablePropertyOp, ctx backend.PluggablePropertyContext) error {
113+
if m.SetPluggablePropertyFunc != nil {
114+
return m.SetPluggablePropertyFunc(widgetRef, propKey, op, ctx)
115+
}
116+
return nil
117+
}
118+
119+
func (m *MockPageMutator) EnclosingEntity(widgetRef string) string {
120+
if m.EnclosingEntityFunc != nil {
121+
return m.EnclosingEntityFunc(widgetRef)
122+
}
123+
return ""
124+
}
125+
126+
func (m *MockPageMutator) WidgetScope() map[string]model.ID {
127+
if m.WidgetScopeFunc != nil {
128+
return m.WidgetScopeFunc()
129+
}
130+
return nil
131+
}
132+
133+
func (m *MockPageMutator) ParamScope() (map[string]model.ID, map[string]string) {
134+
if m.ParamScopeFunc != nil {
135+
return m.ParamScopeFunc()
136+
}
137+
return nil, nil
138+
}
139+
140+
func (m *MockPageMutator) Save() error {
141+
if m.SaveFunc != nil {
142+
return m.SaveFunc()
143+
}
144+
return nil
145+
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
package mock
4+
5+
import (
6+
"github.com/mendixlabs/mxcli/mdl/backend"
7+
"github.com/mendixlabs/mxcli/sdk/workflows"
8+
)
9+
10+
var _ backend.WorkflowMutator = (*MockWorkflowMutator)(nil)
11+
12+
// MockWorkflowMutator implements backend.WorkflowMutator. Every interface
13+
// method is backed by a public function field. If the field is nil the
14+
// method returns zero values / nil error (never panics).
15+
type MockWorkflowMutator struct {
16+
SetPropertyFunc func(prop string, value string) error
17+
SetPropertyWithEntityFunc func(prop string, value string, entity string) error
18+
SetActivityPropertyFunc func(activityRef string, atPos int, prop string, value string) error
19+
InsertAfterActivityFunc func(activityRef string, atPos int, activities []workflows.WorkflowActivity) error
20+
DropActivityFunc func(activityRef string, atPos int) error
21+
ReplaceActivityFunc func(activityRef string, atPos int, activities []workflows.WorkflowActivity) error
22+
InsertOutcomeFunc func(activityRef string, atPos int, outcomeName string, activities []workflows.WorkflowActivity) error
23+
DropOutcomeFunc func(activityRef string, atPos int, outcomeName string) error
24+
InsertPathFunc func(activityRef string, atPos int, pathCaption string, activities []workflows.WorkflowActivity) error
25+
DropPathFunc func(activityRef string, atPos int, pathCaption string) error
26+
InsertBranchFunc func(activityRef string, atPos int, condition string, activities []workflows.WorkflowActivity) error
27+
DropBranchFunc func(activityRef string, atPos int, branchName string) error
28+
InsertBoundaryEventFunc func(activityRef string, atPos int, eventType string, delay string, activities []workflows.WorkflowActivity) error
29+
DropBoundaryEventFunc func(activityRef string, atPos int) error
30+
SaveFunc func() error
31+
}
32+
33+
func (m *MockWorkflowMutator) SetProperty(prop string, value string) error {
34+
if m.SetPropertyFunc != nil {
35+
return m.SetPropertyFunc(prop, value)
36+
}
37+
return nil
38+
}
39+
40+
func (m *MockWorkflowMutator) SetPropertyWithEntity(prop string, value string, entity string) error {
41+
if m.SetPropertyWithEntityFunc != nil {
42+
return m.SetPropertyWithEntityFunc(prop, value, entity)
43+
}
44+
return nil
45+
}
46+
47+
func (m *MockWorkflowMutator) SetActivityProperty(activityRef string, atPos int, prop string, value string) error {
48+
if m.SetActivityPropertyFunc != nil {
49+
return m.SetActivityPropertyFunc(activityRef, atPos, prop, value)
50+
}
51+
return nil
52+
}
53+
54+
func (m *MockWorkflowMutator) InsertAfterActivity(activityRef string, atPos int, activities []workflows.WorkflowActivity) error {
55+
if m.InsertAfterActivityFunc != nil {
56+
return m.InsertAfterActivityFunc(activityRef, atPos, activities)
57+
}
58+
return nil
59+
}
60+
61+
func (m *MockWorkflowMutator) DropActivity(activityRef string, atPos int) error {
62+
if m.DropActivityFunc != nil {
63+
return m.DropActivityFunc(activityRef, atPos)
64+
}
65+
return nil
66+
}
67+
68+
func (m *MockWorkflowMutator) ReplaceActivity(activityRef string, atPos int, activities []workflows.WorkflowActivity) error {
69+
if m.ReplaceActivityFunc != nil {
70+
return m.ReplaceActivityFunc(activityRef, atPos, activities)
71+
}
72+
return nil
73+
}
74+
75+
func (m *MockWorkflowMutator) InsertOutcome(activityRef string, atPos int, outcomeName string, activities []workflows.WorkflowActivity) error {
76+
if m.InsertOutcomeFunc != nil {
77+
return m.InsertOutcomeFunc(activityRef, atPos, outcomeName, activities)
78+
}
79+
return nil
80+
}
81+
82+
func (m *MockWorkflowMutator) DropOutcome(activityRef string, atPos int, outcomeName string) error {
83+
if m.DropOutcomeFunc != nil {
84+
return m.DropOutcomeFunc(activityRef, atPos, outcomeName)
85+
}
86+
return nil
87+
}
88+
89+
func (m *MockWorkflowMutator) InsertPath(activityRef string, atPos int, pathCaption string, activities []workflows.WorkflowActivity) error {
90+
if m.InsertPathFunc != nil {
91+
return m.InsertPathFunc(activityRef, atPos, pathCaption, activities)
92+
}
93+
return nil
94+
}
95+
96+
func (m *MockWorkflowMutator) DropPath(activityRef string, atPos int, pathCaption string) error {
97+
if m.DropPathFunc != nil {
98+
return m.DropPathFunc(activityRef, atPos, pathCaption)
99+
}
100+
return nil
101+
}
102+
103+
func (m *MockWorkflowMutator) InsertBranch(activityRef string, atPos int, condition string, activities []workflows.WorkflowActivity) error {
104+
if m.InsertBranchFunc != nil {
105+
return m.InsertBranchFunc(activityRef, atPos, condition, activities)
106+
}
107+
return nil
108+
}
109+
110+
func (m *MockWorkflowMutator) DropBranch(activityRef string, atPos int, branchName string) error {
111+
if m.DropBranchFunc != nil {
112+
return m.DropBranchFunc(activityRef, atPos, branchName)
113+
}
114+
return nil
115+
}
116+
117+
func (m *MockWorkflowMutator) InsertBoundaryEvent(activityRef string, atPos int, eventType string, delay string, activities []workflows.WorkflowActivity) error {
118+
if m.InsertBoundaryEventFunc != nil {
119+
return m.InsertBoundaryEventFunc(activityRef, atPos, eventType, delay, activities)
120+
}
121+
return nil
122+
}
123+
124+
func (m *MockWorkflowMutator) DropBoundaryEvent(activityRef string, atPos int) error {
125+
if m.DropBoundaryEventFunc != nil {
126+
return m.DropBoundaryEventFunc(activityRef, atPos)
127+
}
128+
return nil
129+
}
130+
131+
func (m *MockWorkflowMutator) Save() error {
132+
if m.SaveFunc != nil {
133+
return m.SaveFunc()
134+
}
135+
return nil
136+
}

mdl/executor/registry_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,11 @@ func allKnownStatements() []ast.Statement {
172172
&ast.AlterUserRoleStmt{},
173173
&ast.AlterWorkflowStmt{},
174174
&ast.ConnectStmt{},
175+
&ast.CreateAgentStmt{},
175176
&ast.CreateAssociationStmt{},
176177
&ast.CreateBusinessEventServiceStmt{},
177178
&ast.CreateConfigurationStmt{},
179+
&ast.CreateConsumedMCPServiceStmt{},
178180
&ast.CreateConstantStmt{},
179181
&ast.CreateDatabaseConnectionStmt{},
180182
&ast.CreateDataTransformerStmt{},
@@ -188,7 +190,9 @@ func allKnownStatements() []ast.Statement {
188190
&ast.CreateImportMappingStmt{},
189191
&ast.CreateJavaActionStmt{},
190192
&ast.CreateJsonStructureStmt{},
193+
&ast.CreateKnowledgeBaseStmt{},
191194
&ast.CreateMicroflowStmt{},
195+
&ast.CreateModelStmt{},
192196
&ast.CreateModuleRoleStmt{},
193197
&ast.CreateModuleStmt{},
194198
&ast.CreateODataClientStmt{},
@@ -206,9 +210,11 @@ func allKnownStatements() []ast.Statement {
206210
&ast.DescribeStmt{},
207211
&ast.DescribeStylingStmt{},
208212
&ast.DisconnectStmt{},
213+
&ast.DropAgentStmt{},
209214
&ast.DropAssociationStmt{},
210215
&ast.DropBusinessEventServiceStmt{},
211216
&ast.DropConfigurationStmt{},
217+
&ast.DropConsumedMCPServiceStmt{},
212218
&ast.DropConstantStmt{},
213219
&ast.DropDataTransformerStmt{},
214220
&ast.DropDemoUserStmt{},
@@ -220,7 +226,9 @@ func allKnownStatements() []ast.Statement {
220226
&ast.DropImportMappingStmt{},
221227
&ast.DropJavaActionStmt{},
222228
&ast.DropJsonStructureStmt{},
229+
&ast.DropKnowledgeBaseStmt{},
223230
&ast.DropMicroflowStmt{},
231+
&ast.DropModelStmt{},
224232
&ast.DropModuleRoleStmt{},
225233
&ast.DropModuleStmt{},
226234
&ast.DropODataClientStmt{},
@@ -286,3 +294,14 @@ func TestNewRegistry_Completeness(t *testing.T) {
286294
t.Fatalf("registry is incomplete: %v", err)
287295
}
288296
}
297+
298+
// TestNewRegistry_HandlerCountSnapshot validates the expected number of
299+
// registered handlers. Update the expected count when adding new handlers.
300+
func TestNewRegistry_HandlerCountSnapshot(t *testing.T) {
301+
r := NewRegistry()
302+
known := allKnownStatements()
303+
304+
if got := r.HandlerCount(); got != len(known) {
305+
t.Errorf("handler count mismatch: registry has %d, allKnownStatements has %d — update allKnownStatements or register missing handlers", got, len(known))
306+
}
307+
}

0 commit comments

Comments
 (0)