mollie-dev-server.ts 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import { AdminUiPlugin } from '@vendure/admin-ui-plugin';
  2. import {
  3. ChannelService,
  4. DefaultLogger,
  5. DefaultSearchPlugin,
  6. Logger,
  7. LogLevel,
  8. mergeConfig,
  9. OrderService,
  10. PaymentService,
  11. RequestContext,
  12. } from '@vendure/core';
  13. import { createTestEnvironment, registerInitializer, SqljsInitializer, testConfig } from '@vendure/testing';
  14. import gql from 'graphql-tag';
  15. import localtunnel from 'localtunnel';
  16. import path from 'path';
  17. import { initialData } from '../../../e2e-common/e2e-initial-data';
  18. import { MolliePlugin } from '../package/mollie';
  19. import { molliePaymentHandler } from '../package/mollie/mollie.handler';
  20. import { CREATE_PAYMENT_METHOD } from './graphql/admin-queries';
  21. import { CreatePaymentMethod } from './graphql/generated-admin-types';
  22. import { AddItemToOrder } from './graphql/generated-shop-types';
  23. import { ADD_ITEM_TO_ORDER } from './graphql/shop-queries';
  24. import { CREATE_MOLLIE_PAYMENT_INTENT, setShipping } from './payment-helpers';
  25. /**
  26. * This should only be used to locally test the Mollie payment plugin
  27. */
  28. /* eslint-disable @typescript-eslint/no-floating-promises */
  29. async function runMollieDevServer(useDynamicRedirectUrl: boolean) {
  30. console.log('Starting Mollie dev server with dynamic redirectUrl: ', useDynamicRedirectUrl);
  31. // eslint-disable-next-line @typescript-eslint/no-var-requires
  32. require('dotenv').config();
  33. registerInitializer('sqljs', new SqljsInitializer(path.join(__dirname, '__data__')));
  34. const tunnel = await localtunnel({ port: 3050 });
  35. const config = mergeConfig(testConfig, {
  36. plugins: [
  37. ...testConfig.plugins,
  38. DefaultSearchPlugin,
  39. AdminUiPlugin.init({
  40. route: 'admin',
  41. port: 5001,
  42. }),
  43. MolliePlugin.init({ vendureHost: tunnel.url, useDynamicRedirectUrl }),
  44. ],
  45. logger: new DefaultLogger({ level: LogLevel.Debug }),
  46. apiOptions: {
  47. adminApiPlayground: true,
  48. shopApiPlayground: true,
  49. },
  50. });
  51. const { server, shopClient, adminClient } = createTestEnvironment(config as any);
  52. await server.init({
  53. initialData,
  54. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-minimal.csv'),
  55. customerCount: 1,
  56. });
  57. // Set EUR as currency for Mollie
  58. await adminClient.asSuperAdmin();
  59. await adminClient.query(gql`
  60. mutation {
  61. updateChannel(input: { id: "T_1", currencyCode: EUR }) {
  62. __typename
  63. }
  64. }
  65. `);
  66. // Create method
  67. await adminClient.query<CreatePaymentMethod.Mutation, CreatePaymentMethod.Variables>(
  68. CREATE_PAYMENT_METHOD,
  69. {
  70. input: {
  71. code: 'mollie',
  72. name: 'Mollie payment test',
  73. description: 'This is a Mollie test payment method',
  74. enabled: true,
  75. handler: {
  76. code: molliePaymentHandler.code,
  77. arguments: [
  78. { name: 'redirectUrl', value: `${tunnel.url}/admin/orders?filter=open&page=1&dynamicRedirectUrl=false` },
  79. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
  80. { name: 'apiKey', value: process.env.MOLLIE_APIKEY! },
  81. { name: 'autoCapture', value: 'false' },
  82. ],
  83. },
  84. },
  85. },
  86. );
  87. // Prepare order for payment
  88. await shopClient.asUserWithCredentials('hayden.zieme12@hotmail.com', 'test');
  89. await shopClient.query<AddItemToOrder.Order, AddItemToOrder.Variables>(ADD_ITEM_TO_ORDER, {
  90. productVariantId: 'T_5',
  91. quantity: 10,
  92. });
  93. const ctx = new RequestContext({
  94. apiType: 'admin',
  95. isAuthorized: true,
  96. authorizedAsOwnerOnly: false,
  97. channel: await server.app.get(ChannelService).getDefaultChannel(),
  98. });
  99. await server.app.get(OrderService).addSurchargeToOrder(ctx, 1, {
  100. description: 'Negative test surcharge',
  101. listPrice: -20000,
  102. });
  103. await setShipping(shopClient);
  104. // Add pre payment to order
  105. const order = await server.app.get(OrderService).findOne(ctx, 1);
  106. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
  107. await server.app.get(PaymentService).createManualPayment(ctx, order!, 10000, {
  108. method: 'Manual',
  109. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
  110. orderId: order!.id,
  111. metadata: {
  112. bogus: 'test',
  113. },
  114. });
  115. const { createMolliePaymentIntent } = await shopClient.query(CREATE_MOLLIE_PAYMENT_INTENT, {
  116. input: {
  117. redirectUrl: `${tunnel.url}/admin/orders?filter=open&page=1&dynamicRedirectUrl=true`,
  118. paymentMethodCode: 'mollie',
  119. // molliePaymentMethodCode: 'klarnapaylater'
  120. },
  121. });
  122. if (createMolliePaymentIntent.errorCode) {
  123. throw createMolliePaymentIntent;
  124. }
  125. Logger.info(`Mollie payment link: ${createMolliePaymentIntent.url as string}`, 'Mollie DevServer');
  126. }
  127. (async () => {
  128. // Change the value of the parameter to true to test with the dynamic redirectUrl functionality
  129. await runMollieDevServer(false);
  130. })()