diff --git a/src/core/utils.js b/src/core/utils.js index 4a2845b7058..b64b29cf1cc 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -652,5 +652,5 @@ export const shallowEqualKeys = (a,b, keys) => { }) } -export const createDeepLinkPath = (str) => str ? str.replace(/\s/g, "_") : "" +export const createDeepLinkPath = (str) => typeof str == "string" || str instanceof String ? str.trim().replace(/\s/g, "_") : "" export const escapeDeepLinkPath = (str) => cssEscape( createDeepLinkPath(str) ) \ No newline at end of file diff --git a/test/core/utils.js b/test/core/utils.js index 55dfeace83f..c9921ef7192 100644 --- a/test/core/utils.js +++ b/test/core/utils.js @@ -1,7 +1,7 @@ /* eslint-env mocha */ import expect from "expect" import { fromJS } from "immutable" -import { mapToList, validateNumber, validateInteger, validateParam, validateFile, fromJSOrdered } from "core/utils" +import { mapToList, validateNumber, validateInteger, validateParam, validateFile, fromJSOrdered, createDeepLinkPath, escapeDeepLinkPath } from "core/utils" import win from "core/window" describe("utils", function() { @@ -581,5 +581,55 @@ describe("utils", function() { const result = fromJSOrdered(param).toJS() expect( result ).toEqual( [1, 1, 2, 3, 5, 8] ) }) + }) + + describe("createDeepLinkPath", function() { + it("creates a deep link path replacing spaces with underscores", function() { + const result = createDeepLinkPath("tag id with spaces") + expect(result).toEqual("tag_id_with_spaces") + }) + + it("trims input when creating a deep link path", function() { + let result = createDeepLinkPath(" spaces before and after ") + expect(result).toEqual("spaces_before_and_after") + + result = createDeepLinkPath(" ") + expect(result).toEqual("") }) + + it("creates a deep link path with special characters", function() { + const result = createDeepLinkPath("!@#$%^&*(){}[]") + expect(result).toEqual("!@#$%^&*(){}[]") + }) + + it("returns an empty string for invalid input", function() { + expect( createDeepLinkPath(null) ).toEqual("") + expect( createDeepLinkPath(undefined) ).toEqual("") + expect( createDeepLinkPath(1) ).toEqual("") + expect( createDeepLinkPath([]) ).toEqual("") + expect( createDeepLinkPath({}) ).toEqual("") + }) + }) + + describe("escapeDeepLinkPath", function() { + it("creates and escapes a deep link path", function() { + const result = escapeDeepLinkPath("tag id with spaces?") + expect(result).toEqual("tag_id_with_spaces\\?") + }) + + it("escapes a deep link path that starts with a number", function() { + const result = escapeDeepLinkPath("123") + expect(result).toEqual("\\31 23") + }) + + it("escapes a deep link path with a class selector", function() { + const result = escapeDeepLinkPath("hello.world") + expect(result).toEqual("hello\\.world") + }) + + it("escapes a deep link path with an id selector", function() { + const result = escapeDeepLinkPath("hello#world") + expect(result).toEqual("hello\\#world") + }) + }) })