@finos/legend-application-studio 28.21.2 → 28.21.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/lib/components/editor/editor-group/data-editor/RelationElementsDataEditor.d.ts.map +1 -1
  2. package/lib/components/editor/editor-group/data-editor/RelationElementsDataEditor.js +63 -20
  3. package/lib/components/editor/editor-group/data-editor/RelationElementsDataEditor.js.map +1 -1
  4. package/lib/components/editor/editor-group/dataProduct/DataProductEditor.d.ts.map +1 -1
  5. package/lib/components/editor/editor-group/dataProduct/DataProductEditor.js +9 -1
  6. package/lib/components/editor/editor-group/dataProduct/DataProductEditor.js.map +1 -1
  7. package/lib/components/editor/editor-group/dataProduct/testable/DataProductTestableEditor.d.ts +23 -0
  8. package/lib/components/editor/editor-group/dataProduct/testable/DataProductTestableEditor.d.ts.map +1 -0
  9. package/lib/components/editor/editor-group/dataProduct/testable/DataProductTestableEditor.js +230 -0
  10. package/lib/components/editor/editor-group/dataProduct/testable/DataProductTestableEditor.js.map +1 -0
  11. package/lib/components/editor/editor-group/testable/TestableSharedComponents.d.ts.map +1 -1
  12. package/lib/components/editor/editor-group/testable/TestableSharedComponents.js +39 -5
  13. package/lib/components/editor/editor-group/testable/TestableSharedComponents.js.map +1 -1
  14. package/lib/index.css +2 -2
  15. package/lib/index.css.map +1 -1
  16. package/lib/package.json +1 -1
  17. package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.d.ts +16 -1
  18. package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.d.ts.map +1 -1
  19. package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.js +36 -1
  20. package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.js.map +1 -1
  21. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.d.ts +4 -1
  22. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.d.ts.map +1 -1
  23. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.js +4 -0
  24. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.js.map +1 -1
  25. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/testable/DataProductTestableState.d.ts +118 -0
  26. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/testable/DataProductTestableState.d.ts.map +1 -0
  27. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/testable/DataProductTestableState.js +600 -0
  28. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/testable/DataProductTestableState.js.map +1 -0
  29. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.d.ts +17 -1
  30. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.d.ts.map +1 -1
  31. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.js +46 -1
  32. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.js.map +1 -1
  33. package/package.json +9 -9
  34. package/src/components/editor/editor-group/data-editor/RelationElementsDataEditor.tsx +135 -49
  35. package/src/components/editor/editor-group/dataProduct/DataProductEditor.tsx +14 -0
  36. package/src/components/editor/editor-group/dataProduct/testable/DataProductTestableEditor.tsx +872 -0
  37. package/src/components/editor/editor-group/testable/TestableSharedComponents.tsx +169 -15
  38. package/src/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.ts +54 -1
  39. package/src/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.ts +4 -0
  40. package/src/stores/editor/editor-state/element-editor-state/dataProduct/testable/DataProductTestableState.ts +863 -0
  41. package/src/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.ts +66 -0
  42. package/tsconfig.json +2 -0
@@ -0,0 +1,600 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { DataProduct, FunctionAccessPoint, LakehouseAccessPoint, DataProductTestSuite, BaseDataResolver, DataProductAccessPointTest, RelationElementsData, RelationElement, PackageableElementExplicitReference, TestExecuted, TestError, TestExecutionStatus, EqualToRelation, observe_RelationElement, observe_RelationElementsData, observe_DataProductTestSuite, IngestDefinition, getAccessorItemLabelForElement, } from '@finos/legend-graph';
17
+ import { ActionState, assertErrorThrown, deleteEntry, addUniqueEntry, uuid, noop, } from '@finos/legend-shared';
18
+ import { action, flow, flowResult, makeObservable, observable, runInAction, } from 'mobx';
19
+ import { RelationElementState } from '../../data/EmbeddedDataState.js';
20
+ import { TESTABLE_RESULT } from '../../../../sidebar-state/testable/GlobalTestRunnerState.js';
21
+ import { testSuite_addTest } from '../../../../../graph-modifier/Testable_GraphModifierHelper.js';
22
+ import { TestableTestEditorState, TestableTestSuiteEditorState, } from '../../testable/TestableEditorState.js';
23
+ const createEmptyRelationElement = (itemId, columns = []) => {
24
+ const relationElement = new RelationElement();
25
+ relationElement.paths = [itemId];
26
+ relationElement.columns = columns;
27
+ relationElement.rows = [];
28
+ return observe_RelationElement(relationElement);
29
+ };
30
+ /**
31
+ * Returns the lambda for an access point (handles both LakehouseAccessPoint
32
+ * and FunctionAccessPoint).
33
+ */
34
+ const getAccessPointLambda = (accessPoint) => accessPoint instanceof LakehouseAccessPoint
35
+ ? accessPoint.func
36
+ : accessPoint instanceof FunctionAccessPoint
37
+ ? accessPoint.query
38
+ : undefined;
39
+ /**
40
+ * Builds a RelationElementsData from resolved accessors using the accessor
41
+ * relation type as the source of truth for column definitions.
42
+ */
43
+ const buildRelationElementsDataWithColumns = (accs) => {
44
+ const relData = new RelationElementsData();
45
+ relData.relationElements = accs.map((acc) => {
46
+ const itemId = acc.accessor || 'UNKNOWN';
47
+ const columns = acc.relationType.columns.map((column) => column.name);
48
+ return createEmptyRelationElement(itemId, columns);
49
+ });
50
+ return relData;
51
+ };
52
+ const isIngestOrDataProductAccessor = (accessor) => accessor.parentElement instanceof DataProduct ||
53
+ accessor.parentElement instanceof IngestDefinition;
54
+ const getAccessPointDisplayLabel = (accessPoint) => accessPoint.id;
55
+ const getElementDataItems = (element) => {
56
+ if (element instanceof DataProduct) {
57
+ return element.accessPointGroups
58
+ .flatMap((g) => g.accessPoints)
59
+ .map((ap) => ({
60
+ id: ap.id,
61
+ label: getAccessPointDisplayLabel(ap),
62
+ }));
63
+ }
64
+ if (element instanceof IngestDefinition) {
65
+ return (element.TEMPORARY_MATVIEW_FUNCTION_DATA_SETS ?? []).map((ds) => ({
66
+ id: ds.name,
67
+ label: ds.name,
68
+ }));
69
+ }
70
+ return [];
71
+ };
72
+ const inferDataProductItemColumns = async (editorStore, dataProduct, itemId) => {
73
+ const accessPoint = dataProduct.accessPointGroups
74
+ .flatMap((group) => group.accessPoints)
75
+ .find((ap) => ap.id === itemId);
76
+ if (!accessPoint) {
77
+ return undefined;
78
+ }
79
+ const lambda = getAccessPointLambda(accessPoint);
80
+ if (!lambda) {
81
+ return undefined;
82
+ }
83
+ const relationMetadata = await editorStore.graphManagerState.graphManager.getLambdaRelationType(lambda, editorStore.graphManagerState.graph);
84
+ return relationMetadata.columns.map((column) => column.name);
85
+ };
86
+ // ─── Per-test state ──────────────────────────────────────────────────────────
87
+ export class DataProductTestState extends TestableTestEditorState {
88
+ suiteState;
89
+ test;
90
+ uuid = uuid();
91
+ /** Wraps assertion.expected — drives both column definitions and test data rows. */
92
+ testDataRelationState;
93
+ constructor(suiteState, test) {
94
+ super(suiteState.testableState.dataProduct, test, suiteState.testableState.dataProductEditorState.isReadOnly, suiteState.editorStore);
95
+ makeObservable(this, {
96
+ // observable fields from base class
97
+ selectedAsertionState: observable,
98
+ selectedTab: observable,
99
+ assertionToRename: observable,
100
+ assertionEditorStates: observable,
101
+ testResultState: observable,
102
+ runningTestAction: observable,
103
+ // own observable
104
+ testDataRelationState: observable,
105
+ // actions from base class
106
+ setSelectedTab: action,
107
+ setAssertionToRename: action,
108
+ addAssertion: action,
109
+ deleteAssertion: action,
110
+ openAssertion: action,
111
+ resetResult: action,
112
+ handleTestResult: action,
113
+ // flow from base class
114
+ runTest: flow,
115
+ });
116
+ this.suiteState = suiteState;
117
+ this.test = test;
118
+ this.buildTestDataRelationState().catch(noop());
119
+ }
120
+ async buildTestDataRelationState() {
121
+ const assertion = this.test.assertions.find((a) => a instanceof EqualToRelation);
122
+ if (!assertion) {
123
+ return;
124
+ }
125
+ // Populate columns from the engine if not yet set
126
+ if (assertion.expected.columns.length === 0) {
127
+ try {
128
+ const engineColumns = await inferDataProductItemColumns(this.editorStore, this.suiteState.testableState.dataProduct, this.test.accessPointId);
129
+ if (engineColumns && engineColumns.length > 0) {
130
+ runInAction(() => {
131
+ assertion.expected.columns = engineColumns;
132
+ });
133
+ }
134
+ }
135
+ catch {
136
+ // best-effort; continue with empty columns
137
+ }
138
+ }
139
+ runInAction(() => {
140
+ this.testDataRelationState = new RelationElementState(assertion.expected);
141
+ });
142
+ }
143
+ get accessPointLabel() {
144
+ return this.suiteState.testableState.getOwnAccessPointLabel(this.test.accessPointId);
145
+ }
146
+ }
147
+ // ─── Per-element test data state ─────────────────────────────────────────────
148
+ export class DataProductElementTestDataState {
149
+ testDataState;
150
+ testData;
151
+ editorStore;
152
+ /** Currently selected dataset/item within this element's RelationElementsData */
153
+ selectedItemId;
154
+ /** RelationElementState for the currently selected item */
155
+ relationElementState;
156
+ constructor(testDataState, testData) {
157
+ makeObservable(this, {
158
+ selectedItemId: observable,
159
+ relationElementState: observable,
160
+ setSelectedItem: action,
161
+ });
162
+ this.testDataState = testDataState;
163
+ this.testData = testData;
164
+ this.editorStore = testDataState.editorStore;
165
+ // Select the first item that has data
166
+ if (testData.data instanceof RelationElementsData) {
167
+ const firstRel = testData.data.relationElements[0];
168
+ if (firstRel) {
169
+ this.selectedItemId = firstRel.paths[0];
170
+ this.relationElementState = new RelationElementState(firstRel);
171
+ }
172
+ }
173
+ }
174
+ get element() {
175
+ return this.testData.element.value;
176
+ }
177
+ get elementName() {
178
+ return this.testData.element.value.name;
179
+ }
180
+ get itemLabel() {
181
+ return getAccessorItemLabelForElement(this.element);
182
+ }
183
+ get configuredItemIds() {
184
+ if (this.testData.data instanceof RelationElementsData) {
185
+ return this.testData.data.relationElements.map((re) => re.paths[0] ?? '');
186
+ }
187
+ return [];
188
+ }
189
+ get configuredItems() {
190
+ const availableItemsById = new Map(getElementDataItems(this.element).map((item) => [item.id, item.label]));
191
+ return this.configuredItemIds.map((id) => ({
192
+ id,
193
+ label: availableItemsById.get(id) ?? id,
194
+ }));
195
+ }
196
+ setSelectedItem(itemId) {
197
+ this.selectedItemId = itemId;
198
+ if (itemId && this.testData.data instanceof RelationElementsData) {
199
+ const relEl = this.testData.data.relationElements.find((re) => re.paths[0] === itemId);
200
+ this.relationElementState = relEl
201
+ ? new RelationElementState(relEl)
202
+ : undefined;
203
+ }
204
+ else {
205
+ this.relationElementState = undefined;
206
+ }
207
+ }
208
+ }
209
+ // ─── Test data state for a suite ─────────────────────────────────────────────
210
+ export class DataProductTestDataState {
211
+ editorStore;
212
+ suiteState;
213
+ elementTestDataStates = [];
214
+ selectedElementTestDataState;
215
+ constructor(suiteState, options) {
216
+ makeObservable(this, {
217
+ elementTestDataStates: observable,
218
+ selectedElementTestDataState: observable,
219
+ setSelectedElementTestDataState: action,
220
+ refreshElementTestDataStates: action,
221
+ });
222
+ this.editorStore = suiteState.editorStore;
223
+ this.suiteState = suiteState;
224
+ this.refreshElementTestDataStates(options);
225
+ }
226
+ refreshElementTestDataStates(options) {
227
+ const previouslySelectedElementPath = options?.selectedElementPath ??
228
+ this.selectedElementTestDataState?.element.path;
229
+ const previouslySelectedItemId = options?.selectedItemId ??
230
+ this.selectedElementTestDataState?.selectedItemId;
231
+ const suite = this.suiteState.suite;
232
+ this.elementTestDataStates = (suite.testData ?? [])
233
+ .filter((td) => td instanceof BaseDataResolver)
234
+ .map((td) => new DataProductElementTestDataState(this, td));
235
+ this.selectedElementTestDataState =
236
+ this.elementTestDataStates.find((state) => state.element.path === previouslySelectedElementPath) ?? this.elementTestDataStates[0];
237
+ if (this.selectedElementTestDataState && previouslySelectedItemId) {
238
+ const nextSelectedItemId = this.selectedElementTestDataState.configuredItemIds.find((itemId) => itemId === previouslySelectedItemId) ?? this.selectedElementTestDataState.configuredItemIds[0];
239
+ this.selectedElementTestDataState.setSelectedItem(nextSelectedItemId);
240
+ }
241
+ }
242
+ setSelectedElementTestDataState(val) {
243
+ this.selectedElementTestDataState = val;
244
+ }
245
+ }
246
+ // ─── Per-suite state ─────────────────────────────────────────────────────────
247
+ export class DataProductTestSuiteState extends TestableTestSuiteEditorState {
248
+ testableState;
249
+ suite;
250
+ testStates = [];
251
+ testDataState;
252
+ constructor(editorStore, testableState, suite) {
253
+ super(testableState.dataProduct, suite, testableState.dataProductEditorState.isReadOnly, editorStore);
254
+ makeObservable(this, {
255
+ testStates: observable,
256
+ selectTestState: observable,
257
+ testDataState: observable,
258
+ addNewTest: flow,
259
+ deleteTest: action,
260
+ runSuite: flow,
261
+ runFailingTests: flow,
262
+ buildTestStates: action,
263
+ });
264
+ this.testableState = testableState;
265
+ this.suite = suite;
266
+ this.testDataState = new DataProductTestDataState(this);
267
+ this.buildTestStates();
268
+ }
269
+ refreshTestDataState() {
270
+ this.testDataState = new DataProductTestDataState(this, {
271
+ selectedElementPath: this.testDataState.selectedElementTestDataState?.element.path,
272
+ selectedItemId: this.testDataState.selectedElementTestDataState?.selectedItemId,
273
+ });
274
+ }
275
+ buildTestStates() {
276
+ this.testStates = this.suite.tests.map((t) => new DataProductTestState(this, t));
277
+ this.selectTestState = this.testStates[0];
278
+ }
279
+ deleteTest(test) {
280
+ super.deleteTest(test);
281
+ }
282
+ *addNewTest(testName, accessPointId) {
283
+ const observerContext = this.editorStore.changeDetectionState.observerContext;
284
+ let inferredColumns = [];
285
+ try {
286
+ const cols = (yield inferDataProductItemColumns(this.editorStore, this.testableState.dataProduct, accessPointId));
287
+ if (cols) {
288
+ inferredColumns = cols;
289
+ }
290
+ }
291
+ catch {
292
+ // best-effort
293
+ }
294
+ const test = new DataProductAccessPointTest();
295
+ test.id = testName;
296
+ test.__parent = this.suite;
297
+ test.accessPointId = accessPointId;
298
+ // Resolve sources through the graph (follows function calls, no self-refs)
299
+ const accessPointForTest = this.testableState.dataProduct.accessPointGroups
300
+ .flatMap((g) => g.accessPoints)
301
+ .find((ap) => ap.id === accessPointId);
302
+ const rawLambdaForTest = accessPointForTest
303
+ ? getAccessPointLambda(accessPointForTest)
304
+ : undefined;
305
+ let resolvedAccessors = [];
306
+ if (rawLambdaForTest) {
307
+ const all = (yield this.editorStore.graphManagerState.graphManager.collectAccessorsInRawLambda(rawLambdaForTest, this.editorStore.graphManagerState.graph));
308
+ resolvedAccessors = all.filter((accessor) => isIngestOrDataProductAccessor(accessor) &&
309
+ accessor.parentElement.path !== this.testableState.dataProduct.path);
310
+ }
311
+ if (resolvedAccessors.length > 0) {
312
+ // Group by element, merge into existing resolvers or create new ones
313
+ const byElement = new Map();
314
+ for (const acc of resolvedAccessors) {
315
+ const grp = byElement.get(acc.parentElement.path) ?? [];
316
+ grp.push(acc);
317
+ byElement.set(acc.parentElement.path, grp);
318
+ }
319
+ for (const [elementPath, accs] of byElement) {
320
+ const element = this.editorStore.graphManagerState.graph.getNullableElement(elementPath);
321
+ if (!element) {
322
+ continue;
323
+ }
324
+ const existingResolver = this.suite.testData?.find((td) => td instanceof BaseDataResolver && td.element.value === element);
325
+ const relData = existingResolver?.data instanceof RelationElementsData
326
+ ? existingResolver.data
327
+ : undefined;
328
+ if (!existingResolver || !relData) {
329
+ const resolver = new BaseDataResolver();
330
+ resolver.element =
331
+ PackageableElementExplicitReference.create(element);
332
+ const newRelData = buildRelationElementsDataWithColumns(accs);
333
+ observe_RelationElementsData(newRelData);
334
+ resolver.data = newRelData;
335
+ this.suite.testData = [...(this.suite.testData ?? []), resolver];
336
+ }
337
+ else {
338
+ for (const acc of accs) {
339
+ const itemId = acc.accessor;
340
+ if (!relData.relationElements.find((re) => re.paths[0] === itemId)) {
341
+ const columns = acc.relationType.columns.map((column) => column.name);
342
+ relData.relationElements.push(createEmptyRelationElement(itemId, columns));
343
+ }
344
+ }
345
+ }
346
+ }
347
+ }
348
+ else {
349
+ // Fallback: single resolver on current DP
350
+ let relationData = this.suite.testData?.find((td) => td instanceof BaseDataResolver &&
351
+ td.element.value === this.testableState.dataProduct &&
352
+ td.data instanceof RelationElementsData)?.data;
353
+ if (!relationData) {
354
+ const testData = new BaseDataResolver();
355
+ testData.element = PackageableElementExplicitReference.create(this.testableState.dataProduct);
356
+ relationData = new RelationElementsData();
357
+ relationData.relationElements = [];
358
+ observe_RelationElementsData(relationData);
359
+ testData.data = relationData;
360
+ this.suite.testData = [...(this.suite.testData ?? []), testData];
361
+ }
362
+ if (!relationData.relationElements.find((re) => re.paths[0] === accessPointId)) {
363
+ relationData.relationElements.push(createEmptyRelationElement(accessPointId, inferredColumns));
364
+ }
365
+ }
366
+ const assertion = new EqualToRelation();
367
+ assertion.id = 'assert_1';
368
+ const expectedRelElement = new RelationElement();
369
+ expectedRelElement.paths = [accessPointId];
370
+ expectedRelElement.columns = inferredColumns;
371
+ expectedRelElement.rows = [];
372
+ observe_RelationElement(expectedRelElement);
373
+ assertion.expected = expectedRelElement;
374
+ test.assertions = [assertion];
375
+ testSuite_addTest(this.suite, test, observerContext);
376
+ this.refreshTestDataState();
377
+ const testState = new DataProductTestState(this, test);
378
+ this.testStates.push(testState);
379
+ this.selectTestState = testState;
380
+ return undefined;
381
+ }
382
+ get result() {
383
+ if (this.runningSuiteState.isInProgress) {
384
+ return TESTABLE_RESULT.IN_PROGRESS;
385
+ }
386
+ if (this.testStates.length === 0) {
387
+ return TESTABLE_RESULT.DID_NOT_RUN;
388
+ }
389
+ if (this.testStates.every((ts) => ts.testResultState.result === undefined)) {
390
+ return TESTABLE_RESULT.DID_NOT_RUN;
391
+ }
392
+ let hasFailure = false;
393
+ let hasError = false;
394
+ for (const testState of this.testStates) {
395
+ const result = testState.testResultState.result;
396
+ if (result instanceof TestError) {
397
+ hasError = true;
398
+ }
399
+ else if (result instanceof TestExecuted &&
400
+ result.testExecutionStatus === TestExecutionStatus.FAIL) {
401
+ hasFailure = true;
402
+ }
403
+ }
404
+ if (hasError) {
405
+ return TESTABLE_RESULT.ERROR;
406
+ }
407
+ if (hasFailure) {
408
+ return TESTABLE_RESULT.FAILED;
409
+ }
410
+ return TESTABLE_RESULT.PASSED;
411
+ }
412
+ }
413
+ // ─── Top-level testable state ────────────────────────────────────────────────
414
+ export class DataProductTestableState {
415
+ editorStore;
416
+ dataProductEditorState;
417
+ suiteStates = [];
418
+ selectedSuiteState;
419
+ runningAllTestsState = ActionState.create();
420
+ showCreateSuiteModal = false;
421
+ showCreateTestModal = false;
422
+ suiteToRename;
423
+ constructor(dataProductEditorState) {
424
+ makeObservable(this, {
425
+ suiteStates: observable,
426
+ selectedSuiteState: observable,
427
+ showCreateSuiteModal: observable,
428
+ showCreateTestModal: observable,
429
+ suiteToRename: observable,
430
+ setSelectedSuiteState: action,
431
+ setShowCreateSuiteModal: action,
432
+ setShowCreateTestModal: action,
433
+ setSuiteToRename: action,
434
+ changeSuite: action,
435
+ createSuite: flow,
436
+ deleteSuite: action,
437
+ init: action,
438
+ runAllTests: flow,
439
+ });
440
+ this.editorStore = dataProductEditorState.editorStore;
441
+ this.dataProductEditorState = dataProductEditorState;
442
+ }
443
+ get dataProduct() {
444
+ return this.dataProductEditorState.product;
445
+ }
446
+ setSelectedSuiteState(val) {
447
+ this.selectedSuiteState = val;
448
+ }
449
+ setShowCreateSuiteModal(val) {
450
+ this.showCreateSuiteModal = val;
451
+ }
452
+ setShowCreateTestModal(val) {
453
+ this.showCreateTestModal = val;
454
+ }
455
+ setSuiteToRename(val) {
456
+ this.suiteToRename = val;
457
+ }
458
+ changeSuite(suite) {
459
+ const suiteState = this.suiteStates.find((s) => s.suite === suite);
460
+ if (suiteState) {
461
+ this.selectedSuiteState = suiteState;
462
+ }
463
+ }
464
+ /**
465
+ * Build suite states from the DataProduct.tests array.
466
+ * Call this on init and after grammar→form roundtrip.
467
+ */
468
+ init() {
469
+ const dp = this.dataProduct;
470
+ this.suiteStates = dp.tests.map((s) => new DataProductTestSuiteState(this.editorStore, this, s));
471
+ this.selectedSuiteState = this.suiteStates[0];
472
+ }
473
+ /** Returns all graph ingest elements available in the model. */
474
+ get availableIngestSources() {
475
+ const graph = this.editorStore.graphManagerState.graph;
476
+ return graph.ingests;
477
+ }
478
+ /** Access points on the DataProduct being edited (used for test's accessPointId). */
479
+ get ownAccessPoints() {
480
+ return this.dataProduct.accessPointGroups.flatMap((g) => g.accessPoints);
481
+ }
482
+ getOwnAccessPointLabel(accessPointId) {
483
+ const accessPoint = this.ownAccessPoints.find((candidate) => candidate.id === accessPointId);
484
+ return accessPoint
485
+ ? getAccessPointDisplayLabel(accessPoint)
486
+ : accessPointId;
487
+ }
488
+ /**
489
+ * Create a new test suite with one initial test on the DataProduct.
490
+ * Test data is auto-seeded for the selected access point on the current
491
+ * DataProduct (no element picker required).
492
+ * Columns are inferred via the engine when possible.
493
+ */
494
+ *createSuite(suiteName, testName, accessPointId) {
495
+ const dp = this.dataProduct;
496
+ const observerContext = this.editorStore.changeDetectionState.observerContext;
497
+ const suite = new DataProductTestSuite();
498
+ suite.id = suiteName;
499
+ // Try to infer columns from the access-point lambda
500
+ let inferredColumns = [];
501
+ try {
502
+ const cols = (yield inferDataProductItemColumns(this.editorStore, dp, accessPointId));
503
+ if (cols) {
504
+ inferredColumns = cols;
505
+ }
506
+ }
507
+ catch {
508
+ // Column inference is best-effort; continue with empty columns
509
+ }
510
+ // Resolve INPUT sources via the graph (follows function calls, avoids self-refs)
511
+ const accessPointForSuite = dp.accessPointGroups
512
+ .flatMap((g) => g.accessPoints)
513
+ .find((ap) => ap.id === accessPointId);
514
+ const rawLambdaForSuite = accessPointForSuite
515
+ ? getAccessPointLambda(accessPointForSuite)
516
+ : undefined;
517
+ suite.testData = [];
518
+ if (rawLambdaForSuite) {
519
+ const all = (yield this.editorStore.graphManagerState.graphManager.collectAccessorsInRawLambda(rawLambdaForSuite, this.editorStore.graphManagerState.graph));
520
+ const externalAccessors = all.filter((accessor) => isIngestOrDataProductAccessor(accessor) &&
521
+ accessor.parentElement.path !== dp.path);
522
+ const byElement = new Map();
523
+ for (const acc of externalAccessors) {
524
+ const grp = byElement.get(acc.parentElement.path) ?? [];
525
+ grp.push(acc);
526
+ byElement.set(acc.parentElement.path, grp);
527
+ }
528
+ for (const [elementPath, accs] of byElement) {
529
+ const element = this.editorStore.graphManagerState.graph.getNullableElement(elementPath);
530
+ if (!element) {
531
+ continue;
532
+ }
533
+ const resolver = new BaseDataResolver();
534
+ resolver.element = PackageableElementExplicitReference.create(element);
535
+ const relData = buildRelationElementsDataWithColumns(accs);
536
+ observe_RelationElementsData(relData);
537
+ resolver.data = relData;
538
+ suite.testData.push(resolver);
539
+ }
540
+ }
541
+ // Fallback: no external sources resolved — seed a single resolver on current DP
542
+ if (suite.testData.length === 0) {
543
+ const testData = new BaseDataResolver();
544
+ testData.element = PackageableElementExplicitReference.create(dp);
545
+ const relData = new RelationElementsData();
546
+ relData.relationElements = [
547
+ createEmptyRelationElement(accessPointId, inferredColumns),
548
+ ];
549
+ observe_RelationElementsData(relData);
550
+ testData.data = relData;
551
+ suite.testData = [testData];
552
+ }
553
+ // Create one initial test with EqualToRelation assertion
554
+ const test = new DataProductAccessPointTest();
555
+ test.id = testName;
556
+ test.__parent = suite;
557
+ test.accessPointId = accessPointId;
558
+ const assertion = new EqualToRelation();
559
+ assertion.id = 'assert_1';
560
+ const expectedRelElement = new RelationElement();
561
+ expectedRelElement.paths = [accessPointId];
562
+ expectedRelElement.columns = inferredColumns;
563
+ expectedRelElement.rows = [];
564
+ observe_RelationElement(expectedRelElement);
565
+ assertion.expected = expectedRelElement;
566
+ test.assertions = [assertion];
567
+ suite.tests = [test];
568
+ const observed = observe_DataProductTestSuite(suite, observerContext);
569
+ addUniqueEntry(dp.tests, observed);
570
+ const suiteState = new DataProductTestSuiteState(this.editorStore, this, observed);
571
+ this.suiteStates.push(suiteState);
572
+ this.selectedSuiteState = suiteState;
573
+ return undefined;
574
+ }
575
+ deleteSuite(suiteState) {
576
+ const dp = this.dataProduct;
577
+ deleteEntry(dp.tests, suiteState.suite);
578
+ deleteEntry(this.suiteStates, suiteState);
579
+ if (this.selectedSuiteState === suiteState) {
580
+ this.selectedSuiteState = this.suiteStates[0];
581
+ }
582
+ }
583
+ *runAllTests() {
584
+ try {
585
+ this.runningAllTestsState.inProgress();
586
+ for (const suiteState of this.suiteStates) {
587
+ if (suiteState.suite.tests.length > 0) {
588
+ yield flowResult(suiteState.runSuite());
589
+ }
590
+ }
591
+ this.runningAllTestsState.complete();
592
+ }
593
+ catch (error) {
594
+ assertErrorThrown(error);
595
+ this.editorStore.applicationStore.notificationService.notifyError(error);
596
+ this.runningAllTestsState.fail();
597
+ }
598
+ }
599
+ }
600
+ //# sourceMappingURL=DataProductTestableState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataProductTestableState.js","sourceRoot":"","sources":["../../../../../../../src/stores/editor/editor-state/element-editor-state/dataProduct/testable/DataProductTestableState.ts"],"names":[],"mappings":"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"}