-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Vis Augmenter / Feature Anywhere] Add test suite for vanilla OSD + h…
…elper fns for plugins (opensearch-project#725)
- Loading branch information
Showing
16 changed files
with
1,068 additions
and
19 deletions.
There are no files selected for viewing
27 changes: 27 additions & 0 deletions
27
cypress/fixtures/dashboard/opensearch_dashboards/vis-augmenter/sample-data-simple/data.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
[ | ||
{ | ||
"value1": 1, | ||
"value2": 10, | ||
"value3": 5 | ||
}, | ||
{ | ||
"value1": 5, | ||
"value2": 1, | ||
"value3": 3 | ||
}, | ||
{ | ||
"value1": 9, | ||
"value2": 6, | ||
"value3": 2 | ||
}, | ||
{ | ||
"value1": 2, | ||
"value2": 1, | ||
"value3": 1 | ||
}, | ||
{ | ||
"value1": 12, | ||
"value2": 5, | ||
"value3": 4 | ||
} | ||
] |
1 change: 1 addition & 0 deletions
1
...dashboard/opensearch_dashboards/vis-augmenter/sample-data-simple/index-pattern-fields.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[{"count":0,"name":"@timestamp","type":"date","esTypes":["date"],"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"count":0,"name":"_id","type":"string","esTypes":["_id"],"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"count":0,"name":"_index","type":"string","esTypes":["_index"],"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"count":0,"name":"_score","type":"number","scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"count":0,"name":"_source","type":"_source","esTypes":["_source"],"scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"count":0,"name":"_type","type":"string","scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"count":0,"name":"value1","type":"number","scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"count":0,"name":"value2","type":"number","scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"count":0,"name":"value3","type":"number","scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false}] |
1 change: 1 addition & 0 deletions
1
...tures/dashboard/opensearch_dashboards/vis-augmenter/sample-data-simple/index-settings.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
{"mappings":{"properties":{"value1":{"type":"integer"},"value2":{"type":"integer"},"value3":{"type":"integer"},"@timestamp":{"type":"date", "format":"epoch_millis"}}},"settings":{"index":{"number_of_shards":"1","number_of_replicas":"1"}}} |
129 changes: 129 additions & 0 deletions
129
...ion/core-opensearch-dashboards/opensearch-dashboards/apps/vis-augmenter/dashboard_spec.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
/* | ||
* Copyright OpenSearch Contributors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
import { | ||
INDEX_PATTERN_FILEPATH_SIMPLE, | ||
INDEX_SETTINGS_FILEPATH_SIMPLE, | ||
SAMPLE_DATA_FILEPATH_SIMPLE, | ||
} from '../../../../../utils/constants'; | ||
import { | ||
deleteVisAugmenterData, | ||
bootstrapDashboard, | ||
} from '../../../../../utils/dashboards/vis-augmenter/helpers'; | ||
|
||
describe('Vis augmenter - existing dashboards work as expected', () => { | ||
describe('dashboard with ineligible, eligible, and vega visualizations', () => { | ||
const indexName = 'vis-augmenter-sample-index'; | ||
const indexPatternName = 'vis-augmenter-sample-*'; | ||
const dashboardName = 'Vis Augmenter Dashboard'; | ||
const visualizationSpecs = [ | ||
{ | ||
name: 'count-agg-vis', | ||
type: 'line', | ||
indexPattern: indexPatternName, | ||
metrics: [], | ||
}, | ||
{ | ||
name: 'single-metric-vis', | ||
type: 'line', | ||
indexPattern: indexPatternName, | ||
metrics: [ | ||
{ | ||
aggregation: 'Average', | ||
field: 'value1', | ||
}, | ||
], | ||
}, | ||
{ | ||
name: 'multi-metric-vis', | ||
type: 'line', | ||
indexPattern: indexPatternName, | ||
metrics: [ | ||
{ | ||
aggregation: 'Average', | ||
field: 'value1', | ||
}, | ||
{ | ||
aggregation: 'Average', | ||
field: 'value2', | ||
}, | ||
{ | ||
aggregation: 'Max', | ||
field: 'value3', | ||
}, | ||
], | ||
}, | ||
{ | ||
name: 'area-vis', | ||
type: 'area', | ||
indexPattern: indexPatternName, | ||
metrics: [ | ||
{ | ||
aggregation: 'Max', | ||
field: 'value2', | ||
}, | ||
], | ||
}, | ||
{ | ||
name: 'vega-vis', | ||
type: 'vega', | ||
indexPattern: indexPatternName, | ||
metrics: [], | ||
}, | ||
]; | ||
|
||
const visualizationNames = visualizationSpecs.map( | ||
(visualizationSpec) => visualizationSpec.name | ||
); | ||
|
||
before(() => { | ||
// Create a dashboard and add some visualizations | ||
bootstrapDashboard( | ||
INDEX_SETTINGS_FILEPATH_SIMPLE, | ||
INDEX_PATTERN_FILEPATH_SIMPLE, | ||
SAMPLE_DATA_FILEPATH_SIMPLE, | ||
indexName, | ||
indexPatternName, | ||
dashboardName, | ||
visualizationSpecs | ||
); | ||
}); | ||
|
||
beforeEach(() => { | ||
cy.visitDashboard(dashboardName); | ||
}); | ||
|
||
after(() => { | ||
deleteVisAugmenterData( | ||
indexName, | ||
indexPatternName, | ||
visualizationNames, | ||
dashboardName | ||
); | ||
}); | ||
|
||
it('View events option does not exist for any visualization', () => { | ||
visualizationNames.forEach((visualizationName) => { | ||
cy.getVisPanelByTitle(visualizationName) | ||
.openVisContextMenu() | ||
.getMenuItems() | ||
.contains('View Events') | ||
.should('not.exist'); | ||
}); | ||
}); | ||
|
||
it('Validate non-vega visualizations are not rendered with vega under the hood', () => { | ||
visualizationSpecs.forEach((visualizationSpec) => { | ||
cy.getVisPanelByTitle(visualizationSpec.name).within(() => { | ||
if (visualizationSpec.type === 'vega') { | ||
cy.get('.vgaVis__view').should('exist'); | ||
} else { | ||
cy.get('.vgaVis__view').should('not.exist'); | ||
} | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
145 changes: 145 additions & 0 deletions
145
...tion/plugins/anomaly-detection-dashboards-plugin/vis_augmenter/associate_detector_spec.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
/* | ||
* Copyright OpenSearch Contributors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
import { | ||
deleteVisAugmenterData, | ||
bootstrapDashboard, | ||
openAddAnomalyDetectorFlyout, | ||
openAssociatedDetectorsFlyout, | ||
createDetectorFromVis, | ||
associateDetectorFromVis, | ||
unlinkDetectorFromVis, | ||
ensureDetectorIsLinked, | ||
ensureDetectorDetails, | ||
openDetectorDetailsPageFromFlyout, | ||
} from '../../../../utils/helpers'; | ||
import { | ||
INDEX_PATTERN_FILEPATH_SIMPLE, | ||
INDEX_SETTINGS_FILEPATH_SIMPLE, | ||
SAMPLE_DATA_FILEPATH_SIMPLE, | ||
} from '../../../../utils/constants'; | ||
|
||
describe('Anomaly detection integration with vis augmenter', () => { | ||
const indexName = 'ad-vis-augmenter-sample-index'; | ||
const indexPatternName = 'ad-vis-augmenter-sample-*'; | ||
const dashboardName = 'AD Vis Augmenter Dashboard'; | ||
const detectorName = 'ad-vis-augmenter-detector'; | ||
const visualizationName = 'single-metric-vis'; | ||
const visualizationSpec = { | ||
name: visualizationName, | ||
type: 'line', | ||
indexPattern: indexPatternName, | ||
metrics: [ | ||
{ | ||
aggregation: 'Average', | ||
field: 'value1', | ||
}, | ||
], | ||
}; | ||
|
||
before(() => { | ||
// Create a dashboard and add some visualizations | ||
cy.wait(5000); | ||
bootstrapDashboard( | ||
INDEX_SETTINGS_FILEPATH_SIMPLE, | ||
INDEX_PATTERN_FILEPATH_SIMPLE, | ||
SAMPLE_DATA_FILEPATH_SIMPLE, | ||
indexName, | ||
indexPatternName, | ||
dashboardName, | ||
[visualizationSpec] | ||
); | ||
}); | ||
|
||
after(() => { | ||
deleteVisAugmenterData( | ||
indexName, | ||
indexPatternName, | ||
[visualizationName], | ||
dashboardName | ||
); | ||
cy.deleteADSystemIndices(); | ||
}); | ||
|
||
beforeEach(() => {}); | ||
|
||
afterEach(() => {}); | ||
|
||
it('Shows empty state when no associated detectors', () => { | ||
openAssociatedDetectorsFlyout(dashboardName, visualizationName); | ||
cy.getElementByTestId('emptyAssociatedDetectorFlyoutMessage'); | ||
}); | ||
|
||
it('Create new detector from visualization', () => { | ||
openAddAnomalyDetectorFlyout(dashboardName, visualizationName); | ||
createDetectorFromVis(detectorName); | ||
|
||
ensureDetectorIsLinked(dashboardName, visualizationName, detectorName); | ||
|
||
// Since this detector is created based off of vis metrics, we assume here | ||
// the number of features will equal the number of metrics we have specified. | ||
ensureDetectorDetails(detectorName, visualizationSpec.metrics.length); | ||
|
||
unlinkDetectorFromVis(dashboardName, visualizationName, detectorName); | ||
}); | ||
|
||
it('Associate existing detector - creation flow', () => { | ||
openAddAnomalyDetectorFlyout(dashboardName, visualizationName); | ||
|
||
cy.get('.euiFlyout').find('.euiTitle').contains('Add anomaly detector'); | ||
// ensuring the flyout is defaulting to detector creation vs. association | ||
cy.getElementByTestId('adAnywhereCreateDetectorButton'); | ||
cy.get('[id="add-anomaly-detector__existing"]').click(); | ||
|
||
associateDetectorFromVis(detectorName); | ||
|
||
ensureDetectorIsLinked(dashboardName, visualizationName, detectorName); | ||
unlinkDetectorFromVis(dashboardName, visualizationName, detectorName); | ||
}); | ||
|
||
it('Associate existing detector - associated detectors flow', () => { | ||
openAssociatedDetectorsFlyout(dashboardName, visualizationName); | ||
cy.getElementByTestId('associateDetectorButton').click(); | ||
associateDetectorFromVis(detectorName); | ||
|
||
ensureDetectorIsLinked(dashboardName, visualizationName, detectorName); | ||
unlinkDetectorFromVis(dashboardName, visualizationName, detectorName); | ||
}); | ||
|
||
it('Deleting linked detector shows error once and removes from associated detectors list', () => { | ||
openAssociatedDetectorsFlyout(dashboardName, visualizationName); | ||
cy.getElementByTestId('associateDetectorButton').click(); | ||
associateDetectorFromVis(detectorName); | ||
ensureDetectorIsLinked(dashboardName, visualizationName, detectorName); | ||
openDetectorDetailsPageFromFlyout(); | ||
cy.getElementByTestId('configurationsTab').click(); | ||
cy.getElementByTestId('detectorNameHeader').within(() => { | ||
cy.contains(detectorName); | ||
}); | ||
|
||
cy.getElementByTestId('actionsButton').click(); | ||
cy.getElementByTestId('deleteDetectorItem').click(); | ||
cy.getElementByTestId('typeDeleteField').type('delete', { force: true }); | ||
cy.getElementByTestId('confirmButton').click(); | ||
cy.wait(5000); | ||
|
||
cy.visitDashboard(dashboardName); | ||
|
||
// Expect an error message to show up | ||
cy.getElementByTestId('errorToastMessage').parent().find('button').click(); | ||
cy.get('.euiModal'); | ||
cy.get('.euiModalFooter').find('button').click(); | ||
cy.wait(2000); | ||
|
||
// Expect associated detector list to be empty (the association should be removed) | ||
openAssociatedDetectorsFlyout(dashboardName, visualizationName); | ||
cy.getElementByTestId('emptyAssociatedDetectorFlyoutMessage'); | ||
cy.wait(2000); | ||
|
||
// Reload the dashboard - error toast shouldn't show anymore | ||
cy.visitDashboard(dashboardName); | ||
cy.getElementByTestId('errorToastMessage').should('not.exist'); | ||
}); | ||
}); |
Oops, something went wrong.