From b5a0d4b03dc1e52eb13fc2386942d0f897b7e494 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Thu, 14 Nov 2019 13:08:50 +0100 Subject: [PATCH] Add test for implicitly fixed #45150 (#50284) #45150 appeared in 7.3 and disappeared in 7.4 --- .../functional/apps/discover/_shared_links.js | 132 +++++++++++++----- test/functional/services/browser.ts | 9 ++ 2 files changed, 105 insertions(+), 36 deletions(-) diff --git a/test/functional/apps/discover/_shared_links.js b/test/functional/apps/discover/_shared_links.js index f0d34207a87a..0b2b4f14f126 100644 --- a/test/functional/apps/discover/_shared_links.js +++ b/test/functional/apps/discover/_shared_links.js @@ -25,11 +25,12 @@ export default function ({ getService, getPageObjects }) { const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); const PageObjects = getPageObjects(['common', 'discover', 'share', 'timePicker']); + const browser = getService('browser'); describe('shared links', function describeIndexTests() { let baseUrl; - before(async function () { + async function setup({ storeStateInSessionStorage }) { baseUrl = PageObjects.common.getHostPort(); log.debug('baseUrl = ' + baseUrl); // browsers don't show the ':port' if it's 80 or 443 so we have to @@ -47,9 +48,12 @@ export default function ({ getService, getPageObjects }) { log.debug('load kibana index with default index pattern'); await esArchiver.load('discover'); - await esArchiver.loadIfNeeded('logstash_functional'); + await kibanaServer.uiSettings.replace({ + 'state:storeInSessionStorage': storeStateInSessionStorage + }); + log.debug('discover'); await PageObjects.common.navigateToApp('discover'); @@ -60,47 +64,103 @@ export default function ({ getService, getPageObjects }) { await PageObjects.common.sleep(1000); await PageObjects.share.clickShareTopNavButton(); - }); - describe('permalink', function () { - it('should allow for copying the snapshot URL', async function () { - const expectedUrl = - baseUrl + - '/app/kibana?_t=1453775307251#' + - '/discover?_g=(refreshInterval:(pause:!t,value:0),time' + - ':(from:\'2015-09-19T06:31:44.000Z\',to:\'2015-09' + - '-23T18:31:44.000Z\'))&_a=(columns:!(_source),index:\'logstash-' + - '*\',interval:auto,query:(language:kuery,query:\'\')' + - ',sort:!(!(\'@timestamp\',desc)))'; - const actualUrl = await PageObjects.share.getSharedUrl(); - // strip the timestamp out of each URL - expect(actualUrl.replace(/_t=\d{13}/, '_t=TIMESTAMP')).to.be( - expectedUrl.replace(/_t=\d{13}/, '_t=TIMESTAMP') - ); + return async () => { + await kibanaServer.uiSettings.replace({ + 'state:storeInSessionStorage': undefined + }); + }; + } + + describe('shared links with state in query', async () => { + let teardown; + before(async function () { + teardown = await setup({ storeStateInSessionStorage: false }); }); - it('should allow for copying the snapshot URL as a short URL', async function () { - const re = new RegExp(baseUrl + '/goto/[0-9a-f]{32}$'); - await PageObjects.share.checkShortenUrl(); - await retry.try(async () => { + after(async function () { + await teardown(); + }); + + describe('permalink', function () { + it('should allow for copying the snapshot URL', async function () { + const expectedUrl = + baseUrl + + '/app/kibana?_t=1453775307251#' + + '/discover?_g=(refreshInterval:(pause:!t,value:0),time' + + ':(from:\'2015-09-19T06:31:44.000Z\',to:\'2015-09' + + '-23T18:31:44.000Z\'))&_a=(columns:!(_source),index:\'logstash-' + + '*\',interval:auto,query:(language:kuery,query:\'\')' + + ',sort:!(!(\'@timestamp\',desc)))'; const actualUrl = await PageObjects.share.getSharedUrl(); - expect(actualUrl).to.match(re); + // strip the timestamp out of each URL + expect(actualUrl.replace(/_t=\d{13}/, '_t=TIMESTAMP')).to.be( + expectedUrl.replace(/_t=\d{13}/, '_t=TIMESTAMP') + ); + }); + + it('should allow for copying the snapshot URL as a short URL', async function () { + const re = new RegExp(baseUrl + '/goto/[0-9a-f]{32}$'); + await PageObjects.share.checkShortenUrl(); + await retry.try(async () => { + const actualUrl = await PageObjects.share.getSharedUrl(); + expect(actualUrl).to.match(re); + }); + }); + + it('should allow for copying the saved object URL', async function () { + const expectedUrl = + baseUrl + + '/app/kibana#' + + '/discover/ab12e3c0-f231-11e6-9486-733b1ac9221a' + + '?_g=(refreshInterval%3A(pause%3A!t%2Cvalue%3A0)' + + '%2Ctime%3A(from%3A\'2015-09-19T06%3A31%3A44.000Z\'%2C' + + 'to%3A\'2015-09-23T18%3A31%3A44.000Z\'))'; + await PageObjects.discover.loadSavedSearch('A Saved Search'); + await PageObjects.share.clickShareTopNavButton(); + await PageObjects.share.exportAsSavedObject(); + const actualUrl = await PageObjects.share.getSharedUrl(); + expect(actualUrl).to.be(expectedUrl); }); }); + }); - it('should allow for copying the saved object URL', async function () { - const expectedUrl = - baseUrl + - '/app/kibana#' + - '/discover/ab12e3c0-f231-11e6-9486-733b1ac9221a' + - '?_g=(refreshInterval%3A(pause%3A!t%2Cvalue%3A0)' + - '%2Ctime%3A(from%3A\'2015-09-19T06%3A31%3A44.000Z\'%2C' + - 'to%3A\'2015-09-23T18%3A31%3A44.000Z\'))'; - await PageObjects.discover.loadSavedSearch('A Saved Search'); - await PageObjects.share.clickShareTopNavButton(); - await PageObjects.share.exportAsSavedObject(); - const actualUrl = await PageObjects.share.getSharedUrl(); - expect(actualUrl).to.be(expectedUrl); + describe('shared links with state in sessionStorage', async () => { + let teardown; + before(async function () { + teardown = await setup({ storeStateInSessionStorage: true }); + }); + + after(async function () { + await teardown(); + }); + + describe('permalink', function () { + it('should allow for copying the snapshot URL as a short URL and should open it', async function () { + const re = new RegExp(baseUrl + '/goto/[0-9a-f]{32}$'); + await PageObjects.share.checkShortenUrl(); + let actualUrl; + await retry.try(async () => { + actualUrl = await PageObjects.share.getSharedUrl(); + expect(actualUrl).to.match(re); + }); + + const actualTime = await PageObjects.timePicker.getTimeConfig(); + + await browser.clearSessionStorage(); + await browser.get(actualUrl, false); + await retry.waitFor( + 'shortUrl resolves and opens', + async () => { + const resolvedUrl = await browser.getCurrentUrl(); + expect(resolvedUrl).to.match(/discover/); + const resolvedTime = await PageObjects.timePicker.getTimeConfig(); + expect(resolvedTime.start).to.equal(actualTime.start); + expect(resolvedTime.end).to.equal(actualTime.end); + return true; + } + ); + }); }); }); }); diff --git a/test/functional/services/browser.ts b/test/functional/services/browser.ts index 97e02958f378..a8ce4270d420 100644 --- a/test/functional/services/browser.ts +++ b/test/functional/services/browser.ts @@ -429,6 +429,15 @@ export async function BrowserProvider({ getService }: FtrProviderContext) { ); } + /** + * Clears session storage for the focused window/frame. + * + * @return {Promise} + */ + public async clearSessionStorage(): Promise { + await driver.executeScript('return window.sessionStorage.clear();'); + } + /** * Closes the currently focused window. In most environments, after the window has been * closed, it is necessary to explicitly switch to whatever window is now focused.