order.e2e-spec.ts 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. import gql from 'graphql-tag';
  2. import { GET_CUSTOMER_LIST } from '../../admin-ui/src/app/data/definitions/customer-definitions';
  3. import { CreateAddressInput, GetCustomerList } from '../../shared/generated-types';
  4. import { PaymentMethodHandler } from '../src/config/payment-method/payment-method-handler';
  5. import { TEST_SETUP_TIMEOUT_MS } from './config/test-config';
  6. import { TestClient } from './test-client';
  7. import { TestServer } from './test-server';
  8. import { assertThrowsWithMessage } from './test-utils';
  9. describe('Orders', () => {
  10. const client = new TestClient();
  11. const server = new TestServer();
  12. beforeAll(async () => {
  13. const token = await server.init(
  14. {
  15. productCount: 10,
  16. customerCount: 2,
  17. },
  18. {
  19. paymentOptions: {
  20. paymentMethodHandlers: [testPaymentMethod, testFailingPaymentMethod],
  21. },
  22. },
  23. );
  24. await client.init();
  25. }, TEST_SETUP_TIMEOUT_MS);
  26. afterAll(async () => {
  27. await server.destroy();
  28. });
  29. describe('as anonymous user', () => {
  30. let firstOrderItemId: string;
  31. let createdCustomerId: string;
  32. beforeAll(async () => {
  33. await client.asAnonymousUser();
  34. });
  35. it('addItemToOrder starts with no session token', () => {
  36. expect(client.getAuthToken()).toBe('');
  37. });
  38. it('activeOrder returns null before any items have been added', async () => {
  39. const result = await client.query(GET_ACTIVE_ORDER);
  40. expect(result.activeOrder).toBeNull();
  41. });
  42. it('activeOrder creates an anonymous session', () => {
  43. expect(client.getAuthToken()).not.toBe('');
  44. });
  45. it('addItemToOrder creates a new Order with an item', async () => {
  46. const result = await client.query(ADD_ITEM_TO_ORDER, {
  47. productVariantId: 'T_1',
  48. quantity: 1,
  49. });
  50. expect(result.addItemToOrder.lines.length).toBe(1);
  51. expect(result.addItemToOrder.lines[0].quantity).toBe(1);
  52. expect(result.addItemToOrder.lines[0].productVariant.id).toBe('T_1');
  53. expect(result.addItemToOrder.lines[0].id).toBe('T_1');
  54. firstOrderItemId = result.addItemToOrder.lines[0].id;
  55. });
  56. it(
  57. 'addItemToOrder errors with an invalid productVariantId',
  58. assertThrowsWithMessage(
  59. () =>
  60. client.query(ADD_ITEM_TO_ORDER, {
  61. productVariantId: 'T_999',
  62. quantity: 1,
  63. }),
  64. `No ProductVariant with the id '999' could be found`,
  65. ),
  66. );
  67. it(
  68. 'addItemToOrder errors with a negative quantity',
  69. assertThrowsWithMessage(
  70. () =>
  71. client.query(ADD_ITEM_TO_ORDER, {
  72. productVariantId: 'T_999',
  73. quantity: -3,
  74. }),
  75. `-3 is not a valid quantity for an OrderItem`,
  76. ),
  77. );
  78. it('addItemToOrder with an existing productVariantId adds quantity to the existing OrderLine', async () => {
  79. const result = await client.query(ADD_ITEM_TO_ORDER, {
  80. productVariantId: 'T_1',
  81. quantity: 2,
  82. });
  83. expect(result.addItemToOrder.lines.length).toBe(1);
  84. expect(result.addItemToOrder.lines[0].quantity).toBe(3);
  85. });
  86. it('adjustItemQuantity adjusts the quantity', async () => {
  87. const result = await client.query(ADJUST_ITEM_QUENTITY, {
  88. orderItemId: firstOrderItemId,
  89. quantity: 50,
  90. });
  91. expect(result.adjustItemQuantity.lines.length).toBe(1);
  92. expect(result.adjustItemQuantity.lines[0].quantity).toBe(50);
  93. });
  94. it(
  95. 'adjustItemQuantity errors with a negative quantity',
  96. assertThrowsWithMessage(
  97. () =>
  98. client.query(ADJUST_ITEM_QUENTITY, {
  99. orderItemId: firstOrderItemId,
  100. quantity: -3,
  101. }),
  102. `-3 is not a valid quantity for an OrderItem`,
  103. ),
  104. );
  105. it(
  106. 'adjustItemQuantity errors with an invalid orderItemId',
  107. assertThrowsWithMessage(
  108. () =>
  109. client.query(ADJUST_ITEM_QUENTITY, {
  110. orderItemId: 'T_999',
  111. quantity: 5,
  112. }),
  113. `This order does not contain an OrderLine with the id 999`,
  114. ),
  115. );
  116. it('removeItemFromOrder removes the correct item', async () => {
  117. const result1 = await client.query(ADD_ITEM_TO_ORDER, {
  118. productVariantId: 'T_3',
  119. quantity: 3,
  120. });
  121. expect(result1.addItemToOrder.lines.length).toBe(2);
  122. expect(result1.addItemToOrder.lines.map(i => i.productVariant.id)).toEqual(['T_1', 'T_3']);
  123. const result2 = await client.query(REMOVE_ITEM_FROM_ORDER, {
  124. orderItemId: firstOrderItemId,
  125. });
  126. expect(result2.removeItemFromOrder.lines.length).toBe(1);
  127. expect(result2.removeItemFromOrder.lines.map(i => i.productVariant.id)).toEqual(['T_3']);
  128. });
  129. it(
  130. 'removeItemFromOrder errors with an invalid orderItemId',
  131. assertThrowsWithMessage(
  132. () =>
  133. client.query(REMOVE_ITEM_FROM_ORDER, {
  134. orderItemId: 'T_999',
  135. }),
  136. `This order does not contain an OrderLine with the id 999`,
  137. ),
  138. );
  139. it('nextOrderStates returns next valid states', async () => {
  140. const result = await client.query(gql`
  141. query {
  142. nextOrderStates
  143. }
  144. `);
  145. expect(result.nextOrderStates).toEqual(['ArrangingPayment']);
  146. });
  147. it(
  148. 'transitionOrderToState throws for an invalid state',
  149. assertThrowsWithMessage(
  150. () => client.query(TRANSITION_TO_STATE, { state: 'Completed' }),
  151. `Cannot transition Order from "AddingItems" to "Completed"`,
  152. ),
  153. );
  154. it(
  155. 'attempting to transition to ArrangingPayment throws when Order has no Customer',
  156. assertThrowsWithMessage(
  157. () => client.query(TRANSITION_TO_STATE, { state: 'ArrangingPayment' }),
  158. `Cannot transition Order to the "ArrangingShipping" state without Customer details`,
  159. ),
  160. );
  161. it('setCustomerForOrder creates a new Customer and associates it with the Order', async () => {
  162. const result = await client.query(SET_CUSTOMER, {
  163. input: {
  164. emailAddress: 'test@test.com',
  165. firstName: 'Test',
  166. lastName: 'Person',
  167. },
  168. });
  169. const customer = result.setCustomerForOrder.customer;
  170. expect(customer.firstName).toBe('Test');
  171. expect(customer.lastName).toBe('Person');
  172. expect(customer.emailAddress).toBe('test@test.com');
  173. createdCustomerId = customer.id;
  174. });
  175. it('setCustomerForOrder updates the existing customer if Customer already set', async () => {
  176. const result = await client.query(SET_CUSTOMER, {
  177. input: {
  178. emailAddress: 'test@test.com',
  179. firstName: 'Changed',
  180. lastName: 'Person',
  181. },
  182. });
  183. const customer = result.setCustomerForOrder.customer;
  184. expect(customer.firstName).toBe('Changed');
  185. expect(customer.lastName).toBe('Person');
  186. expect(customer.emailAddress).toBe('test@test.com');
  187. expect(customer.id).toBe(createdCustomerId);
  188. });
  189. it('can transition to ArrangingPayment once Customer has been set', async () => {
  190. const result = await client.query(TRANSITION_TO_STATE, { state: 'ArrangingPayment' });
  191. expect(result.transitionOrderToState).toEqual({ id: 'T_1', state: 'ArrangingPayment' });
  192. });
  193. });
  194. describe('as authenticated user', () => {
  195. let firstOrderItemId: string;
  196. let activeOrder: any;
  197. let authenticatedUserEmailAddress: string;
  198. let customers: GetCustomerList.Items[];
  199. const password = 'test';
  200. beforeAll(async () => {
  201. await client.asSuperAdmin();
  202. const result = await client.query<GetCustomerList.Query, GetCustomerList.Variables>(
  203. GET_CUSTOMER_LIST,
  204. {
  205. options: {
  206. take: 2,
  207. },
  208. },
  209. );
  210. customers = result.customers.items;
  211. authenticatedUserEmailAddress = customers[0].emailAddress;
  212. await client.asUserWithCredentials(authenticatedUserEmailAddress, password);
  213. });
  214. it('activeOrder returns null before any items have been added', async () => {
  215. const result = await client.query(GET_ACTIVE_ORDER);
  216. expect(result.activeOrder).toBeNull();
  217. });
  218. it('addItemToOrder creates a new Order with an item', async () => {
  219. const result = await client.query(ADD_ITEM_TO_ORDER, {
  220. productVariantId: 'T_1',
  221. quantity: 1,
  222. });
  223. expect(result.addItemToOrder.lines.length).toBe(1);
  224. expect(result.addItemToOrder.lines[0].quantity).toBe(1);
  225. expect(result.addItemToOrder.lines[0].productVariant.id).toBe('T_1');
  226. activeOrder = result.addItemToOrder;
  227. firstOrderItemId = result.addItemToOrder.lines[0].id;
  228. });
  229. it('activeOrder returns order after item has been added', async () => {
  230. const result = await client.query(GET_ACTIVE_ORDER);
  231. expect(result.activeOrder.id).toBe(activeOrder.id);
  232. expect(result.activeOrder.state).toBe('AddingItems');
  233. });
  234. it('addItemToOrder with an existing productVariantId adds quantity to the existing OrderLine', async () => {
  235. const result = await client.query(ADD_ITEM_TO_ORDER, {
  236. productVariantId: 'T_1',
  237. quantity: 2,
  238. });
  239. expect(result.addItemToOrder.lines.length).toBe(1);
  240. expect(result.addItemToOrder.lines[0].quantity).toBe(3);
  241. });
  242. it('adjustItemQuantity adjusts the quantity', async () => {
  243. const result = await client.query(ADJUST_ITEM_QUENTITY, {
  244. orderItemId: firstOrderItemId,
  245. quantity: 50,
  246. });
  247. expect(result.adjustItemQuantity.lines.length).toBe(1);
  248. expect(result.adjustItemQuantity.lines[0].quantity).toBe(50);
  249. });
  250. it('removeItemFromOrder removes the correct item', async () => {
  251. const result1 = await client.query(ADD_ITEM_TO_ORDER, {
  252. productVariantId: 'T_3',
  253. quantity: 3,
  254. });
  255. expect(result1.addItemToOrder.lines.length).toBe(2);
  256. expect(result1.addItemToOrder.lines.map(i => i.productVariant.id)).toEqual(['T_1', 'T_3']);
  257. const result2 = await client.query(REMOVE_ITEM_FROM_ORDER, {
  258. orderItemId: firstOrderItemId,
  259. });
  260. expect(result2.removeItemFromOrder.lines.length).toBe(1);
  261. expect(result2.removeItemFromOrder.lines.map(i => i.productVariant.id)).toEqual(['T_3']);
  262. });
  263. it('nextOrderStates returns next valid states', async () => {
  264. const result = await client.query(GET_NEXT_STATES);
  265. expect(result.nextOrderStates).toEqual(['ArrangingPayment']);
  266. });
  267. it('logging out and back in again resumes the last active order', async () => {
  268. await client.asAnonymousUser();
  269. const result1 = await client.query(GET_ACTIVE_ORDER);
  270. expect(result1.activeOrder).toBeNull();
  271. await client.asUserWithCredentials(authenticatedUserEmailAddress, password);
  272. const result2 = await client.query(GET_ACTIVE_ORDER);
  273. expect(result2.activeOrder.id).toBe(activeOrder.id);
  274. });
  275. describe('shipping', () => {
  276. let shippingMethods: any;
  277. it(
  278. 'setOrderShippingAddress throws with invalid countryCode',
  279. assertThrowsWithMessage(() => {
  280. const address: CreateAddressInput = {
  281. streetLine1: '12 the street',
  282. countryCode: 'INVALID',
  283. };
  284. return client.query(SET_SHIPPING_ADDRESS, {
  285. input: address,
  286. });
  287. }, `The countryCode "INVALID" was not recognized`),
  288. );
  289. it('setOrderShippingAddress sets shipping address', async () => {
  290. const address: CreateAddressInput = {
  291. fullName: 'name',
  292. company: 'company',
  293. streetLine1: '12 the street',
  294. streetLine2: 'line 2',
  295. city: 'foo',
  296. province: 'bar',
  297. postalCode: '123456',
  298. countryCode: 'US',
  299. phoneNumber: '4444444',
  300. };
  301. const result = await client.query(SET_SHIPPING_ADDRESS, {
  302. input: address,
  303. });
  304. expect(result.setOrderShippingAddress.shippingAddress).toEqual({
  305. fullName: 'name',
  306. company: 'company',
  307. streetLine1: '12 the street',
  308. streetLine2: 'line 2',
  309. city: 'foo',
  310. province: 'bar',
  311. postalCode: '123456',
  312. country: 'United States of America',
  313. phoneNumber: '4444444',
  314. });
  315. });
  316. it('eligibleShippingMethods lists shipping methods', async () => {
  317. const result = await client.query(GET_ELIGIBLE_SHIPPING_METHODS);
  318. shippingMethods = result.eligibleShippingMethods;
  319. expect(shippingMethods).toEqual([
  320. { id: 'T_1', price: 500, description: 'Standard Shipping' },
  321. { id: 'T_2', price: 1000, description: 'Express Shipping' },
  322. ]);
  323. });
  324. it('shipping is initially unset', async () => {
  325. const result = await client.query(GET_ACTIVE_ORDER);
  326. expect(result.activeOrder.shipping).toEqual(0);
  327. expect(result.activeOrder.shippingMethod).toEqual(null);
  328. });
  329. it('setOrderShippingMethod sets the shipping method', async () => {
  330. const result = await client.query(SET_SHIPPING_METHOD, {
  331. id: shippingMethods[1].id,
  332. });
  333. const activeOrderResult = await client.query(GET_ACTIVE_ORDER);
  334. const order = activeOrderResult.activeOrder;
  335. expect(order.shipping).toBe(shippingMethods[1].price);
  336. expect(order.shippingMethod.id).toBe(shippingMethods[1].id);
  337. expect(order.shippingMethod.description).toBe(shippingMethods[1].description);
  338. });
  339. it('shipping method is preserved after adjustItemQuantity', async () => {
  340. const activeOrderResult = await client.query(GET_ACTIVE_ORDER);
  341. activeOrder = activeOrderResult.activeOrder;
  342. const result = await client.query(ADJUST_ITEM_QUENTITY, {
  343. orderItemId: activeOrder.lines[0].id,
  344. quantity: 10,
  345. });
  346. expect(result.adjustItemQuantity.shipping).toBe(shippingMethods[1].price);
  347. expect(result.adjustItemQuantity.shippingMethod.id).toBe(shippingMethods[1].id);
  348. expect(result.adjustItemQuantity.shippingMethod.description).toBe(
  349. shippingMethods[1].description,
  350. );
  351. });
  352. });
  353. describe('payment', () => {
  354. it(
  355. 'attempting add a Payment throws error when in AddingItems state',
  356. assertThrowsWithMessage(
  357. () =>
  358. client.query(ADD_PAYMENT, {
  359. input: {
  360. method: testPaymentMethod.code,
  361. metadata: {},
  362. },
  363. }),
  364. `A Payment may only be added when Order is in "ArrangingPayment" state`,
  365. ),
  366. );
  367. it('transitions to the ArrangingPayment state', async () => {
  368. const result = await client.query(TRANSITION_TO_STATE, { state: 'ArrangingPayment' });
  369. expect(result.transitionOrderToState).toEqual({
  370. id: activeOrder.id,
  371. state: 'ArrangingPayment',
  372. });
  373. });
  374. it(
  375. 'attempting to add an item throws error when in ArrangingPayment state',
  376. assertThrowsWithMessage(
  377. () =>
  378. client.query(ADD_ITEM_TO_ORDER, {
  379. productVariantId: 'T_4',
  380. quantity: 1,
  381. }),
  382. `Order contents may only be modified when in the "AddingItems" state`,
  383. ),
  384. );
  385. it(
  386. 'attempting to modify item quantity throws error when in ArrangingPayment state',
  387. assertThrowsWithMessage(
  388. () =>
  389. client.query(ADJUST_ITEM_QUENTITY, {
  390. orderItemId: activeOrder.lines[0].id,
  391. quantity: 12,
  392. }),
  393. `Order contents may only be modified when in the "AddingItems" state`,
  394. ),
  395. );
  396. it(
  397. 'attempting to remove an item throws error when in ArrangingPayment state',
  398. assertThrowsWithMessage(
  399. () =>
  400. client.query(REMOVE_ITEM_FROM_ORDER, {
  401. orderItemId: activeOrder.lines[0].id,
  402. }),
  403. `Order contents may only be modified when in the "AddingItems" state`,
  404. ),
  405. );
  406. it(
  407. 'attempting to setOrderShippingMethod throws error when in ArrangingPayment state',
  408. assertThrowsWithMessage(async () => {
  409. const shippingMethodsResult = await client.query(GET_ELIGIBLE_SHIPPING_METHODS);
  410. const shippingMethods = shippingMethodsResult.eligibleShippingMethods;
  411. return client.query(SET_SHIPPING_METHOD, {
  412. id: shippingMethods[0].id,
  413. });
  414. }, `Order contents may only be modified when in the "AddingItems" state`),
  415. );
  416. it('adds a declined payment', async () => {
  417. const result = await client.query(ADD_PAYMENT, {
  418. input: {
  419. method: testFailingPaymentMethod.code,
  420. metadata: {
  421. foo: 'bar',
  422. },
  423. },
  424. });
  425. const payment = result.addPaymentToOrder.payments[0];
  426. expect(result.addPaymentToOrder.payments.length).toBe(1);
  427. expect(payment.method).toBe(testFailingPaymentMethod.code);
  428. expect(payment.state).toBe('Declined');
  429. expect(payment.transactionId).toBe(null);
  430. expect(payment.metadata).toEqual({
  431. foo: 'bar',
  432. });
  433. });
  434. it('adds a successful payment and transitions Order state', async () => {
  435. const result = await client.query(ADD_PAYMENT, {
  436. input: {
  437. method: testPaymentMethod.code,
  438. metadata: {
  439. baz: 'quux',
  440. },
  441. },
  442. });
  443. const payment = result.addPaymentToOrder.payments[0];
  444. expect(result.addPaymentToOrder.state).toBe('PaymentSettled');
  445. expect(result.addPaymentToOrder.active).toBe(false);
  446. expect(result.addPaymentToOrder.payments.length).toBe(1);
  447. expect(payment.method).toBe(testPaymentMethod.code);
  448. expect(payment.state).toBe('Settled');
  449. expect(payment.transactionId).toBe('12345');
  450. expect(payment.metadata).toEqual({
  451. baz: 'quux',
  452. });
  453. });
  454. });
  455. describe('orderByCode', () => {
  456. describe('immediately after Order is placed', () => {
  457. it('works when authenticated', async () => {
  458. const result = await client.query(GET_ORDER_BY_CODE, {
  459. code: activeOrder.code,
  460. });
  461. expect(result.orderByCode.id).toBe(activeOrder.id);
  462. });
  463. it('works when anonymous', async () => {
  464. await client.asAnonymousUser();
  465. const result = await client.query(GET_ORDER_BY_CODE, {
  466. code: activeOrder.code,
  467. });
  468. expect(result.orderByCode.id).toBe(activeOrder.id);
  469. });
  470. it(
  471. `throws error for another user's Order`,
  472. assertThrowsWithMessage(async () => {
  473. authenticatedUserEmailAddress = customers[1].emailAddress;
  474. await client.asUserWithCredentials(authenticatedUserEmailAddress, password);
  475. return client.query(GET_ORDER_BY_CODE, {
  476. code: activeOrder.code,
  477. });
  478. }, `You are not currently authorized to perform this action`),
  479. );
  480. });
  481. });
  482. });
  483. });
  484. const testPaymentMethod = new PaymentMethodHandler({
  485. code: 'test-payment-method',
  486. name: 'Test Payment Method',
  487. args: {},
  488. createPayment: (order, args, metadata) => {
  489. return {
  490. amount: order.total,
  491. state: 'Settled',
  492. transactionId: '12345',
  493. metadata,
  494. };
  495. },
  496. });
  497. const testFailingPaymentMethod = new PaymentMethodHandler({
  498. code: 'test-failing-payment-method',
  499. name: 'Test Failing Payment Method',
  500. args: {},
  501. createPayment: (order, args, metadata) => {
  502. return {
  503. amount: order.total,
  504. state: 'Declined',
  505. metadata,
  506. };
  507. },
  508. });
  509. const TEST_ORDER_FRAGMENT = gql`
  510. fragment TestOrderFragment on Order {
  511. id
  512. code
  513. state
  514. active
  515. lines {
  516. id
  517. quantity
  518. productVariant {
  519. id
  520. }
  521. }
  522. shipping
  523. shippingMethod {
  524. id
  525. code
  526. description
  527. }
  528. }
  529. `;
  530. const GET_ACTIVE_ORDER = gql`
  531. query {
  532. activeOrder {
  533. ...TestOrderFragment
  534. }
  535. }
  536. ${TEST_ORDER_FRAGMENT}
  537. `;
  538. const ADD_ITEM_TO_ORDER = gql`
  539. mutation AddItemToOrder($productVariantId: ID!, $quantity: Int!) {
  540. addItemToOrder(productVariantId: $productVariantId, quantity: $quantity) {
  541. ...TestOrderFragment
  542. }
  543. }
  544. ${TEST_ORDER_FRAGMENT}
  545. `;
  546. const ADJUST_ITEM_QUENTITY = gql`
  547. mutation AdjustItemQuantity($orderItemId: ID!, $quantity: Int!) {
  548. adjustItemQuantity(orderItemId: $orderItemId, quantity: $quantity) {
  549. ...TestOrderFragment
  550. }
  551. }
  552. ${TEST_ORDER_FRAGMENT}
  553. `;
  554. const REMOVE_ITEM_FROM_ORDER = gql`
  555. mutation RemoveItemFromOrder($orderItemId: ID!) {
  556. removeItemFromOrder(orderItemId: $orderItemId) {
  557. ...TestOrderFragment
  558. }
  559. }
  560. ${TEST_ORDER_FRAGMENT}
  561. `;
  562. const GET_NEXT_STATES = gql`
  563. query {
  564. nextOrderStates
  565. }
  566. `;
  567. const TRANSITION_TO_STATE = gql`
  568. mutation TransitionToState($state: String!) {
  569. transitionOrderToState(state: $state) {
  570. id
  571. state
  572. }
  573. }
  574. `;
  575. const GET_ELIGIBLE_SHIPPING_METHODS = gql`
  576. query {
  577. eligibleShippingMethods {
  578. id
  579. price
  580. description
  581. }
  582. }
  583. `;
  584. const SET_SHIPPING_ADDRESS = gql`
  585. mutation SetShippingAddress($input: CreateAddressInput!) {
  586. setOrderShippingAddress(input: $input) {
  587. shippingAddress {
  588. fullName
  589. company
  590. streetLine1
  591. streetLine2
  592. city
  593. province
  594. postalCode
  595. country
  596. phoneNumber
  597. }
  598. }
  599. }
  600. `;
  601. const SET_SHIPPING_METHOD = gql`
  602. mutation SetShippingMethod($id: ID!) {
  603. setOrderShippingMethod(shippingMethodId: $id) {
  604. shipping
  605. shippingMethod {
  606. id
  607. code
  608. description
  609. }
  610. }
  611. }
  612. `;
  613. const ADD_PAYMENT = gql`
  614. mutation AddPaymentToOrder($input: PaymentInput!) {
  615. addPaymentToOrder(input: $input) {
  616. ...TestOrderFragment
  617. payments {
  618. id
  619. transactionId
  620. method
  621. amount
  622. state
  623. metadata
  624. }
  625. }
  626. }
  627. ${TEST_ORDER_FRAGMENT}
  628. `;
  629. const SET_CUSTOMER = gql`
  630. mutation SetCustomerForOrder($input: CreateCustomerInput!) {
  631. setCustomerForOrder(input: $input) {
  632. id
  633. customer {
  634. id
  635. emailAddress
  636. firstName
  637. lastName
  638. }
  639. }
  640. }
  641. `;
  642. const GET_ORDER_BY_CODE = gql`
  643. query GetOrderByCode($code: String!) {
  644. orderByCode(code: $code) {
  645. ...TestOrderFragment
  646. }
  647. }
  648. ${TEST_ORDER_FRAGMENT}
  649. `;