query-calls.spec.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. // Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. import {
  3. EnumObjectManagerObjects,
  4. type AutocompleteSearchObjectAttributeExternalDataSourceInput,
  5. } from '#shared/graphql/types.ts'
  6. import { convertToGraphQLId } from '#shared/graphql/utils.ts'
  7. import {
  8. getGraphQLMockCalls,
  9. mockGraphQLResult,
  10. mockedApolloClient,
  11. } from '../mocks.ts'
  12. import {
  13. TestAutocompleteArrayFirstLevel,
  14. TestAvatarDocument,
  15. TestTicketArticlesMultiple,
  16. TestUserDocument,
  17. } from './queries.ts'
  18. import type {
  19. TestAutocompleteArrayFirstLevelQuery,
  20. TestAvatarQuery,
  21. TestTicketArticlesMultipleQuery,
  22. TestUserQuery,
  23. TestUserQueryVariables,
  24. } from './queries.ts'
  25. import { getQueryHandler } from './utils.ts'
  26. describe('calling queries without mocking document works correctly', () => {
  27. it('client is defined', () => {
  28. expect(mockedApolloClient).toBeDefined()
  29. })
  30. it('query correctly returns data', async () => {
  31. expect(getGraphQLMockCalls(TestAvatarDocument)).toHaveLength(0)
  32. const handler = getQueryHandler<TestAvatarQuery>(TestAvatarDocument)
  33. const { data } = await handler.query()
  34. const { data: mocked } = handler.getMockedData()
  35. // mocked has more fields because it contains the whole object
  36. expect(mocked).toMatchObject(data!)
  37. expect(data).not.toMatchObject(mocked)
  38. expect(mocked).toHaveProperty('accountAvatarActive.updatedBy')
  39. expect(data).not.toHaveProperty('accountAvatarActive.updatedBy')
  40. })
  41. it('when user is already created, return it if variable is referencing it', async () => {
  42. expect(getGraphQLMockCalls(TestAvatarDocument)).toHaveLength(0)
  43. const handler = getQueryHandler<TestUserQuery, TestUserQueryVariables>(
  44. TestUserDocument,
  45. )
  46. const userId = convertToGraphQLId('User', 42)
  47. const { data } = await handler.query({
  48. variables: {
  49. userId,
  50. },
  51. })
  52. const { data: mocked } = handler.getMockedData()
  53. expect(data?.user.id).toBe(userId)
  54. expect(data?.user.id).toBe(mocked.user.id)
  55. expect(data?.user.fullname).toBe(mocked.user.fullname)
  56. const { data: data2 } = await handler.query({
  57. variables: {
  58. userId,
  59. },
  60. })
  61. expect(data2?.user.id).toBe(userId)
  62. expect(data2?.user.id).toBe(data?.user.id)
  63. expect(data2?.user.fullname).toBe(data?.user.fullname)
  64. const userIdNext = convertToGraphQLId('User', 43)
  65. const { data: data3 } = await handler.query({
  66. variables: {
  67. userId: userIdNext,
  68. },
  69. })
  70. expect(data3?.user.id).toBe(userIdNext)
  71. })
  72. })
  73. describe('calling queries with mocked data works correctly', () => {
  74. it('query correctly uses default data when generating a new item each time', async () => {
  75. expect(getGraphQLMockCalls(TestAvatarDocument)).toHaveLength(0)
  76. const exampleImage = 'https://example.com/image.png'
  77. mockGraphQLResult<TestAvatarQuery>(TestAvatarDocument, {
  78. accountAvatarActive: {
  79. imageFull: exampleImage,
  80. },
  81. })
  82. const handler = getQueryHandler<TestAvatarQuery>(TestAvatarDocument)
  83. const { data } = await handler.query()
  84. const { data: mock } = handler.getMockedData()
  85. expect(data).toHaveProperty('accountAvatarActive.imageFull', exampleImage)
  86. expect(mock).toHaveProperty('accountAvatarActive.imageFull', exampleImage)
  87. const exampleImage2 = 'https://example.com/image2.png'
  88. mockGraphQLResult<TestAvatarQuery>(TestAvatarDocument, {
  89. accountAvatarActive: {
  90. imageFull: exampleImage2,
  91. },
  92. })
  93. const { data: data2 } = await handler.query({ fetchPolicy: 'network-only' })
  94. const { data: mock2 } = handler.getMockedData()
  95. expect(mock2).toHaveProperty('accountAvatarActive.imageFull', exampleImage2)
  96. expect(data2).toHaveProperty('accountAvatarActive.imageFull', exampleImage2)
  97. })
  98. it('query correctly uses default data when updating the same object', async () => {
  99. expect(getGraphQLMockCalls(TestAvatarDocument)).toHaveLength(0)
  100. const exampleImage = 'https://example.com/image.png'
  101. mockGraphQLResult<TestAvatarQuery>(TestAvatarDocument, {
  102. accountAvatarActive: {
  103. imageFull: exampleImage,
  104. },
  105. })
  106. const handler = getQueryHandler<TestAvatarQuery>(TestAvatarDocument)
  107. const { data } = await handler.query()
  108. const { data: mock } = handler.getMockedData()
  109. expect(data).toHaveProperty('accountAvatarActive.imageFull', exampleImage)
  110. expect(mock).toHaveProperty('accountAvatarActive.imageFull', exampleImage)
  111. const exampleImage2 = 'https://example.com/image2.png'
  112. mockGraphQLResult<TestAvatarQuery>(TestAvatarDocument, {
  113. accountAvatarActive: {
  114. id: data?.accountAvatarActive.id,
  115. imageFull: exampleImage2,
  116. },
  117. })
  118. const { data: data2 } = await handler.query({ fetchPolicy: 'network-only' })
  119. const { data: mock2 } = handler.getMockedData()
  120. expect(mock2).toHaveProperty('accountAvatarActive.imageFull', exampleImage2)
  121. expect(data2).toHaveProperty('accountAvatarActive.imageFull', exampleImage2)
  122. })
  123. it('when operation requests an array inside the first level, it correctly returns an array', async () => {
  124. const handler = getQueryHandler<
  125. TestAutocompleteArrayFirstLevelQuery,
  126. {
  127. input: AutocompleteSearchObjectAttributeExternalDataSourceInput
  128. }
  129. >(TestAutocompleteArrayFirstLevel)
  130. const { data } = await handler.query({
  131. variables: {
  132. input: {
  133. query: 'test',
  134. attributeName: 'test',
  135. object: EnumObjectManagerObjects.Ticket,
  136. templateRenderContext: {},
  137. },
  138. },
  139. })
  140. const { data: mocked } = handler.getMockedData()
  141. expect(
  142. data?.autocompleteSearchObjectAttributeExternalDataSource,
  143. ).toBeInstanceOf(Array)
  144. expect(
  145. mocked?.autocompleteSearchObjectAttributeExternalDataSource,
  146. ).toBeInstanceOf(Array)
  147. expect(
  148. data?.autocompleteSearchObjectAttributeExternalDataSource.length,
  149. ).toBe(mocked?.autocompleteSearchObjectAttributeExternalDataSource.length)
  150. expect(mocked).toMatchObject(data!)
  151. })
  152. it('query that references itself correctly returns data', async () => {
  153. const handler = getQueryHandler<
  154. TestTicketArticlesMultipleQuery,
  155. {
  156. ticketId: string
  157. }
  158. >(TestTicketArticlesMultiple)
  159. const { data, error } = await handler.query({
  160. variables: {
  161. ticketId: convertToGraphQLId('Ticket', 42),
  162. },
  163. })
  164. const { data: mock } = handler.getMockedData()
  165. expect(error).toBeUndefined()
  166. expect(data).toHaveProperty(
  167. 'description.edges.0.node.bodyWithUrls',
  168. mock.description.edges[0].node.bodyWithUrls,
  169. )
  170. expect(data).toHaveProperty('articles.totalCount', mock.articles.totalCount)
  171. expect(data).toHaveProperty(
  172. 'articles.edges.0.node.bodyWithUrls',
  173. mock.articles.edges[0].node.bodyWithUrls,
  174. )
  175. })
  176. })