Skip to content

Commit 4d462ac

Browse files
committed
test: expand mock tests for settings, fragments, misc, javaactions
1 parent fc7ef35 commit 4d462ac

4 files changed

Lines changed: 199 additions & 0 deletions

File tree

mdl/executor/cmd_fragments_mock_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,37 @@ func TestShowFragments_Empty_Mock(t *testing.T) {
2929
out := buf.String()
3030
assertContainsStr(t, out, "No fragments defined.")
3131
}
32+
33+
func TestDescribeFragment_Mock(t *testing.T) {
34+
ctx, buf := newMockCtx(t)
35+
ctx.Fragments = map[string]*ast.DefineFragmentStmt{
36+
"myFrag": {
37+
Name: "myFrag",
38+
Widgets: []*ast.WidgetV3{
39+
{Type: "Button", Name: "btnSave"},
40+
},
41+
},
42+
}
43+
44+
assertNoError(t, describeFragment(ctx, ast.QualifiedName{Name: "myFrag"}))
45+
46+
out := buf.String()
47+
assertContainsStr(t, out, "define fragment myFrag")
48+
assertContainsStr(t, out, "Button btnSave")
49+
}
50+
51+
func TestDescribeFragment_NotFound(t *testing.T) {
52+
ctx, _ := newMockCtx(t)
53+
ctx.Fragments = map[string]*ast.DefineFragmentStmt{}
54+
55+
err := describeFragment(ctx, ast.QualifiedName{Name: "noSuchFrag"})
56+
assertError(t, err)
57+
}
58+
59+
func TestDescribeFragment_NilFragments(t *testing.T) {
60+
ctx, _ := newMockCtx(t)
61+
// ctx.Fragments is nil by default
62+
63+
err := describeFragment(ctx, ast.QualifiedName{Name: "noSuchFrag"})
64+
assertError(t, err)
65+
}

mdl/executor/cmd_javaactions_mock_test.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package executor
44

55
import (
6+
"fmt"
67
"testing"
78

89
"github.com/mendixlabs/mxcli/mdl/ast"
@@ -56,3 +57,85 @@ func TestDescribeJavaAction_Mock(t *testing.T) {
5657
out := buf.String()
5758
assertContainsStr(t, out, "create java action")
5859
}
60+
61+
// NOTE: listJavaActions has no explicit not-connected guard. It calls
62+
// getHierarchy (returns nil when disconnected) then proceeds to call
63+
// ListJavaActions on the backend. The handler degrades gracefully —
64+
// with an empty result set it succeeds with a nil hierarchy.
65+
66+
func TestShowJavaActions_BackendError(t *testing.T) {
67+
mod := mkModule("MyModule")
68+
h := mkHierarchy(mod)
69+
70+
mb := &mock.MockBackend{
71+
IsConnectedFunc: func() bool { return true },
72+
ListJavaActionsFunc: func() ([]*types.JavaAction, error) {
73+
return nil, fmt.Errorf("backend unavailable")
74+
},
75+
}
76+
ctx, _ := newMockCtx(t, withBackend(mb), withHierarchy(h))
77+
assertError(t, listJavaActions(ctx, ""))
78+
}
79+
80+
func TestDescribeJavaAction_NotFound(t *testing.T) {
81+
mb := &mock.MockBackend{
82+
IsConnectedFunc: func() bool { return true },
83+
ReadJavaActionByNameFunc: func(qn string) (*javaactions.JavaAction, error) {
84+
return nil, fmt.Errorf("not found")
85+
},
86+
}
87+
ctx, _ := newMockCtx(t, withBackend(mb))
88+
assertError(t, describeJavaAction(ctx, ast.QualifiedName{Module: "MyModule", Name: "Missing"}))
89+
}
90+
91+
func TestShowJavaActions_FilterByModule(t *testing.T) {
92+
mod1 := mkModule("Alpha")
93+
mod2 := mkModule("Beta")
94+
ja1 := &types.JavaAction{
95+
BaseElement: model.BaseElement{ID: nextID("ja")},
96+
ContainerID: mod1.ID,
97+
Name: "ActionA",
98+
}
99+
ja2 := &types.JavaAction{
100+
BaseElement: model.BaseElement{ID: nextID("ja")},
101+
ContainerID: mod2.ID,
102+
Name: "ActionB",
103+
}
104+
105+
h := mkHierarchy(mod1, mod2)
106+
withContainer(h, ja1.ContainerID, mod1.ID)
107+
withContainer(h, ja2.ContainerID, mod2.ID)
108+
109+
mb := &mock.MockBackend{
110+
IsConnectedFunc: func() bool { return true },
111+
ListJavaActionsFunc: func() ([]*types.JavaAction, error) { return []*types.JavaAction{ja1, ja2}, nil },
112+
}
113+
114+
ctx, buf := newMockCtx(t, withBackend(mb), withHierarchy(h))
115+
assertNoError(t, listJavaActions(ctx, "Alpha"))
116+
117+
out := buf.String()
118+
assertContainsStr(t, out, "Alpha.ActionA")
119+
assertNotContainsStr(t, out, "Beta.ActionB")
120+
}
121+
122+
func TestShowJavaActions_JSON(t *testing.T) {
123+
mod := mkModule("MyModule")
124+
ja := &types.JavaAction{
125+
BaseElement: model.BaseElement{ID: nextID("ja")},
126+
ContainerID: mod.ID,
127+
Name: "DoSomething",
128+
}
129+
130+
h := mkHierarchy(mod)
131+
withContainer(h, ja.ContainerID, mod.ID)
132+
133+
mb := &mock.MockBackend{
134+
IsConnectedFunc: func() bool { return true },
135+
ListJavaActionsFunc: func() ([]*types.JavaAction, error) { return []*types.JavaAction{ja}, nil },
136+
}
137+
138+
ctx, buf := newMockCtx(t, withBackend(mb), withHierarchy(h), withFormat(FormatJSON))
139+
assertNoError(t, listJavaActions(ctx, ""))
140+
assertValidJSON(t, buf.String())
141+
}

mdl/executor/cmd_misc_mock_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,40 @@ func TestShowVersion_Mock(t *testing.T) {
3333
assertContainsStr(t, out, "Schema Hash")
3434
assertContainsStr(t, out, "abc123def456")
3535
}
36+
37+
func TestShowVersion_NotConnected(t *testing.T) {
38+
mb := &mock.MockBackend{
39+
IsConnectedFunc: func() bool { return false },
40+
}
41+
ctx, _ := newMockCtx(t, withBackend(mb))
42+
assertError(t, listVersion(ctx))
43+
}
44+
45+
func TestShowVersion_NoSchemaHash(t *testing.T) {
46+
mb := &mock.MockBackend{
47+
IsConnectedFunc: func() bool { return true },
48+
ProjectVersionFunc: func() *types.ProjectVersion {
49+
return &types.ProjectVersion{
50+
ProductVersion: "9.24.0",
51+
BuildVersion: "9.24.0.5678",
52+
FormatVersion: 1,
53+
SchemaHash: "",
54+
}
55+
},
56+
}
57+
ctx, buf := newMockCtx(t, withBackend(mb))
58+
assertNoError(t, listVersion(ctx))
59+
60+
out := buf.String()
61+
assertContainsStr(t, out, "9.24.0")
62+
assertNotContainsStr(t, out, "Schema Hash")
63+
}
64+
65+
func TestHelp_Mock(t *testing.T) {
66+
ctx, buf := newMockCtx(t)
67+
assertNoError(t, execHelp(ctx))
68+
69+
out := buf.String()
70+
assertContainsStr(t, out, "MDL Commands")
71+
assertContainsStr(t, out, "connect local")
72+
}

mdl/executor/cmd_settings_mock_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package executor
44

55
import (
6+
"fmt"
67
"testing"
78

89
"github.com/mendixlabs/mxcli/mdl/backend/mock"
@@ -46,3 +47,47 @@ func TestDescribeSettings_Mock(t *testing.T) {
4647
assertNoError(t, describeSettings(ctx))
4748
assertContainsStr(t, buf.String(), "alter settings")
4849
}
50+
51+
func TestShowSettings_NotConnected(t *testing.T) {
52+
mb := &mock.MockBackend{
53+
IsConnectedFunc: func() bool { return false },
54+
}
55+
ctx, _ := newMockCtx(t, withBackend(mb))
56+
assertError(t, listSettings(ctx))
57+
}
58+
59+
func TestDescribeSettings_NotConnected(t *testing.T) {
60+
mb := &mock.MockBackend{
61+
IsConnectedFunc: func() bool { return false },
62+
}
63+
ctx, _ := newMockCtx(t, withBackend(mb))
64+
assertError(t, describeSettings(ctx))
65+
}
66+
67+
func TestShowSettings_BackendError(t *testing.T) {
68+
mb := &mock.MockBackend{
69+
IsConnectedFunc: func() bool { return true },
70+
GetProjectSettingsFunc: func() (*model.ProjectSettings, error) {
71+
return nil, fmt.Errorf("connection lost")
72+
},
73+
}
74+
ctx, _ := newMockCtx(t, withBackend(mb))
75+
assertError(t, listSettings(ctx))
76+
}
77+
78+
func TestShowSettings_JSON(t *testing.T) {
79+
mb := &mock.MockBackend{
80+
IsConnectedFunc: func() bool { return true },
81+
GetProjectSettingsFunc: func() (*model.ProjectSettings, error) {
82+
return &model.ProjectSettings{
83+
Model: &model.ModelSettings{
84+
HashAlgorithm: "BCrypt",
85+
JavaVersion: "17",
86+
},
87+
}, nil
88+
},
89+
}
90+
ctx, buf := newMockCtx(t, withBackend(mb), withFormat(FormatJSON))
91+
assertNoError(t, listSettings(ctx))
92+
assertValidJSON(t, buf.String())
93+
}

0 commit comments

Comments
 (0)