manipulator.spec.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import Manipulator from '../../../src/dom/manipulator'
  2. /** Test helpers */
  3. import { getFixture, clearFixture } from '../../helpers/fixture'
  4. describe('Manipulator', () => {
  5. let fixtureEl
  6. beforeAll(() => {
  7. fixtureEl = getFixture()
  8. })
  9. afterEach(() => {
  10. clearFixture()
  11. })
  12. describe('setDataAttribute', () => {
  13. it('should set data attribute prefixed with bs', () => {
  14. fixtureEl.innerHTML = '<div></div>'
  15. const div = fixtureEl.querySelector('div')
  16. Manipulator.setDataAttribute(div, 'key', 'value')
  17. expect(div.getAttribute('data-bs-key')).toEqual('value')
  18. })
  19. it('should set data attribute in kebab case', () => {
  20. fixtureEl.innerHTML = '<div></div>'
  21. const div = fixtureEl.querySelector('div')
  22. Manipulator.setDataAttribute(div, 'testKey', 'value')
  23. expect(div.getAttribute('data-bs-test-key')).toEqual('value')
  24. })
  25. })
  26. describe('removeDataAttribute', () => {
  27. it('should only remove bs-prefixed data attribute', () => {
  28. fixtureEl.innerHTML = '<div data-bs-key="value" data-key-bs="postfixed" data-key="value"></div>'
  29. const div = fixtureEl.querySelector('div')
  30. Manipulator.removeDataAttribute(div, 'key')
  31. expect(div.getAttribute('data-bs-key')).toBeNull()
  32. expect(div.getAttribute('data-key-bs')).toEqual('postfixed')
  33. expect(div.getAttribute('data-key')).toEqual('value')
  34. })
  35. it('should remove data attribute in kebab case', () => {
  36. fixtureEl.innerHTML = '<div data-bs-test-key="value"></div>'
  37. const div = fixtureEl.querySelector('div')
  38. Manipulator.removeDataAttribute(div, 'testKey')
  39. expect(div.getAttribute('data-bs-test-key')).toBeNull()
  40. })
  41. })
  42. describe('getDataAttributes', () => {
  43. it('should return an empty object for null', () => {
  44. expect(Manipulator.getDataAttributes(null)).toEqual({})
  45. expect().nothing()
  46. })
  47. it('should get only bs-prefixed data attributes without bs namespace', () => {
  48. 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>'
  49. const div = fixtureEl.querySelector('div')
  50. expect(Manipulator.getDataAttributes(div)).toEqual({
  51. toggle: 'tabs',
  52. target: '#element'
  53. })
  54. })
  55. })
  56. describe('getDataAttribute', () => {
  57. it('should only get bs-prefixed data attribute', () => {
  58. fixtureEl.innerHTML = '<div data-bs-key="value" data-test-bs="postFixed" data-toggle="tab"></div>'
  59. const div = fixtureEl.querySelector('div')
  60. expect(Manipulator.getDataAttribute(div, 'key')).toEqual('value')
  61. expect(Manipulator.getDataAttribute(div, 'test')).toBeNull()
  62. expect(Manipulator.getDataAttribute(div, 'toggle')).toBeNull()
  63. })
  64. it('should get data attribute in kebab case', () => {
  65. fixtureEl.innerHTML = '<div data-bs-test-key="value" ></div>'
  66. const div = fixtureEl.querySelector('div')
  67. expect(Manipulator.getDataAttribute(div, 'testKey')).toEqual('value')
  68. })
  69. it('should normalize data', () => {
  70. fixtureEl.innerHTML = '<div data-bs-test="false" ></div>'
  71. const div = fixtureEl.querySelector('div')
  72. expect(Manipulator.getDataAttribute(div, 'test')).toEqual(false)
  73. div.setAttribute('data-bs-test', 'true')
  74. expect(Manipulator.getDataAttribute(div, 'test')).toEqual(true)
  75. div.setAttribute('data-bs-test', '1')
  76. expect(Manipulator.getDataAttribute(div, 'test')).toEqual(1)
  77. })
  78. })
  79. describe('offset', () => {
  80. it('should return an object with two properties top and left, both numbers', () => {
  81. fixtureEl.innerHTML = '<div></div>'
  82. const div = fixtureEl.querySelector('div')
  83. const offset = Manipulator.offset(div)
  84. expect(offset).toBeDefined()
  85. expect(offset.top).toEqual(jasmine.any(Number))
  86. expect(offset.left).toEqual(jasmine.any(Number))
  87. })
  88. })
  89. describe('position', () => {
  90. it('should return an object with two properties top and left, both numbers', () => {
  91. fixtureEl.innerHTML = '<div></div>'
  92. const div = fixtureEl.querySelector('div')
  93. const position = Manipulator.position(div)
  94. expect(position).toBeDefined()
  95. expect(position.top).toEqual(jasmine.any(Number))
  96. expect(position.left).toEqual(jasmine.any(Number))
  97. })
  98. })
  99. })