|
8 | 8 | "bytes" |
9 | 9 | "os" |
10 | 10 | "path/filepath" |
| 11 | + "strings" |
11 | 12 | "testing" |
12 | 13 |
|
13 | 14 | "github.com/mendixlabs/mxcli/mdl/ast" |
@@ -88,6 +89,94 @@ func TestRoundtripEntity_WithIndex(t *testing.T) { |
88 | 89 | }) |
89 | 90 | } |
90 | 91 |
|
| 92 | +func TestRoundtripEntity_WithEventHandler(t *testing.T) { |
| 93 | + env := setupTestEnv(t) |
| 94 | + defer env.teardown() |
| 95 | + |
| 96 | + entityName := testModule + ".TestEntityEventHandler" |
| 97 | + mfName := testModule + ".ACT_ValidateTestEntity" |
| 98 | + |
| 99 | + // Create a microflow first (event handler references it) |
| 100 | + if err := env.executeMDL(`CREATE OR MODIFY MICROFLOW ` + mfName + ` () |
| 101 | +BEGIN |
| 102 | + LOG INFO 'validating'; |
| 103 | +END;`); err != nil { |
| 104 | + t.Fatalf("failed to create microflow: %v", err) |
| 105 | + } |
| 106 | + |
| 107 | + // Create entity with event handler |
| 108 | + createMDL := `CREATE OR MODIFY PERSISTENT ENTITY ` + entityName + ` ( |
| 109 | + Name: String(100) |
| 110 | + ) |
| 111 | + ON BEFORE COMMIT CALL ` + mfName + ` RAISE ERROR;` |
| 112 | + |
| 113 | + // Verify roundtrip preserves the event handler |
| 114 | + env.assertContains(createMDL, []string{ |
| 115 | + "PERSISTENT ENTITY", |
| 116 | + "Name:", |
| 117 | + "String(100)", |
| 118 | + "ON BEFORE COMMIT CALL", |
| 119 | + mfName, |
| 120 | + "RAISE ERROR", |
| 121 | + }) |
| 122 | +} |
| 123 | + |
| 124 | +func TestRoundtripEntity_AlterAddDropEventHandler(t *testing.T) { |
| 125 | + env := setupTestEnv(t) |
| 126 | + defer env.teardown() |
| 127 | + |
| 128 | + entityName := testModule + ".TestAlterEventHandler" |
| 129 | + mfName := testModule + ".ACT_AlterEventTest" |
| 130 | + |
| 131 | + // Create microflow |
| 132 | + if err := env.executeMDL(`CREATE OR MODIFY MICROFLOW ` + mfName + ` () |
| 133 | +BEGIN |
| 134 | + LOG INFO 'test'; |
| 135 | +END;`); err != nil { |
| 136 | + t.Fatalf("failed to create microflow: %v", err) |
| 137 | + } |
| 138 | + |
| 139 | + // Create entity without handlers |
| 140 | + if err := env.executeMDL(`CREATE OR MODIFY PERSISTENT ENTITY ` + entityName + ` ( |
| 141 | + Code: String(50) |
| 142 | + );`); err != nil { |
| 143 | + t.Fatalf("failed to create entity: %v", err) |
| 144 | + } |
| 145 | + |
| 146 | + // Add event handler via ALTER |
| 147 | + if err := env.executeMDL(`ALTER ENTITY ` + entityName + ` |
| 148 | + ADD EVENT HANDLER ON AFTER CREATE CALL ` + mfName + `;`); err != nil { |
| 149 | + t.Fatalf("failed to add event handler: %v", err) |
| 150 | + } |
| 151 | + |
| 152 | + // Verify handler appears in DESCRIBE |
| 153 | + out, err := env.describeMDL(`DESCRIBE ENTITY ` + entityName + `;`) |
| 154 | + if err != nil { |
| 155 | + t.Fatalf("describe failed: %v", err) |
| 156 | + } |
| 157 | + if !strings.Contains(out, "ON AFTER CREATE CALL") { |
| 158 | + t.Errorf("expected ON AFTER CREATE CALL in DESCRIBE output, got:\n%s", out) |
| 159 | + } |
| 160 | + if !strings.Contains(out, mfName) { |
| 161 | + t.Errorf("expected microflow name %q in DESCRIBE output, got:\n%s", mfName, out) |
| 162 | + } |
| 163 | + |
| 164 | + // Drop the event handler |
| 165 | + if err := env.executeMDL(`ALTER ENTITY ` + entityName + ` |
| 166 | + DROP EVENT HANDLER ON AFTER CREATE;`); err != nil { |
| 167 | + t.Fatalf("failed to drop event handler: %v", err) |
| 168 | + } |
| 169 | + |
| 170 | + // Verify handler is gone |
| 171 | + out, err = env.describeMDL(`DESCRIBE ENTITY ` + entityName + `;`) |
| 172 | + if err != nil { |
| 173 | + t.Fatalf("describe after drop failed: %v", err) |
| 174 | + } |
| 175 | + if strings.Contains(out, "ON AFTER CREATE CALL") { |
| 176 | + t.Errorf("event handler should be removed but still in DESCRIBE output:\n%s", out) |
| 177 | + } |
| 178 | +} |
| 179 | + |
91 | 180 | func TestRoundtripEnumeration(t *testing.T) { |
92 | 181 | env := setupTestEnv(t) |
93 | 182 | defer env.teardown() |
|
0 commit comments