From 13138c05c4a09b6db79117d6e55628cfee1e09fd Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Wed, 27 May 2020 14:56:45 +0200 Subject: [PATCH] Fix "Could not locate that index-pattern" recreate link is not working (#67280) added a functional test, because we've recently fixed this link and it regressed again --- .../index_patterns/index_pattern.ts | 2 +- .../dashboard/dashboard_error_handling.ts | 60 ++++++++++++++++++ test/functional/apps/dashboard/index.js | 1 + .../dashboard/current/kibana/data.json.gz | Bin 16094 -> 16643 bytes test/functional/services/common/browser.ts | 14 ++++ 5 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 test/functional/apps/dashboard/dashboard_error_handling.ts diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts index 417d8227b121c6..43404c32cb3d4f 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts @@ -174,7 +174,7 @@ export class IndexPattern implements IIndexPattern { private updateFromElasticSearch(response: any, forceFieldRefresh: boolean = false) { if (!response.found) { - throw new SavedObjectNotFound(type, this.id, '#/management/kibana/indexPatterns'); + throw new SavedObjectNotFound(type, this.id, 'kibana#/management/kibana/indexPatterns'); } _.forOwn(this.mapping, (fieldMapping: FieldMappingSpec, name: string | undefined) => { diff --git a/test/functional/apps/dashboard/dashboard_error_handling.ts b/test/functional/apps/dashboard/dashboard_error_handling.ts new file mode 100644 index 00000000000000..6bd8327a110b9f --- /dev/null +++ b/test/functional/apps/dashboard/dashboard_error_handling.ts @@ -0,0 +1,60 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const PageObjects = getPageObjects(['dashboard', 'header', 'common']); + const browser = getService('browser'); + const testSubjects = getService('testSubjects'); + + /** + * Common test suite for testing exception scenarious within dashboard + */ + describe('dashboard error handling', () => { + before(async () => { + await esArchiver.loadIfNeeded('dashboard/current/kibana'); + await PageObjects.common.navigateToApp('dashboard'); + }); + + // wrapping into own describe to make sure new tab is cleaned up even if test failed + // see: https://github.com/elastic/kibana/pull/67280#discussion_r430528122 + describe('recreate index pattern link works', () => { + let tabsCount = 1; + it('recreate index pattern link works', async () => { + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.loadSavedDashboard('dashboard with missing index pattern'); + await PageObjects.header.waitUntilLoadingHasFinished(); + const errorEmbeddable = await testSubjects.find('embeddableStackError'); + await (await errorEmbeddable.findByTagName('a')).click(); + await browser.switchTab(1); + tabsCount++; + await testSubjects.existOrFail('createIndexPatternButton'); + }); + + after(async () => { + if (tabsCount > 1) { + await browser.closeCurrentWindow(); + await browser.switchTab(0); + } + }); + }); + }); +} diff --git a/test/functional/apps/dashboard/index.js b/test/functional/apps/dashboard/index.js index 9ae1a2afddcc6c..a8d0e03c9421e8 100644 --- a/test/functional/apps/dashboard/index.js +++ b/test/functional/apps/dashboard/index.js @@ -57,6 +57,7 @@ export default function ({ getService, loadTestFile }) { loadTestFile(require.resolve('./data_shared_attributes')); loadTestFile(require.resolve('./embed_mode')); loadTestFile(require.resolve('./dashboard_back_button')); + loadTestFile(require.resolve('./dashboard_error_handling')); // Note: This one must be last because it unloads some data for one of its tests! // No, this isn't ideal, but loading/unloading takes so much time and these are all bunched diff --git a/test/functional/fixtures/es_archiver/dashboard/current/kibana/data.json.gz b/test/functional/fixtures/es_archiver/dashboard/current/kibana/data.json.gz index 767d27fb325df94e1951a008cd1c23b136f8cfc4..e83e34a2e07fab31fd8be22de647fdcd646dba12 100644 GIT binary patch delta 15975 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 Mti5}g93Vjd2kk*aM*si- delta 15420 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 hK0-AhJr_r(L5O-&BmI>AGQ*cIYO}E{PDTi@{{} + */ + public async switchTab(tabIndex: number) { + const tabs = await driver.getAllWindowHandles(); + if (tabs.length <= tabIndex) { + throw new Error(`Out of existing tabs bounds`); + } + await driver.switchTo().window(tabs[tabIndex]); + } + /** * Sets a value in local storage for the focused window/frame. *