personal-setting-overviews.spec.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. import { getAllByRole } from '@testing-library/vue'
  3. import { visitView } from '#tests/support/components/visitView.ts'
  4. import { mockPermissions } from '#tests/support/mock-permissions.ts'
  5. import { mockUserCurrent } from '#tests/support/mock-userCurrent.ts'
  6. import { waitForNextTick } from '#tests/support/utils.ts'
  7. import { convertToGraphQLId } from '#shared/graphql/utils.ts'
  8. import { getUserCurrentOverviewOrderingUpdatesSubscriptionHandler } from '#desktop/entities/ticket/graphql/subscriptions/userCurrentOverviewOrderingUpdates.mocks.ts'
  9. import { mockUserCurrentOverviewResetOrderMutation } from '../graphql/mutations/userCurrentOverviewResetOrder.mocks.ts'
  10. import { mockUserCurrentOverviewListQuery } from '../graphql/queries/userCurrentOverviewList.mocks.ts'
  11. const userCurrentTicketOverviews = [
  12. {
  13. id: convertToGraphQLId('Overview', 1),
  14. name: 'Open Tickets',
  15. organizationShared: false,
  16. outOfOffice: false,
  17. },
  18. {
  19. id: convertToGraphQLId('Overview', 2),
  20. name: 'My Tickets',
  21. organizationShared: false,
  22. outOfOffice: false,
  23. },
  24. {
  25. id: convertToGraphQLId('Overview', 3),
  26. name: 'All Tickets',
  27. organizationShared: false,
  28. outOfOffice: false,
  29. },
  30. ]
  31. const userCurrentOverviewListAferReset = userCurrentTicketOverviews.reverse()
  32. describe('personal settings for token access', () => {
  33. beforeEach(() => {
  34. mockUserCurrent({
  35. firstname: 'John',
  36. lastname: 'Doe',
  37. })
  38. mockPermissions(['user_preferences.overview_sorting'])
  39. })
  40. it('shows the overviews order by priority', async () => {
  41. mockUserCurrentOverviewListQuery({ userCurrentTicketOverviews })
  42. const view = await visitView('/personal-setting/ticket-overviews')
  43. const overviewContainer = view.getByLabelText('Order of ticket overviews')
  44. const overviews = getAllByRole(overviewContainer, 'listitem')
  45. userCurrentTicketOverviews.forEach((overview, index) => {
  46. expect(overviews[index]).toHaveTextContent(overview.name)
  47. })
  48. })
  49. // TODO: Cover the update of overview order when the items are moved around the list.
  50. // We may need to implement a testable mechanism for reordering the list, though, as drag events are not fully
  51. // supported in JSDOM due to missing client-rectangle coordinate mocking.
  52. // One approach could be to add keyboard shortcuts for changing the order, or perhaps even hidden buttons.
  53. it('allows to reset the order of overviews', async () => {
  54. mockUserCurrentOverviewListQuery({ userCurrentTicketOverviews })
  55. const view = await visitView('/personal-setting/ticket-overviews')
  56. mockUserCurrentOverviewResetOrderMutation({
  57. userCurrentOverviewResetOrder: {
  58. success: true,
  59. overviews: userCurrentOverviewListAferReset,
  60. errors: null,
  61. },
  62. })
  63. const resetButton = view.getByRole('button', {
  64. name: 'Reset Overview Order',
  65. })
  66. expect(resetButton).toBeInTheDocument()
  67. await view.events.click(resetButton)
  68. await waitForNextTick()
  69. expect(
  70. await view.findByRole('dialog', { name: 'Confirmation' }),
  71. ).toBeInTheDocument()
  72. await view.events.click(view.getByRole('button', { name: 'Yes' }))
  73. await waitForNextTick()
  74. userCurrentOverviewListAferReset.forEach((overview) => {
  75. expect(view.getByText(overview.name)).toBeInTheDocument()
  76. })
  77. })
  78. it('updates the overviews list when a new overview is added', async () => {
  79. mockUserCurrentOverviewListQuery({ userCurrentTicketOverviews })
  80. const view = await visitView('/personal-setting/ticket-overviews')
  81. const overviewUpdateSubscription =
  82. getUserCurrentOverviewOrderingUpdatesSubscriptionHandler()
  83. userCurrentTicketOverviews.forEach((overview) => {
  84. expect(view.getByText(overview.name)).toBeInTheDocument()
  85. })
  86. overviewUpdateSubscription.trigger({
  87. userCurrentOverviewOrderingUpdates: {
  88. overviews: [
  89. ...userCurrentTicketOverviews,
  90. {
  91. id: convertToGraphQLId('Overview', 4),
  92. name: 'New Overview',
  93. organizationShared: false,
  94. outOfOffice: false,
  95. },
  96. ],
  97. },
  98. })
  99. await waitForNextTick()
  100. expect(view.getByText('New Overview')).toBeInTheDocument()
  101. })
  102. })