diff --git a/src/index.js b/src/index.js index bf05dadcb..9a4137740 100644 --- a/src/index.js +++ b/src/index.js @@ -6,6 +6,7 @@ export { getQueryParameters, ensureDefinedConfig, parseURL, + getPath, } from './utils'; export { APP_TOPIC, diff --git a/src/initialize.js b/src/initialize.js index 7073c57a0..08c985731 100644 --- a/src/initialize.js +++ b/src/initialize.js @@ -54,7 +54,7 @@ Note that the env.config.js file in frontend-platform's root directory is NOT us initialization code, it's just there for the test suite and example application. */ import envConfig from 'env.config'; // eslint-disable-line import/no-unresolved - +import { getPath } from './utils'; import { publish, } from './pubSub'; @@ -99,7 +99,7 @@ import configureCache from './auth/LocalForageCache'; */ export const history = (typeof window !== 'undefined') ? createBrowserHistory({ - basename: getConfig().PUBLIC_PATH, + basename: getPath(getConfig().PUBLIC_PATH), }) : createMemoryHistory(); /** diff --git a/src/initialize.test.js b/src/initialize.test.js index b15458001..5276f705e 100644 --- a/src/initialize.test.js +++ b/src/initialize.test.js @@ -1,4 +1,5 @@ import PubSub from 'pubsub-js'; +import { createBrowserHistory } from 'history'; import { APP_PUBSUB_INITIALIZED, APP_CONFIG_INITIALIZED, @@ -37,6 +38,7 @@ jest.mock('./auth'); jest.mock('./analytics'); jest.mock('./i18n'); jest.mock('./auth/LocalForageCache'); +jest.mock('history'); let config = null; const newConfig = { @@ -351,3 +353,12 @@ describe('initialize', () => { expect(logError).not.toHaveBeenCalled(); }); }); + +describe('history', () => { + it('browser history called by default path', async () => { + // import history from initialize; + expect(createBrowserHistory).toHaveBeenCalledWith({ + basename: '/', + }); + }); +}); diff --git a/src/utils.js b/src/utils.js index 8a1c65ff2..091a46fb0 100644 --- a/src/utils.js +++ b/src/utils.js @@ -143,6 +143,17 @@ export function parseURL(url) { return parser; } +/** + * Given a string URL return the path of the URL + * + * + * @param {string} + * @returns {string} + */ +export function getPath(url) { + return parseURL(url).pathname; +} + /** * *Deprecated*: A method which converts the supplied query string into an object of * key-value pairs and returns it. Defaults to the current query string - should perform like diff --git a/src/utils.test.js b/src/utils.test.js index 3b9e77f57..cd5e6eac3 100644 --- a/src/utils.test.js +++ b/src/utils.test.js @@ -4,6 +4,7 @@ import { snakeCaseObject, convertKeyNames, parseURL, + getPath, getQueryParameters, } from '.'; @@ -152,3 +153,41 @@ describe('ParseURL', () => { expect(parsedURL.host).toEqual('example.com:3000'); }); }); + +describe('getPath', () => { + it('Path is retrieved with full url', () => { + const testURL = 'http://example.com:3000/pathname/?search=test#hash'; + + expect(getPath(testURL)).toEqual('/pathname/'); + }); + + it('Path is retrieved with only path', () => { + const testURL = '/learning/'; + + expect(getPath(testURL)).toEqual('/learning/'); + }); + + it('Path is retrieved without protocol', () => { + const testURL = '//example.com:3000/accounts/'; + + expect(getPath(testURL)).toEqual('/accounts/'); + }); + + it('Path is retrieved with base `/`', () => { + const testURL = '/'; + + expect(getPath(testURL)).toEqual('/'); + }); + + it('Path is retrieved without port', () => { + const testURL = 'https://example.com/accounts/'; + + expect(getPath(testURL)).toEqual('/accounts/'); + }); + + it('Path is retrieved without CDN shape', () => { + const testURL = 'https://d20blt6w1kfasr.cloudfront.net/learning/'; + + expect(getPath(testURL)).toEqual('/learning/'); + }); +});