order.e2e-spec.ts 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. import gql from 'graphql-tag';
  2. import { Customer } from '../src/entity/customer/customer.entity';
  3. import { OrderItem } from '../src/entity/order-item/order-item.entity';
  4. import { TestClient } from './test-client';
  5. import { TestServer } from './test-server';
  6. describe('Orders', () => {
  7. const client = new TestClient();
  8. const server = new TestServer();
  9. beforeAll(async () => {
  10. const token = await server.init({
  11. productCount: 10,
  12. customerCount: 1,
  13. });
  14. await client.init();
  15. }, 60000);
  16. afterAll(async () => {
  17. await server.destroy();
  18. });
  19. describe('as anonymous user', () => {
  20. let firstOrderItemId: string;
  21. beforeAll(async () => {
  22. await client.asAnonymousUser();
  23. });
  24. it('addItemToOrder() starts with no session token', () => {
  25. expect(client.getAuthToken()).toBe('');
  26. });
  27. it('addItemToOrder() creates a new Order with an item', async () => {
  28. const result = await client.query(ADD_ITEM_TO_ORDER, {
  29. productVariantId: 'T_1',
  30. quantity: 1,
  31. });
  32. expect(result.addItemToOrder.items.length).toBe(1);
  33. expect(result.addItemToOrder.items[0].quantity).toBe(1);
  34. expect(result.addItemToOrder.items[0].productVariant.id).toBe('T_1');
  35. expect(result.addItemToOrder.items[0].id).toBe('T_1');
  36. firstOrderItemId = result.addItemToOrder.items[0].id;
  37. });
  38. it('addItemToOrder() creates an anonymous session', () => {
  39. expect(client.getAuthToken()).not.toBe('');
  40. });
  41. it('addItemToOrder() errors with an invalid productVariantId', async () => {
  42. try {
  43. await client.query(ADD_ITEM_TO_ORDER, {
  44. productVariantId: 'T_999',
  45. quantity: 1,
  46. });
  47. fail('Should have thrown');
  48. } catch (err) {
  49. expect(err.message).toEqual(
  50. expect.stringContaining(`No ProductVariant with the id '999' could be found`),
  51. );
  52. }
  53. });
  54. it('addItemToOrder() errors with a negative quantity', async () => {
  55. try {
  56. await client.query(ADD_ITEM_TO_ORDER, {
  57. productVariantId: 'T_999',
  58. quantity: -3,
  59. });
  60. fail('Should have thrown');
  61. } catch (err) {
  62. expect(err.message).toEqual(
  63. expect.stringContaining(`-3 is not a valid quantity for an OrderItem`),
  64. );
  65. }
  66. });
  67. it('addItemToOrder() with an existing productVariantId adds quantity to the existing OrderItem', async () => {
  68. const result = await client.query(ADD_ITEM_TO_ORDER, {
  69. productVariantId: 'T_1',
  70. quantity: 2,
  71. });
  72. expect(result.addItemToOrder.items.length).toBe(1);
  73. expect(result.addItemToOrder.items[0].quantity).toBe(3);
  74. });
  75. it('adjustItemQuantity() adjusts the quantity', async () => {
  76. const result = await client.query(ADJUST_ITEM_QUENTITY, {
  77. orderItemId: firstOrderItemId,
  78. quantity: 50,
  79. });
  80. expect(result.adjustItemQuantity.items.length).toBe(1);
  81. expect(result.adjustItemQuantity.items[0].quantity).toBe(50);
  82. });
  83. it('adjustItemQuantity() errors with a negative quantity', async () => {
  84. try {
  85. await client.query(ADJUST_ITEM_QUENTITY, {
  86. orderItemId: firstOrderItemId,
  87. quantity: -3,
  88. });
  89. fail('Should have thrown');
  90. } catch (err) {
  91. expect(err.message).toEqual(
  92. expect.stringContaining(`-3 is not a valid quantity for an OrderItem`),
  93. );
  94. }
  95. });
  96. it('adjustItemQuantity() errors with an invalid orderItemId', async () => {
  97. try {
  98. await client.query(ADJUST_ITEM_QUENTITY, {
  99. orderItemId: 'T_999',
  100. quantity: 5,
  101. });
  102. fail('Should have thrown');
  103. } catch (err) {
  104. expect(err.message).toEqual(
  105. expect.stringContaining(`This order does not contain an OrderItem with the id 999`),
  106. );
  107. }
  108. });
  109. it('removeItemFromOrder() removes the correct item', async () => {
  110. const result1 = await client.query(ADD_ITEM_TO_ORDER, {
  111. productVariantId: 'T_3',
  112. quantity: 3,
  113. });
  114. expect(result1.addItemToOrder.items.length).toBe(2);
  115. expect(result1.addItemToOrder.items.map(i => i.productVariant.id)).toEqual(['T_1', 'T_3']);
  116. const result2 = await client.query(REMOVE_ITEM_FROM_ORDER, {
  117. orderItemId: firstOrderItemId,
  118. });
  119. expect(result2.removeItemFromOrder.items.length).toBe(1);
  120. expect(result2.removeItemFromOrder.items.map(i => i.productVariant.id)).toEqual(['T_3']);
  121. });
  122. it('removeItemFromOrder() errors with an invalid orderItemId', async () => {
  123. try {
  124. await client.query(REMOVE_ITEM_FROM_ORDER, {
  125. orderItemId: 'T_999',
  126. });
  127. fail('Should have thrown');
  128. } catch (err) {
  129. expect(err.message).toEqual(
  130. expect.stringContaining(`This order does not contain an OrderItem with the id 999`),
  131. );
  132. }
  133. });
  134. });
  135. describe('as authenticated user', () => {
  136. let firstOrderItemId: string;
  137. beforeAll(async () => {
  138. await client.asSuperAdmin();
  139. const result = await client.query(gql`
  140. query {
  141. customer(id: "T_1") {
  142. id
  143. emailAddress
  144. }
  145. }
  146. `);
  147. const customer: Customer = result.customer;
  148. await client.asUserWithCredentials(customer.emailAddress, 'test');
  149. });
  150. it('addItemToOrder() creates a new Order with an item', async () => {
  151. const result = await client.query(ADD_ITEM_TO_ORDER, {
  152. productVariantId: 'T_1',
  153. quantity: 1,
  154. });
  155. expect(result.addItemToOrder.items.length).toBe(1);
  156. expect(result.addItemToOrder.items[0].quantity).toBe(1);
  157. expect(result.addItemToOrder.items[0].productVariant.id).toBe('T_1');
  158. firstOrderItemId = result.addItemToOrder.items[0].id;
  159. });
  160. it('addItemToOrder() with an existing productVariantId adds quantity to the existing OrderItem', async () => {
  161. const result = await client.query(ADD_ITEM_TO_ORDER, {
  162. productVariantId: 'T_1',
  163. quantity: 2,
  164. });
  165. expect(result.addItemToOrder.items.length).toBe(1);
  166. expect(result.addItemToOrder.items[0].quantity).toBe(3);
  167. });
  168. it('adjustItemQuantity() adjusts the quantity', async () => {
  169. const result = await client.query(ADJUST_ITEM_QUENTITY, {
  170. orderItemId: firstOrderItemId,
  171. quantity: 50,
  172. });
  173. expect(result.adjustItemQuantity.items.length).toBe(1);
  174. expect(result.adjustItemQuantity.items[0].quantity).toBe(50);
  175. });
  176. it('removeItemFromOrder() removes the correct item', async () => {
  177. const result1 = await client.query(ADD_ITEM_TO_ORDER, {
  178. productVariantId: 'T_3',
  179. quantity: 3,
  180. });
  181. expect(result1.addItemToOrder.items.length).toBe(2);
  182. expect(result1.addItemToOrder.items.map(i => i.productVariant.id)).toEqual(['T_1', 'T_3']);
  183. const result2 = await client.query(REMOVE_ITEM_FROM_ORDER, {
  184. orderItemId: firstOrderItemId,
  185. });
  186. expect(result2.removeItemFromOrder.items.length).toBe(1);
  187. expect(result2.removeItemFromOrder.items.map(i => i.productVariant.id)).toEqual(['T_3']);
  188. });
  189. });
  190. });
  191. const TEST_ORDER_FRAGMENT = gql`
  192. fragment TestOrderFragment on Order {
  193. id
  194. items {
  195. id
  196. quantity
  197. productVariant {
  198. id
  199. }
  200. }
  201. }
  202. `;
  203. const ADD_ITEM_TO_ORDER = gql`
  204. mutation AddItemToOrder($productVariantId: ID!, $quantity: Int!) {
  205. addItemToOrder(productVariantId: $productVariantId, quantity: $quantity) {
  206. ...TestOrderFragment
  207. }
  208. }
  209. ${TEST_ORDER_FRAGMENT}
  210. `;
  211. const ADJUST_ITEM_QUENTITY = gql`
  212. mutation AdjustItemQuantity($orderItemId: ID!, $quantity: Int!) {
  213. adjustItemQuantity(orderItemId: $orderItemId, quantity: $quantity) {
  214. ...TestOrderFragment
  215. }
  216. }
  217. ${TEST_ORDER_FRAGMENT}
  218. `;
  219. const REMOVE_ITEM_FROM_ORDER = gql`
  220. mutation RemoveItemFromOrder($orderItemId: ID!) {
  221. removeItemFromOrder(orderItemId: $orderItemId) {
  222. ...TestOrderFragment
  223. }
  224. }
  225. ${TEST_ORDER_FRAGMENT}
  226. `;