tickets-view.spec.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. // Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. import { OrderDirection } from '@shared/graphql/types'
  3. import { waitFor } from '@testing-library/vue'
  4. import { visitView } from '@tests/support/components/visitView'
  5. import { mockTicketOverviews } from '@tests/support/mocks/ticket-overviews'
  6. import { waitForNextTick } from '@tests/support/utils'
  7. import { stringifyQuery } from 'vue-router'
  8. import { mockTicketsByOverview, ticketDefault } from './mocks'
  9. beforeEach(() => {
  10. mockTicketOverviews()
  11. })
  12. it('see default list when opening page', async () => {
  13. mockTicketsByOverview([])
  14. const view = await visitView('/tickets/view')
  15. const plusSign = view.getByIconName('plus')
  16. expect(plusSign, 'can create a new ticket from here').toBeInTheDocument()
  17. expect(view.getLinkFromElement(plusSign)).toHaveAttribute(
  18. 'href',
  19. '/#ticket/create',
  20. )
  21. await waitForNextTick(true)
  22. expect(
  23. await view.findByTestId('overview'),
  24. 'has default overview',
  25. ).toHaveTextContent('Overview 1')
  26. expect(
  27. await view.findByTestId('column'),
  28. 'has default column',
  29. ).toHaveTextContent('Created at')
  30. expect(
  31. view.getByIconName('long-arrow-down'),
  32. 'descending by default',
  33. ).not.toHaveClass('rotate-180')
  34. expect(
  35. await view.findByText('No entries'),
  36. 'see a message when nothing is found',
  37. ).toBeInTheDocument()
  38. expect(window.location.pathname).toBe('/tickets/view/overview_1')
  39. })
  40. it('can filter by overview type', async () => {
  41. const ticketsMock = mockTicketsByOverview()
  42. const view = await visitView('/tickets/view')
  43. const overview = await view.findByTestId('overview')
  44. await view.events.click(overview)
  45. await view.events.click(view.getByText('Overview 1 (1)'))
  46. expect(ticketsMock.spies.resolve).toHaveBeenCalledWith(
  47. expect.objectContaining({
  48. orderBy: 'created_at',
  49. orderDirection: OrderDirection.Descending,
  50. overviewId: '1',
  51. }),
  52. )
  53. const ticketItem = view.getByText('Ticket 1')
  54. expect(ticketItem).toBeInTheDocument()
  55. expect(view.getLinkFromElement(ticketItem)).toHaveAttribute(
  56. 'href',
  57. '/#ticket/zoom/1',
  58. )
  59. })
  60. it('can filter by columns and direction', async () => {
  61. const ticketsMock = mockTicketsByOverview()
  62. const view = await visitView('/tickets/view')
  63. const columnSelector = await view.findByTestId('column')
  64. await view.events.click(columnSelector)
  65. await view.events.click(view.getByText('Updated at'))
  66. await view.events.click(view.getByText('ascending'))
  67. expect(ticketsMock.spies.resolve).toHaveBeenCalledWith(
  68. expect.objectContaining({
  69. orderBy: 'updated_at',
  70. orderDirection: OrderDirection.Ascending,
  71. overviewId: '1',
  72. }),
  73. )
  74. expect(view.getByText('Ticket 1')).toBeInTheDocument()
  75. })
  76. it('can filter by type and columns and direction', async () => {
  77. const ticketsMock = mockTicketsByOverview()
  78. const view = await visitView('/tickets/view')
  79. const overview = await view.findByTestId('overview')
  80. await view.events.click(overview)
  81. await view.events.click(view.getByText('Overview 1 (1)'))
  82. const columnSelector = view.getByTestId('column')
  83. await view.events.click(columnSelector)
  84. await view.events.click(view.getByText('Updated at'))
  85. await view.events.click(view.getByText('ascending'))
  86. expect(ticketsMock.spies.resolve).toHaveBeenCalledWith(
  87. expect.objectContaining({
  88. overviewId: '1',
  89. orderBy: 'updated_at',
  90. orderDirection: OrderDirection.Ascending,
  91. }),
  92. )
  93. expect(view.getByText('Ticket 1')).toBeInTheDocument()
  94. })
  95. it('takes filter from query', async () => {
  96. const ticketsMock = mockTicketsByOverview()
  97. const query = stringifyQuery({
  98. column: 'number',
  99. direction: OrderDirection.Ascending,
  100. })
  101. await visitView(`/tickets/view?${query}`)
  102. await waitFor(() => {
  103. expect(ticketsMock.spies.resolve).toHaveBeenCalledWith(
  104. expect.objectContaining({
  105. overviewId: '1',
  106. orderBy: 'number',
  107. orderDirection: OrderDirection.Ascending,
  108. }),
  109. )
  110. })
  111. })
  112. it('pagination loads additional list', async () => {
  113. const ticketOverviewsApi = mockTicketsByOverview([ticketDefault], {
  114. hasNextPage: true,
  115. endCursor: 'cursor',
  116. })
  117. const view = await visitView(`/tickets/view`)
  118. await waitFor(() => view.getByText('Ticket 1'))
  119. document.documentElement.scrollTop = 1000
  120. document.dispatchEvent(
  121. new Event('scroll', { bubbles: true, cancelable: true }),
  122. )
  123. await waitForNextTick()
  124. expect(ticketOverviewsApi.spies.resolve).toHaveBeenCalledWith(
  125. expect.objectContaining({
  126. cursor: 'cursor',
  127. }),
  128. )
  129. })
  130. it("pagination doesn't load if it is already loading more", async () => {
  131. const ticketOverviewsApi = mockTicketsByOverview([ticketDefault], {
  132. hasNextPage: true,
  133. endCursor: 'cursor',
  134. })
  135. const view = await visitView(`/tickets/view`)
  136. await waitFor(() => view.getByTestId('overview'))
  137. document.documentElement.scrollTop = 1000
  138. document.dispatchEvent(
  139. new Event('scroll', { bubbles: true, cancelable: true }),
  140. )
  141. await waitForNextTick()
  142. expect(ticketOverviewsApi.spies.resolve).not.toHaveBeenCalledWith(
  143. expect.objectContaining({
  144. cursor: 'cursor',
  145. }),
  146. )
  147. })