product-option.e2e-spec.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import { createTestEnvironment } from '@vendure/testing';
  2. import gql from 'graphql-tag';
  3. import path from 'path';
  4. import { initialData } from '../../../e2e-common/e2e-initial-data';
  5. import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
  6. import { omit } from '../../common/lib/omit';
  7. import { PRODUCT_OPTION_GROUP_FRAGMENT } from './graphql/fragments';
  8. import {
  9. CreateProductOption,
  10. CreateProductOptionGroup,
  11. LanguageCode,
  12. ProductOptionGroupFragment,
  13. UpdateProductOption,
  14. UpdateProductOptionGroup,
  15. } from './graphql/generated-e2e-admin-types';
  16. import { CREATE_PRODUCT_OPTION_GROUP } from './graphql/shared-definitions';
  17. import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
  18. // tslint:disable:no-non-null-assertion
  19. describe('ProductOption resolver', () => {
  20. const { server, adminClient } = createTestEnvironment(testConfig());
  21. let sizeGroup: ProductOptionGroupFragment;
  22. let mediumOption: CreateProductOption.CreateProductOption;
  23. beforeAll(async () => {
  24. await server.init({
  25. initialData,
  26. customerCount: 1,
  27. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-minimal.csv'),
  28. });
  29. await adminClient.asSuperAdmin();
  30. }, TEST_SETUP_TIMEOUT_MS);
  31. afterAll(async () => {
  32. await server.destroy();
  33. });
  34. it('createProductOptionGroup', async () => {
  35. const { createProductOptionGroup } = await adminClient.query<
  36. CreateProductOptionGroup.Mutation,
  37. CreateProductOptionGroup.Variables
  38. >(CREATE_PRODUCT_OPTION_GROUP, {
  39. input: {
  40. code: 'size',
  41. translations: [
  42. { languageCode: LanguageCode.en, name: 'Size' },
  43. { languageCode: LanguageCode.de, name: 'Größe' },
  44. ],
  45. options: [
  46. {
  47. code: 'small',
  48. translations: [
  49. { languageCode: LanguageCode.en, name: 'Small' },
  50. { languageCode: LanguageCode.de, name: 'Klein' },
  51. ],
  52. },
  53. {
  54. code: 'large',
  55. translations: [
  56. { languageCode: LanguageCode.en, name: 'Large' },
  57. { languageCode: LanguageCode.de, name: 'Groß' },
  58. ],
  59. },
  60. ],
  61. },
  62. });
  63. expect(omit(createProductOptionGroup, ['options', 'translations'])).toEqual({
  64. id: 'T_3',
  65. name: 'Size',
  66. code: 'size',
  67. });
  68. sizeGroup = createProductOptionGroup;
  69. });
  70. it('updateProductOptionGroup', async () => {
  71. const { updateProductOptionGroup } = await adminClient.query<
  72. UpdateProductOptionGroup.Mutation,
  73. UpdateProductOptionGroup.Variables
  74. >(UPDATE_PRODUCT_OPTION_GROUP, {
  75. input: {
  76. id: sizeGroup.id,
  77. translations: [
  78. { id: sizeGroup.translations[0].id, languageCode: LanguageCode.en, name: 'Bigness' },
  79. ],
  80. },
  81. });
  82. expect(updateProductOptionGroup.name).toBe('Bigness');
  83. });
  84. it(
  85. 'createProductOption throws with invalid productOptionGroupId',
  86. assertThrowsWithMessage(async () => {
  87. const { createProductOption } = await adminClient.query<
  88. CreateProductOption.Mutation,
  89. CreateProductOption.Variables
  90. >(CREATE_PRODUCT_OPTION, {
  91. input: {
  92. productOptionGroupId: 'T_999',
  93. code: 'medium',
  94. translations: [
  95. { languageCode: LanguageCode.en, name: 'Medium' },
  96. { languageCode: LanguageCode.de, name: 'Mittel' },
  97. ],
  98. },
  99. });
  100. }, "No ProductOptionGroup with the id '999' could be found"),
  101. );
  102. it('createProductOption', async () => {
  103. const { createProductOption } = await adminClient.query<
  104. CreateProductOption.Mutation,
  105. CreateProductOption.Variables
  106. >(CREATE_PRODUCT_OPTION, {
  107. input: {
  108. productOptionGroupId: sizeGroup.id,
  109. code: 'medium',
  110. translations: [
  111. { languageCode: LanguageCode.en, name: 'Medium' },
  112. { languageCode: LanguageCode.de, name: 'Mittel' },
  113. ],
  114. },
  115. });
  116. expect(omit(createProductOption, ['translations'])).toEqual({
  117. id: 'T_7',
  118. groupId: sizeGroup.id,
  119. code: 'medium',
  120. name: 'Medium',
  121. });
  122. mediumOption = createProductOption;
  123. });
  124. it('updateProductOption', async () => {
  125. const { updateProductOption } = await adminClient.query<
  126. UpdateProductOption.Mutation,
  127. UpdateProductOption.Variables
  128. >(UPDATE_PRODUCT_OPTION, {
  129. input: {
  130. id: 'T_7',
  131. translations: [
  132. { id: mediumOption.translations[0].id, languageCode: LanguageCode.en, name: 'Middling' },
  133. ],
  134. },
  135. });
  136. expect(updateProductOption.name).toBe('Middling');
  137. });
  138. });
  139. const UPDATE_PRODUCT_OPTION_GROUP = gql`
  140. mutation UpdateProductOptionGroup($input: UpdateProductOptionGroupInput!) {
  141. updateProductOptionGroup(input: $input) {
  142. ...ProductOptionGroup
  143. }
  144. }
  145. ${PRODUCT_OPTION_GROUP_FRAGMENT}
  146. `;
  147. const CREATE_PRODUCT_OPTION = gql`
  148. mutation CreateProductOption($input: CreateProductOptionInput!) {
  149. createProductOption(input: $input) {
  150. id
  151. code
  152. name
  153. groupId
  154. translations {
  155. id
  156. languageCode
  157. name
  158. }
  159. }
  160. }
  161. `;
  162. const UPDATE_PRODUCT_OPTION = gql`
  163. mutation UpdateProductOption($input: UpdateProductOptionInput!) {
  164. updateProductOption(input: $input) {
  165. id
  166. code
  167. name
  168. groupId
  169. }
  170. }
  171. `;