login-public-links.spec.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. import {
  3. mockPublicLinks,
  4. mockPublicLinksSubscription,
  5. } from '@shared/entities/public-links/__tests__/mocks/mockPublicLinks'
  6. import type { PublicLinksQuery } from '@shared/graphql/types'
  7. import type { ConfidentTake } from '@shared/types/utils'
  8. import { getAllByRole } from '@testing-library/vue'
  9. import { visitView } from '@tests/support/components/visitView'
  10. import { waitUntilApisResolved } from '@tests/support/utils'
  11. describe('testing login public links', () => {
  12. it('always renders a single link to desktop app', async () => {
  13. const publicLinkQuery = mockPublicLinks([])
  14. mockPublicLinksSubscription()
  15. const view = await visitView('/login')
  16. await waitUntilApisResolved(publicLinkQuery)
  17. const link = view.getByText('Continue to desktop app')
  18. expect(link).toHaveAttribute('href', '/#login')
  19. expect(link).not.toHaveAttribute('target', '_blank')
  20. })
  21. it('renders all public links correctly', async () => {
  22. const publicLinks: ConfidentTake<PublicLinksQuery, 'publicLinks'> = [
  23. {
  24. __typename: 'PublicLink',
  25. id: '1',
  26. link: 'https://localhost/link-1',
  27. description: 'some-description',
  28. title: 'Link 1',
  29. newTab: false,
  30. },
  31. {
  32. __typename: 'PublicLink',
  33. id: '2',
  34. link: 'https://localhost/link-2',
  35. title: 'Link 2',
  36. description: null,
  37. newTab: true,
  38. },
  39. ]
  40. const publicLinkQuery = mockPublicLinks(publicLinks)
  41. mockPublicLinksSubscription()
  42. const view = await visitView('/login')
  43. await waitUntilApisResolved(publicLinkQuery)
  44. const navigation = view.getByRole('navigation')
  45. const links = getAllByRole(navigation, 'link')
  46. expect(links).toHaveLength(publicLinks.length)
  47. expect(links[0]).toHaveAttribute('href', publicLinks[0].link)
  48. expect(links[0]).toHaveAttribute('title', publicLinks[0].description)
  49. expect(links[0]).toHaveTextContent(publicLinks[0].title)
  50. expect(links[0]).not.toHaveAttribute('target', '_blank')
  51. expect(links[1]).toHaveAttribute('href', publicLinks[1].link)
  52. expect(links[1]).toHaveTextContent(publicLinks[1].title)
  53. expect(links[1]).toHaveAttribute('target', '_blank')
  54. })
  55. it('rerenders links, when subscription is triggered', async () => {
  56. const publicLinkQuery = mockPublicLinks([])
  57. const subcription = mockPublicLinksSubscription()
  58. const view = await visitView('/login')
  59. await waitUntilApisResolved(publicLinkQuery)
  60. expect(view.queryByRole('navigation')).not.toBeInTheDocument()
  61. await subcription.next({
  62. data: {
  63. publicLinkUpdates: {
  64. __typename: 'PublicLinkUpdatesPayload',
  65. publicLinks: [
  66. {
  67. __typename: 'PublicLink',
  68. id: '1',
  69. link: 'https://localhost/link-1',
  70. description: 'some-description',
  71. title: 'Link 1',
  72. newTab: false,
  73. },
  74. ],
  75. },
  76. },
  77. })
  78. const navigation = view.getByRole('navigation')
  79. const links = getAllByRole(navigation, 'link')
  80. expect(links).toHaveLength(1)
  81. expect(links[0]).toHaveAttribute('href', 'https://localhost/link-1')
  82. })
  83. it('always renders a powered by link', async () => {
  84. const publicLinkQuery = mockPublicLinks([])
  85. mockPublicLinksSubscription()
  86. const view = await visitView('/login')
  87. await waitUntilApisResolved(publicLinkQuery)
  88. const link = view.getByText('Zammad')
  89. expect(link).toHaveAttribute('href', 'https://zammad.org')
  90. expect(link).toHaveAttribute('target', '_blank')
  91. const text = link.previousElementSibling
  92. expect(text).toHaveTextContent('Powered by')
  93. })
  94. it('does not render a footer logo by default', async () => {
  95. const publicLinkQuery = mockPublicLinks([])
  96. mockPublicLinksSubscription()
  97. const view = await visitView('/login')
  98. await waitUntilApisResolved(publicLinkQuery)
  99. expect(view.queryByAltText('Logo')).not.toBeInTheDocument()
  100. })
  101. })