forked from elastic/kibana
-
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.
Prevent flicker on Getting Started page (elastic#11826)
* Consolide chrome visibility toggle code into single module * Extracting code into helper functions for better readability * Removing redundant setting * Extracting functions to higher level in scope so they are not defined multiple times * Fixing typo in comment * Starting to add unit tests * Actually adding the tests this time * Adding unit tests for handleGettingStartedOptedOutScenario function * Binding this to window to prevent Uncaught TypeError: Illegal invocation * Adding unit tests for handleExistingIndexPatternsScenario function * Add helper function to aid unit testing * Refactor unit tests * Inlining function to prevent naming awkwardness * Binding this to window to remove ambiguity * Adding missing import * Fixing import * Catching expected error
- Loading branch information
1 parent
66c6db0
commit c4b3ade
Showing
5 changed files
with
280 additions
and
79 deletions.
There are no files selected for viewing
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
179 changes: 179 additions & 0 deletions
179
src/core_plugins/getting_started/public/lib/__tests__/add_setup_work.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,179 @@ | ||
import expect from 'expect.js'; | ||
import sinon from 'sinon'; | ||
import { set } from 'lodash'; | ||
import uiChrome from 'ui/chrome'; | ||
import { Notifier } from 'ui/notify/notifier'; | ||
import { WAIT_FOR_URL_CHANGE_TOKEN } from 'ui/routes'; | ||
import { gettingStartedGateCheck } from '../add_setup_work'; | ||
import { | ||
GETTING_STARTED_ROUTE, | ||
CREATE_INDEX_PATTERN_ROUTE | ||
} from '../constants'; | ||
import { | ||
hasOptedOutOfGettingStarted, | ||
undoOptOutOfGettingStarted | ||
} from 'ui/getting_started/opt_out_helpers'; | ||
|
||
describe('Getting Started page', () => { | ||
describe('add_setup_work', () => { | ||
describe('gettingStartedGateCheck', () => { | ||
|
||
let getIds; | ||
let kbnUrl; | ||
let config; | ||
let $route; | ||
|
||
beforeEach(() => { | ||
kbnUrl = { | ||
change: sinon.spy() | ||
}; | ||
$route = {}; | ||
set($route, 'current.$$route', {}); | ||
}); | ||
|
||
describe('if index patterns exist', () => { | ||
beforeEach(() => { | ||
config = { | ||
get: sinon.stub(), | ||
set: sinon.spy() | ||
}; | ||
getIds = sinon.stub() | ||
.returns(Promise.resolve([ 'logstash-*', 'cars' ])); | ||
}); | ||
|
||
it('sets the chrome to visible', async () => { | ||
await gettingStartedGateCheck(getIds, kbnUrl, config, $route); | ||
expect(uiChrome.getVisible()).to.be(true); | ||
}); | ||
|
||
it('opts the user out of the Getting Started page', async () => { | ||
await gettingStartedGateCheck(getIds, kbnUrl, config, $route); | ||
expect(hasOptedOutOfGettingStarted()).to.be(true); | ||
}); | ||
|
||
describe('if the current route does not require a default index pattern', () => { | ||
beforeEach(() => { | ||
$route.current.$$route.requireDefaultIndex = false; | ||
}); | ||
|
||
it('returns without performing any default index pattern checks', async () => { | ||
await gettingStartedGateCheck(getIds, kbnUrl, config, $route); | ||
expect(config.get.called).to.be(false); | ||
expect(config.set.called).to.be(false); | ||
}); | ||
}); | ||
|
||
describe('if the current route requires a default index pattern', () => { | ||
beforeEach(() => { | ||
set($route, 'current.$$route.requireDefaultIndex', true); | ||
}); | ||
|
||
describe('if a default index pattern exists', () => { | ||
beforeEach(() => { | ||
config.get | ||
.withArgs('defaultIndex') | ||
.returns('an-index-pattern'); | ||
}); | ||
|
||
it('returns without setting a default index pattern', async () => { | ||
await gettingStartedGateCheck(getIds, kbnUrl, config, $route); | ||
expect(config.set.called).to.be(false); | ||
}); | ||
}); | ||
|
||
describe('if a default index pattern does not exist', () => { | ||
beforeEach(() => { | ||
config.get | ||
.withArgs('defaultIndex') | ||
.returns(undefined); | ||
}); | ||
|
||
it('sets the first index pattern as the default index pattern', async () => { | ||
await gettingStartedGateCheck(getIds, kbnUrl, config, $route); | ||
expect(config.set.calledWith('defaultIndex', 'logstash-*')).to.be(true); | ||
}); | ||
}); | ||
}); | ||
}); | ||
|
||
describe('if no index patterns exist', () => { | ||
beforeEach(() => { | ||
getIds = sinon.stub() | ||
.returns(Promise.resolve([])); | ||
}); | ||
|
||
describe('if user has opted out of the Getting Started page', () => { | ||
it('sets the chrome to visible', async () => { | ||
await gettingStartedGateCheck(getIds, kbnUrl, config, $route); | ||
expect(uiChrome.getVisible()).to.be(true); | ||
}); | ||
|
||
describe('if the current route does not require a default index pattern', () => { | ||
beforeEach(() => { | ||
$route.current.$$route.requireDefaultIndex = false; | ||
}); | ||
|
||
it('returns without redirecting the user', async () => { | ||
await gettingStartedGateCheck(getIds, kbnUrl, config, $route); | ||
expect(kbnUrl.change.called).to.be(false); | ||
}); | ||
}); | ||
|
||
describe('if the current route requires a default index pattern', () => { | ||
beforeEach(() => { | ||
$route.current.$$route.requireDefaultIndex = true; | ||
}); | ||
|
||
afterEach(() => { | ||
// Clear out any notifications | ||
Notifier.prototype._notifs.length = 0; | ||
}); | ||
|
||
it('redirects the user to the Create Index Pattern page', async () => { | ||
try { | ||
await gettingStartedGateCheck(getIds, kbnUrl, config, $route); | ||
} catch (e) { | ||
expect(e).to.be(WAIT_FOR_URL_CHANGE_TOKEN); | ||
} | ||
expect(kbnUrl.change.calledWith(CREATE_INDEX_PATTERN_ROUTE)).to.be(true); | ||
}); | ||
}); | ||
}); | ||
|
||
describe('if the user has not opted out of the Getting Started page', () => { | ||
beforeEach(() => { | ||
undoOptOutOfGettingStarted(); | ||
getIds = sinon.stub() | ||
.returns(Promise.resolve([])); | ||
}); | ||
|
||
describe('if the user is not already on Getting Started page', () => { | ||
beforeEach(() => { | ||
$route.current.$$route.originalPath = 'discover'; | ||
}); | ||
|
||
it('redirects the user to the Getting Started page', async () => { | ||
try { | ||
await gettingStartedGateCheck(getIds, kbnUrl, config, $route); | ||
} catch (e) { | ||
expect(e).to.be(WAIT_FOR_URL_CHANGE_TOKEN); | ||
} | ||
expect(kbnUrl.change.calledWith(GETTING_STARTED_ROUTE)).to.be(true); | ||
}); | ||
}); | ||
|
||
describe('if the user is already on Getting Started page', () => { | ||
beforeEach(() => { | ||
$route.current.$$route.originalPath = GETTING_STARTED_ROUTE; | ||
}); | ||
|
||
it('redirects the user to the Getting Started page', async () => { | ||
await gettingStartedGateCheck(getIds, kbnUrl, config, $route); | ||
expect(kbnUrl.change.called).to.be(false); | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); |
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
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 |
---|---|---|
@@ -1,11 +1,16 @@ | ||
import uiChrome from 'ui/chrome'; | ||
import { GETTING_STARTED_OPT_OUT_FLAG } from './constants'; | ||
|
||
export function hasOptedOutOfGettingStarted() { | ||
return window.localStorage.getItem(GETTING_STARTED_OPT_OUT_FLAG) || false; | ||
return Boolean(window.localStorage.getItem(GETTING_STARTED_OPT_OUT_FLAG)); | ||
} | ||
|
||
export function optOutOfGettingStarted() { | ||
window.localStorage.setItem(GETTING_STARTED_OPT_OUT_FLAG, true); | ||
uiChrome.setVisible(true); | ||
} | ||
|
||
/** | ||
* This function is intended for unit testing | ||
*/ | ||
export function undoOptOutOfGettingStarted() { | ||
window.localStorage.removeItem(GETTING_STARTED_OPT_OUT_FLAG); | ||
} |
Oops, something went wrong.