Skip to content

Commit 532b90d

Browse files
committed
Make schema file loaded callback success-only
1 parent 16758f2 commit 532b90d

2 files changed

Lines changed: 45 additions & 5 deletions

File tree

packages/core-ui/js/gui_components/shared/schema-definition/shared-schema-definition-controller.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,13 @@ class SharedSchemaDefinitionController {
214214
this.clearSchemaError();
215215
const schemaText = await fileTransferService.readSchemaTextFile(file);
216216
const result = this.loadSchemaText(schemaText, { showErrors: true, preferRowMode: true });
217-
this.callbacks.onSchemaFileLoaded?.({
218-
fileName: file.name || '',
219-
schemaText,
220-
result,
221-
});
217+
if (result?.applied !== false) {
218+
this.callbacks.onSchemaFileLoaded?.({
219+
fileName: file.name || '',
220+
schemaText,
221+
result,
222+
});
223+
}
222224
return result;
223225
} catch (error) {
224226
const message = `Unable to load schema file: ${error?.message || String(error)}`;

packages/core-ui/src/tests/shared/shared-schema-definition-controller.test.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,14 @@ describe('SharedSchemaDefinitionController', () => {
157157
const schemaFileTransferService = {
158158
readSchemaTextFile: jest.fn(async () => 'Loaded Name\nliteral(Ada)'),
159159
};
160+
const onSchemaFileLoaded = jest.fn();
160161
const controller = new SharedSchemaDefinitionController({
161162
services: {
162163
schemaFileTransferService,
163164
},
165+
callbacks: {
166+
onSchemaFileLoaded,
167+
},
164168
});
165169
controller.schemaEditor = {
166170
loadSchemaText: jest.fn(() => ({ rows: [{ name: 'Loaded Name' }], errors: [], applied: true })),
@@ -179,6 +183,40 @@ describe('SharedSchemaDefinitionController', () => {
179183
errors: [],
180184
applied: true,
181185
});
186+
expect(onSchemaFileLoaded).toHaveBeenCalledWith({
187+
fileName: 'schema.txt',
188+
schemaText: 'Loaded Name\nliteral(Ada)',
189+
result: {
190+
rows: [{ name: 'Loaded Name' }],
191+
errors: [],
192+
applied: true,
193+
},
194+
});
195+
});
196+
197+
test('loadSchemaFromFile does not emit onSchemaFileLoaded when schema parsing fails', async () => {
198+
const schemaFileTransferService = {
199+
readSchemaTextFile: jest.fn(async () => 'Broken Name'),
200+
};
201+
const onSchemaFileLoaded = jest.fn();
202+
const controller = new SharedSchemaDefinitionController({
203+
services: {
204+
schemaFileTransferService,
205+
},
206+
callbacks: {
207+
onSchemaFileLoaded,
208+
},
209+
});
210+
controller.schemaEditor = {
211+
loadSchemaText: jest.fn(() => ({ rows: [], errors: [new Error('Missing value')], applied: false })),
212+
getState: jest.fn(() => ({ rows: [{ name: 'Existing Name' }], tokens: [], isTextMode: false })),
213+
};
214+
215+
const result = await controller.loadSchemaFromFile({ name: 'broken-schema.txt' });
216+
217+
expect(result.applied).toBe(false);
218+
expect(result.errors).toHaveLength(1);
219+
expect(onSchemaFileLoaded).not.toHaveBeenCalled();
182220
});
183221

184222
test('loadSchemaFromFile surfaces wrapped file read failures with a useful message', async () => {

0 commit comments

Comments
 (0)