From 12684e8242d91a96e08aafc9d600202d5d2fc635 Mon Sep 17 00:00:00 2001 From: Johan Castiblanco Date: Mon, 25 Sep 2023 21:04:36 -0500 Subject: [PATCH] feat: add `getPath` function for `PUBLIC_PATH` This add function to get path from a string url from utils. Also the function is implemented to the history module. In order to match with URLS as webpack allow.(CDN). Test were developed for different shaped of string urls with path. A basic test is also added for the base case in the history variable for the initialize with base case of PUBLIC_PATH=`/`. --- src/index.js | 1 + src/initialize.js | 4 ++-- src/initialize.test.js | 11 +++++++++++ src/utils.js | 11 +++++++++++ src/utils.test.js | 39 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 2 deletions(-) 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/'); + }); +});