useHtmlLinks.spec.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. import { createTestingPinia } from '@pinia/testing'
  3. import { describe, expect, vi } from 'vitest'
  4. import { useHtmlLinks } from '../useHtmlLinks.ts'
  5. const buildSampleElement = () => {
  6. const elem = document.createElement('div')
  7. elem.innerHTML = `some text
  8. <a href="http://example.com/asd" external>external</a>
  9. <a href="/desktop/test" internal>internal</a>
  10. <a href="/desktop/blank" blank target=_blank>blank</a>
  11. <a data-mention-user-id="123" mention>mention</a>
  12. her text`
  13. return elem
  14. }
  15. const routerPush = vi.fn()
  16. vi.mock('vue-router', async () => {
  17. return {
  18. useRouter: () => {
  19. return {
  20. push: routerPush,
  21. }
  22. },
  23. }
  24. })
  25. describe('setupLinkHandlers', () => {
  26. createTestingPinia({ createSpy: vi.fn })
  27. it('replaces mention links with URLs to user profile', async () => {
  28. const elem = buildSampleElement()
  29. const { setupLinksHandlers } = useHtmlLinks('/desktop')
  30. setupLinksHandlers(elem)
  31. elem.querySelector<HTMLLinkElement>('a[mention]')?.click()
  32. expect(routerPush).toHaveBeenCalledWith('/users/123')
  33. })
  34. it('opens internal link via the router', () => {
  35. const elem = buildSampleElement()
  36. const { setupLinksHandlers } = useHtmlLinks('/desktop')
  37. setupLinksHandlers(elem)
  38. elem.querySelector<HTMLLinkElement>('a[internal]')?.click()
  39. expect(routerPush).toHaveBeenCalledWith('/test')
  40. })
  41. it('opens internal _blank link in a new tab', () => {
  42. vi.stubGlobal('open', vi.fn())
  43. const spy = vi.spyOn(window, 'open')
  44. const elem = buildSampleElement()
  45. const { setupLinksHandlers } = useHtmlLinks('/desktop')
  46. setupLinksHandlers(elem)
  47. elem.querySelector<HTMLLinkElement>('a[blank]')?.click()
  48. expect(spy).toHaveBeenCalledWith('/desktop/blank', '_blank')
  49. })
  50. it('opens external link directly', () => {
  51. vi.stubGlobal('open', vi.fn())
  52. const spy = vi.spyOn(window, 'open')
  53. const elem = buildSampleElement()
  54. const { setupLinksHandlers } = useHtmlLinks('/desktop')
  55. setupLinksHandlers(elem)
  56. elem.querySelector<HTMLLinkElement>('a[external]')?.click()
  57. expect(routerPush).not.toHaveBeenCalled()
  58. expect(spy).not.toHaveBeenCalled()
  59. })
  60. })