customer.e2e-spec.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. import gql from 'graphql-tag';
  2. import {
  3. GET_CUSTOMER,
  4. GET_CUSTOMER_LIST,
  5. } from '../../admin-ui/src/app/data/definitions/customer-definitions';
  6. import { GetCustomer, GetCustomerList } from '../../shared/generated-types';
  7. import { omit } from '../../shared/omit';
  8. import { TEST_SETUP_TIMEOUT_MS } from './config/test-config';
  9. import { TestClient } from './test-client';
  10. import { TestServer } from './test-server';
  11. // tslint:disable:no-non-null-assertion
  12. describe('Customer resolver', () => {
  13. const client = new TestClient();
  14. const server = new TestServer();
  15. let firstCustomer: GetCustomerList.Items;
  16. let secondsCustomer: GetCustomerList.Items;
  17. beforeAll(async () => {
  18. const token = await server.init({
  19. productCount: 1,
  20. customerCount: 5,
  21. });
  22. await client.init();
  23. }, TEST_SETUP_TIMEOUT_MS);
  24. afterAll(async () => {
  25. await server.destroy();
  26. });
  27. it('customers list', async () => {
  28. const result = await client.query<GetCustomerList.Query, GetCustomerList.Variables>(
  29. GET_CUSTOMER_LIST,
  30. );
  31. expect(result.customers.items.length).toBe(5);
  32. expect(result.customers.totalItems).toBe(5);
  33. firstCustomer = result.customers.items[0];
  34. secondsCustomer = result.customers.items[1];
  35. });
  36. describe('addresses', () => {
  37. let firstCustomerAddressIds: string[] = [];
  38. it('createCustomerAddress throws on invalid countryCode', async () => {
  39. try {
  40. await client.query(CREATE_ADDRESS, {
  41. id: firstCustomer.id,
  42. input: {
  43. streetLine1: 'streetLine1',
  44. countryCode: 'INVALID',
  45. },
  46. });
  47. fail('Should have thrown');
  48. } catch (err) {
  49. expect(err.message).toEqual(
  50. expect.stringContaining(`The countryCode "INVALID" was not recognized`),
  51. );
  52. }
  53. });
  54. it('createCustomerAddress creates a new address', async () => {
  55. const result = await client.query(CREATE_ADDRESS, {
  56. id: firstCustomer.id,
  57. input: {
  58. fullName: 'fullName',
  59. company: 'company',
  60. streetLine1: 'streetLine1',
  61. streetLine2: 'streetLine2',
  62. city: 'city',
  63. province: 'province',
  64. postalCode: 'postalCode',
  65. countryCode: 'GB',
  66. phoneNumber: 'phoneNumber',
  67. defaultShippingAddress: false,
  68. defaultBillingAddress: false,
  69. },
  70. });
  71. expect(omit(result.createCustomerAddress, ['id'])).toEqual({
  72. fullName: 'fullName',
  73. company: 'company',
  74. streetLine1: 'streetLine1',
  75. streetLine2: 'streetLine2',
  76. city: 'city',
  77. province: 'province',
  78. postalCode: 'postalCode',
  79. countryCode: 'GB',
  80. country: 'United Kingdom of Great Britain and Northern Ireland',
  81. phoneNumber: 'phoneNumber',
  82. defaultShippingAddress: false,
  83. defaultBillingAddress: false,
  84. });
  85. });
  86. it('customer query returns addresses', async () => {
  87. const result = await client.query<GetCustomer.Query, GetCustomer.Variables>(GET_CUSTOMER, {
  88. id: firstCustomer.id,
  89. });
  90. expect(result.customer!.addresses!.length).toBe(2);
  91. firstCustomerAddressIds = result.customer!.addresses!.map(a => a.id);
  92. });
  93. it('updateCustomerAddress allows only a single default address', async () => {
  94. // set the first customer's second address to be default
  95. const result1 = await client.query(UPDATE_ADDRESS, {
  96. input: {
  97. id: firstCustomerAddressIds[1],
  98. defaultShippingAddress: true,
  99. defaultBillingAddress: true,
  100. },
  101. });
  102. expect(result1.updateCustomerAddress.defaultShippingAddress).toBe(true);
  103. expect(result1.updateCustomerAddress.defaultBillingAddress).toBe(true);
  104. // assert the first customer's first address is not default
  105. const result2 = await client.query<GetCustomer.Query, GetCustomer.Variables>(GET_CUSTOMER, {
  106. id: firstCustomer.id,
  107. });
  108. expect(result2.customer!.addresses![0].defaultShippingAddress).toBe(false);
  109. expect(result2.customer!.addresses![0].defaultBillingAddress).toBe(false);
  110. // set the first customer's first address to be default
  111. const result3 = await client.query(UPDATE_ADDRESS, {
  112. input: {
  113. id: firstCustomerAddressIds[0],
  114. defaultShippingAddress: true,
  115. defaultBillingAddress: true,
  116. },
  117. });
  118. expect(result3.updateCustomerAddress.defaultShippingAddress).toBe(true);
  119. expect(result3.updateCustomerAddress.defaultBillingAddress).toBe(true);
  120. // assert the first customer's second address is not default
  121. const result4 = await client.query<GetCustomer.Query, GetCustomer.Variables>(GET_CUSTOMER, {
  122. id: firstCustomer.id,
  123. });
  124. expect(result4.customer!.addresses![1].defaultShippingAddress).toBe(false);
  125. expect(result4.customer!.addresses![1].defaultBillingAddress).toBe(false);
  126. // get the second customer's address id
  127. const result5 = await client.query<GetCustomer.Query, GetCustomer.Variables>(GET_CUSTOMER, {
  128. id: secondsCustomer.id,
  129. });
  130. const secondCustomerAddressId = result5.customer!.addresses![0].id;
  131. // set the second customer's address to be default
  132. const result6 = await client.query(UPDATE_ADDRESS, {
  133. input: {
  134. id: secondCustomerAddressId,
  135. defaultShippingAddress: true,
  136. defaultBillingAddress: true,
  137. },
  138. });
  139. expect(result6.updateCustomerAddress.defaultShippingAddress).toBe(true);
  140. expect(result6.updateCustomerAddress.defaultBillingAddress).toBe(true);
  141. // assets the first customer's address defaults are unchanged
  142. const result7 = await client.query<GetCustomer.Query, GetCustomer.Variables>(GET_CUSTOMER, {
  143. id: firstCustomer.id,
  144. });
  145. expect(result7.customer!.addresses![0].defaultShippingAddress).toBe(true);
  146. expect(result7.customer!.addresses![0].defaultBillingAddress).toBe(true);
  147. expect(result7.customer!.addresses![1].defaultShippingAddress).toBe(false);
  148. expect(result7.customer!.addresses![1].defaultBillingAddress).toBe(false);
  149. });
  150. it('createCustomerAddress with true defaults unsets existing defaults', async () => {
  151. const result1 = await client.query(CREATE_ADDRESS, {
  152. id: firstCustomer.id,
  153. input: {
  154. streetLine1: 'new default streetline',
  155. countryCode: 'GB',
  156. defaultShippingAddress: true,
  157. defaultBillingAddress: true,
  158. },
  159. });
  160. expect(omit(result1.createCustomerAddress, ['id'])).toEqual({
  161. fullName: '',
  162. company: '',
  163. streetLine1: 'new default streetline',
  164. streetLine2: '',
  165. city: '',
  166. province: '',
  167. postalCode: '',
  168. countryCode: 'GB',
  169. country: 'United Kingdom of Great Britain and Northern Ireland',
  170. phoneNumber: '',
  171. defaultShippingAddress: true,
  172. defaultBillingAddress: true,
  173. });
  174. const result2 = await client.query<GetCustomer.Query, GetCustomer.Variables>(GET_CUSTOMER, {
  175. id: firstCustomer.id,
  176. });
  177. expect(result2.customer!.addresses![0].defaultShippingAddress).toBe(false);
  178. expect(result2.customer!.addresses![0].defaultBillingAddress).toBe(false);
  179. expect(result2.customer!.addresses![1].defaultShippingAddress).toBe(false);
  180. expect(result2.customer!.addresses![1].defaultBillingAddress).toBe(false);
  181. expect(result2.customer!.addresses![2].defaultShippingAddress).toBe(true);
  182. expect(result2.customer!.addresses![2].defaultBillingAddress).toBe(true);
  183. });
  184. });
  185. describe('orders', () => {
  186. it("lists that user's orders", async () => {
  187. // log in as first customer
  188. await client.asUserWithCredentials(firstCustomer.emailAddress, 'test');
  189. // add an item to the order to create an order
  190. const result1 = await client.query(ADD_ITEM_TO_ORDER, {
  191. productVariantId: 'T_1',
  192. quantity: 1,
  193. });
  194. await client.asSuperAdmin();
  195. const result2 = await client.query(GET_CUSTOMER_ORDERS, { id: firstCustomer.id });
  196. expect(result2.customer.orders.totalItems).toBe(1);
  197. expect(result2.customer.orders.items[0].id).toBe(result1.addItemToOrder.id);
  198. });
  199. });
  200. });
  201. const CREATE_ADDRESS = gql`
  202. mutation CreateAddress($id: ID!, $input: CreateAddressInput!) {
  203. createCustomerAddress(customerId: $id, input: $input) {
  204. id
  205. fullName
  206. company
  207. streetLine1
  208. streetLine2
  209. city
  210. province
  211. postalCode
  212. country
  213. countryCode
  214. phoneNumber
  215. defaultShippingAddress
  216. defaultBillingAddress
  217. }
  218. }
  219. `;
  220. const UPDATE_ADDRESS = gql`
  221. mutation UpdateAddress($input: UpdateAddressInput!) {
  222. updateCustomerAddress(input: $input) {
  223. id
  224. defaultShippingAddress
  225. defaultBillingAddress
  226. }
  227. }
  228. `;
  229. const ADD_ITEM_TO_ORDER = gql`
  230. mutation AddItemToOrder($productVariantId: ID!, $quantity: Int!) {
  231. addItemToOrder(productVariantId: $productVariantId, quantity: $quantity) {
  232. id
  233. }
  234. }
  235. `;
  236. const GET_CUSTOMER_ORDERS = gql`
  237. query GetCustomerOrders($id: ID!) {
  238. customer(id: $id) {
  239. orders {
  240. items {
  241. id
  242. }
  243. totalItems
  244. }
  245. }
  246. }
  247. `;