manipulator.spec.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import Manipulator from '../../../src/dom/manipulator.js'
  2. import { clearFixture, getFixture } from '../../helpers/fixture.js'
  3. describe('Manipulator', () => {
  4. let fixtureEl
  5. beforeAll(() => {
  6. fixtureEl = getFixture()
  7. })
  8. afterEach(() => {
  9. clearFixture()
  10. })
  11. describe('setDataAttribute', () => {
  12. it('should set data attribute prefixed with bs', () => {
  13. fixtureEl.innerHTML = '<div></div>'
  14. const div = fixtureEl.querySelector('div')
  15. Manipulator.setDataAttribute(div, 'key', 'value')
  16. expect(div.getAttribute('data-bs-key')).toEqual('value')
  17. })
  18. it('should set data attribute in kebab case', () => {
  19. fixtureEl.innerHTML = '<div></div>'
  20. const div = fixtureEl.querySelector('div')
  21. Manipulator.setDataAttribute(div, 'testKey', 'value')
  22. expect(div.getAttribute('data-bs-test-key')).toEqual('value')
  23. })
  24. })
  25. describe('removeDataAttribute', () => {
  26. it('should only remove bs-prefixed data attribute', () => {
  27. fixtureEl.innerHTML = '<div data-bs-key="value" data-key-bs="postfixed" data-key="value"></div>'
  28. const div = fixtureEl.querySelector('div')
  29. Manipulator.removeDataAttribute(div, 'key')
  30. expect(div.getAttribute('data-bs-key')).toBeNull()
  31. expect(div.getAttribute('data-key-bs')).toEqual('postfixed')
  32. expect(div.getAttribute('data-key')).toEqual('value')
  33. })
  34. it('should remove data attribute in kebab case', () => {
  35. fixtureEl.innerHTML = '<div data-bs-test-key="value"></div>'
  36. const div = fixtureEl.querySelector('div')
  37. Manipulator.removeDataAttribute(div, 'testKey')
  38. expect(div.getAttribute('data-bs-test-key')).toBeNull()
  39. })
  40. })
  41. describe('getDataAttributes', () => {
  42. it('should return an empty object for null', () => {
  43. expect(Manipulator.getDataAttributes(null)).toEqual({})
  44. expect().nothing()
  45. })
  46. it('should get only bs-prefixed data attributes without bs namespace', () => {
  47. fixtureEl.innerHTML = '<div data-bs-toggle="tabs" data-bs-target="#element" data-another="value" data-target-bs="#element" data-in-bs-out="in-between"></div>'
  48. const div = fixtureEl.querySelector('div')
  49. expect(Manipulator.getDataAttributes(div)).toEqual({
  50. toggle: 'tabs',
  51. target: '#element'
  52. })
  53. })
  54. it('should omit `bs-config` data attribute', () => {
  55. fixtureEl.innerHTML = '<div data-bs-toggle="tabs" data-bs-target="#element" data-bs-config=\'{"testBool":false}\'></div>'
  56. const div = fixtureEl.querySelector('div')
  57. expect(Manipulator.getDataAttributes(div)).toEqual({
  58. toggle: 'tabs',
  59. target: '#element'
  60. })
  61. })
  62. })
  63. describe('getDataAttribute', () => {
  64. it('should only get bs-prefixed data attribute', () => {
  65. fixtureEl.innerHTML = '<div data-bs-key="value" data-test-bs="postFixed" data-toggle="tab"></div>'
  66. const div = fixtureEl.querySelector('div')
  67. expect(Manipulator.getDataAttribute(div, 'key')).toEqual('value')
  68. expect(Manipulator.getDataAttribute(div, 'test')).toBeNull()
  69. expect(Manipulator.getDataAttribute(div, 'toggle')).toBeNull()
  70. })
  71. it('should get data attribute in kebab case', () => {
  72. fixtureEl.innerHTML = '<div data-bs-test-key="value" ></div>'
  73. const div = fixtureEl.querySelector('div')
  74. expect(Manipulator.getDataAttribute(div, 'testKey')).toEqual('value')
  75. })
  76. it('should normalize data', () => {
  77. fixtureEl.innerHTML = '<div data-bs-test="false" ></div>'
  78. const div = fixtureEl.querySelector('div')
  79. expect(Manipulator.getDataAttribute(div, 'test')).toBeFalse()
  80. div.setAttribute('data-bs-test', 'true')
  81. expect(Manipulator.getDataAttribute(div, 'test')).toBeTrue()
  82. div.setAttribute('data-bs-test', '1')
  83. expect(Manipulator.getDataAttribute(div, 'test')).toEqual(1)
  84. })
  85. it('should normalize json data', () => {
  86. fixtureEl.innerHTML = '<div data-bs-test=\'{"delay":{"show":100,"hide":10}}\'></div>'
  87. const div = fixtureEl.querySelector('div')
  88. expect(Manipulator.getDataAttribute(div, 'test')).toEqual({ delay: { show: 100, hide: 10 } })
  89. const objectData = { 'Super Hero': ['Iron Man', 'Super Man'], testNum: 90, url: 'http://localhost:8080/test?foo=bar' }
  90. const dataStr = JSON.stringify(objectData)
  91. div.setAttribute('data-bs-test', encodeURIComponent(dataStr))
  92. expect(Manipulator.getDataAttribute(div, 'test')).toEqual(objectData)
  93. div.setAttribute('data-bs-test', dataStr)
  94. expect(Manipulator.getDataAttribute(div, 'test')).toEqual(objectData)
  95. })
  96. })
  97. })