From ca6f30bb2c55b117546f5e1fcd253509e5a7bac6 Mon Sep 17 00:00:00 2001 From: Erik Kieckhafer Date: Fri, 4 Oct 2019 14:56:23 -0700 Subject: [PATCH 1/4] refactor: move getPaymentMethodConfigByName to context Signed-off-by: Erik Kieckhafer --- .../payments/mutations/captureOrderPayments.js | 3 +-- .../queries/getPaymentMethodConfigByName.js | 14 ++++++++++++++ .../core-services/payments/queries/index.js | 2 ++ .../core-services/payments/registration.js | 13 ------------- .../server/no-meteor/mutations/createRefund.js | 3 +-- .../server/no-meteor/mutations/placeOrder.js | 3 +-- .../orders/server/no-meteor/queries/refunds.js | 3 +-- .../server/no-meteor/queries/refundsByPaymentId.js | 3 +-- .../server/no-meteor/util/getDataForOrderEmail.js | 3 +-- 9 files changed, 22 insertions(+), 25 deletions(-) create mode 100644 imports/node-app/core-services/payments/queries/getPaymentMethodConfigByName.js diff --git a/imports/node-app/core-services/payments/mutations/captureOrderPayments.js b/imports/node-app/core-services/payments/mutations/captureOrderPayments.js index 23e925a151e..94427d7ac0a 100644 --- a/imports/node-app/core-services/payments/mutations/captureOrderPayments.js +++ b/imports/node-app/core-services/payments/mutations/captureOrderPayments.js @@ -1,6 +1,5 @@ import ReactionError from "@reactioncommerce/reaction-error"; import SimpleSchema from "simpl-schema"; -import { getPaymentMethodConfigByName } from "../registration.js"; const inputSchema = new SimpleSchema({ orderId: String, @@ -53,7 +52,7 @@ export default async function captureOrderPayments(context, input = {}) { const capturePromises = orderPaymentsToCapture.map(async (payment) => { let result = { saved: false }; try { - result = await getPaymentMethodConfigByName(payment.name).functions.capturePayment(context, payment); + result = await context.queries.getPaymentMethodConfigByName(payment.name).functions.capturePayment(context, payment); } catch (error) { result.error = error; result.errorCode = "uncaught_plugin_error"; diff --git a/imports/node-app/core-services/payments/queries/getPaymentMethodConfigByName.js b/imports/node-app/core-services/payments/queries/getPaymentMethodConfigByName.js new file mode 100644 index 00000000000..70c1a15f8c2 --- /dev/null +++ b/imports/node-app/core-services/payments/queries/getPaymentMethodConfigByName.js @@ -0,0 +1,14 @@ +const paymentMethods = {}; + +/** + * @name getPaymentMethodConfigByName + * @param {String} name payment method name, e.g. example, stripe_card + * @returns {Object} payment method configuration + */ +export default function getPaymentMethodConfigByName(name) { + const config = paymentMethods[name]; + if (!config) { + throw new Error(`Configuration not found for ${name} payment method. Did you remove the plugin that provides this payment method?`); + } + return config; +} diff --git a/imports/node-app/core-services/payments/queries/index.js b/imports/node-app/core-services/payments/queries/index.js index 69750c7ca4e..139172961b3 100644 --- a/imports/node-app/core-services/payments/queries/index.js +++ b/imports/node-app/core-services/payments/queries/index.js @@ -1,7 +1,9 @@ import availablePaymentMethods from "./availablePaymentMethods.js"; +import getPaymentMethodConfigByName from "./getPaymentMethodConfigByName.js"; import paymentMethods from "./paymentMethods.js"; export default { availablePaymentMethods, + getPaymentMethodConfigByName, paymentMethods }; diff --git a/imports/node-app/core-services/payments/registration.js b/imports/node-app/core-services/payments/registration.js index 0793c6a6ad9..68c16e42c95 100644 --- a/imports/node-app/core-services/payments/registration.js +++ b/imports/node-app/core-services/payments/registration.js @@ -12,16 +12,3 @@ export function registerPluginHandler({ name: pluginName, paymentMethods: plugin } } } - -/** - * @name getPaymentMethodConfigByName - * @param {String} name payment method name, e.g. example, stripe_card - * @returns {Object} payment method configuration - */ -export function getPaymentMethodConfigByName(name) { - const config = paymentMethods[name]; - if (!config) { - throw new Error(`Configuration not found for ${name} payment method. Did you remove the plugin that provides this payment method?`); - } - return config; -} diff --git a/imports/plugins/core/orders/server/no-meteor/mutations/createRefund.js b/imports/plugins/core/orders/server/no-meteor/mutations/createRefund.js index 81c64006936..be8be070433 100644 --- a/imports/plugins/core/orders/server/no-meteor/mutations/createRefund.js +++ b/imports/plugins/core/orders/server/no-meteor/mutations/createRefund.js @@ -2,7 +2,6 @@ import SimpleSchema from "simpl-schema"; import accounting from "accounting-js"; import Logger from "@reactioncommerce/logger"; import ReactionError from "@reactioncommerce/reaction-error"; -import { getPaymentMethodConfigByName } from "/imports/node-app/core-services/payments/registration.js"; // TODO: remove cross-plugin import (https://github.com/reactioncommerce/reaction/issues/5653) import sendOrderEmail from "../util/sendOrderEmail"; const inputSchema = new SimpleSchema({ @@ -60,7 +59,7 @@ export default async function createRefund(context, input) { // Verify that payment method will accept refunds const { name } = payment; - const { canRefund, functions } = getPaymentMethodConfigByName(name); + const { canRefund, functions } = context.queries.getPaymentMethodConfigByName(name); if (!canRefund) throw new ReactionError("invalid", "Refunding not supported"); // Find total of any previous refunds, and determine how much balance is left diff --git a/imports/plugins/core/orders/server/no-meteor/mutations/placeOrder.js b/imports/plugins/core/orders/server/no-meteor/mutations/placeOrder.js index 3116782a245..efa2f36baeb 100644 --- a/imports/plugins/core/orders/server/no-meteor/mutations/placeOrder.js +++ b/imports/plugins/core/orders/server/no-meteor/mutations/placeOrder.js @@ -6,7 +6,6 @@ import ReactionError from "@reactioncommerce/reaction-error"; import { getAnonymousAccessToken } from "../util/anonymousToken"; import appEvents from "/imports/node-app/core/util/appEvents"; import { Order as OrderSchema, Payment as PaymentSchema } from "/imports/collections/schemas"; -import { getPaymentMethodConfigByName } from "/imports/node-app/core-services/payments/registration.js"; // TODO: remove cross-plugin import (https://github.com/reactioncommerce/reaction/issues/5653) import buildOrderFulfillmentGroupFromInput from "../util/buildOrderFulfillmentGroupFromInput"; import verifyPaymentsMatchOrderTotal from "../../util/verifyPaymentsMatchOrderTotal"; import { orderInputSchema, paymentInputSchema } from "../simpleSchemas"; @@ -111,7 +110,7 @@ async function createPayments({ // Grab config for this payment method let paymentMethodConfig; try { - paymentMethodConfig = getPaymentMethodConfigByName(methodName); + paymentMethodConfig = context.queries.getPaymentMethodConfigByName(methodName); } catch (error) { Logger.error(error); throw new ReactionError("payment-failed", `Invalid payment method name: ${methodName}`); diff --git a/imports/plugins/core/orders/server/no-meteor/queries/refunds.js b/imports/plugins/core/orders/server/no-meteor/queries/refunds.js index d1aa188bf3e..bc81ade193b 100644 --- a/imports/plugins/core/orders/server/no-meteor/queries/refunds.js +++ b/imports/plugins/core/orders/server/no-meteor/queries/refunds.js @@ -1,5 +1,4 @@ import ReactionError from "@reactioncommerce/reaction-error"; -import { getPaymentMethodConfigByName } from "/imports/node-app/core-services/payments/registration.js"; // TODO: remove cross-plugin import (https://github.com/reactioncommerce/reaction/issues/5653) import { getOrderQuery } from "../util/getOrderQuery"; /** @@ -30,7 +29,7 @@ export default async function refunds(context, { orderId, shopId, token } = {}) if (Array.isArray(order.payments)) { const shopRefundsWithPaymentPromises = order.payments.map((payment) => - getPaymentMethodConfigByName(payment.name) + context.queries.getPaymentMethodConfigByName(payment.name) .functions.listRefunds(context, payment) .then((shopRefunds) => ({ shopRefunds, payment }))); diff --git a/imports/plugins/core/orders/server/no-meteor/queries/refundsByPaymentId.js b/imports/plugins/core/orders/server/no-meteor/queries/refundsByPaymentId.js index 6753f96ade0..6f5917b933b 100644 --- a/imports/plugins/core/orders/server/no-meteor/queries/refundsByPaymentId.js +++ b/imports/plugins/core/orders/server/no-meteor/queries/refundsByPaymentId.js @@ -1,5 +1,4 @@ import ReactionError from "@reactioncommerce/reaction-error"; -import { getPaymentMethodConfigByName } from "/imports/node-app/core-services/payments/registration.js"; // TODO: remove cross-plugin import (https://github.com/reactioncommerce/reaction/issues/5653) import { getOrderQuery } from "../util/getOrderQuery"; /** @@ -39,7 +38,7 @@ export default async function refundsByPaymentId(context, { orderId, paymentId, throw new ReactionError("not-found", "Payment not found"); } - const shopRefunds = await getPaymentMethodConfigByName(payment.name).functions.listRefunds(context, payment); + const shopRefunds = await context.queries.getPaymentMethodConfigByName(payment.name).functions.listRefunds(context, payment); const shopRefundsWithPaymentId = shopRefunds.map((shopRefund) => ({ ...shopRefund, paymentId: payment._id, diff --git a/imports/plugins/core/orders/server/no-meteor/util/getDataForOrderEmail.js b/imports/plugins/core/orders/server/no-meteor/util/getDataForOrderEmail.js index 1cf2f8a51d7..5c456b48ccc 100644 --- a/imports/plugins/core/orders/server/no-meteor/util/getDataForOrderEmail.js +++ b/imports/plugins/core/orders/server/no-meteor/util/getDataForOrderEmail.js @@ -1,7 +1,6 @@ import _ from "lodash"; import { xformOrderItems } from "@reactioncommerce/reaction-graphql-xforms/order"; import formatMoney from "/imports/utils/formatMoney"; -import { getPaymentMethodConfigByName } from "/imports/node-app/core-services/payments/registration.js"; // TODO: remove cross-plugin import (https://github.com/reactioncommerce/reaction/issues/5653) import { addAnonymousOrderToken } from "./anonymousToken"; /** @@ -78,7 +77,7 @@ export default async function getDataForOrderEmail(context, { order }) { if (Array.isArray(order.payments)) { const promises = order.payments.map(async (payment) => { - const shopRefunds = await getPaymentMethodConfigByName(payment.name).functions.listRefunds(context, payment); + const shopRefunds = await context.queries.getPaymentMethodConfigByName(payment.name).functions.listRefunds(context, payment); const shopRefundsWithPaymentId = shopRefunds.map((shopRefund) => ({ ...shopRefund, paymentId: payment._id })); refunds.push(...shopRefundsWithPaymentId); }); From 00aea7e3a821783240611a202c3c6afff80e247b Mon Sep 17 00:00:00 2001 From: Erik Kieckhafer Date: Fri, 4 Oct 2019 15:24:12 -0700 Subject: [PATCH 2/4] style: remove extraneous todo Signed-off-by: Erik Kieckhafer --- imports/node-app/core-services/product/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imports/node-app/core-services/product/index.js b/imports/node-app/core-services/product/index.js index df39c2c917a..01bb9305c04 100644 --- a/imports/node-app/core-services/product/index.js +++ b/imports/node-app/core-services/product/index.js @@ -5,7 +5,7 @@ import { Product, ProductVariant, VariantMedia -} from "./simpleSchemas.js"; // TODO: update simpleschemas +} from "./simpleSchemas.js"; /** * @summary Import and call this function to add this plugin to your API. From 681b176d13006c50f6cd33ae2dc74f5e723c94b7 Mon Sep 17 00:00:00 2001 From: Erik Kieckhafer Date: Mon, 7 Oct 2019 11:12:37 -0700 Subject: [PATCH 3/4] refactor: get paymentMethods object from registration file Signed-off-by: Erik Kieckhafer --- .../payments/queries/getPaymentMethodConfigByName.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imports/node-app/core-services/payments/queries/getPaymentMethodConfigByName.js b/imports/node-app/core-services/payments/queries/getPaymentMethodConfigByName.js index 70c1a15f8c2..7d9d66e469b 100644 --- a/imports/node-app/core-services/payments/queries/getPaymentMethodConfigByName.js +++ b/imports/node-app/core-services/payments/queries/getPaymentMethodConfigByName.js @@ -1,4 +1,4 @@ -const paymentMethods = {}; +import { paymentMethods } from "../registration.js"; /** * @name getPaymentMethodConfigByName From 71d28abe1587ee1ec64070b882e9ad9c922c13a9 Mon Sep 17 00:00:00 2001 From: Erik Kieckhafer Date: Mon, 7 Oct 2019 13:22:09 -0700 Subject: [PATCH 4/4] tests: update tests with new context getPaymentMethodConfigByName Signed-off-by: Erik Kieckhafer --- .../orders/queries/refunds.test.js | 25 ++++++++----------- .../orders/queries/refundsByPaymentId.test.js | 25 ++++++++----------- .../orders/util/getDataForOrderEmail.test.js | 22 ++++++++-------- 3 files changed, 34 insertions(+), 38 deletions(-) diff --git a/imports/node-app/core-services/orders/queries/refunds.test.js b/imports/node-app/core-services/orders/queries/refunds.test.js index 7b518decf70..74bad7e71b2 100644 --- a/imports/node-app/core-services/orders/queries/refunds.test.js +++ b/imports/node-app/core-services/orders/queries/refunds.test.js @@ -1,23 +1,20 @@ /* eslint camelcase: 0 */ import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js"; -import { rewire$getPaymentMethodConfigByName } from "/imports/node-app/core-services/payments/registration.js"; // TODO: remove cross-plugin import (https://github.com/reactioncommerce/reaction/issues/5653) import refunds from "./refunds.js"; -beforeAll(() => { - rewire$getPaymentMethodConfigByName(() => ({ - functions: { - listRefunds: async () => [{ - _id: "refundId", - type: "refund", - amount: 19.99, - currency: "usd" - }] - } - })); -}); +mockContext.queries.getPaymentMethodConfigByName = jest.fn().mockName("getPaymentMethodConfigByName").mockImplementation(() => ({ + functions: { + listRefunds: async () => [{ + _id: "refundId", + type: "refund", + amount: 19.99, + currency: "usd" + }] + } +})); beforeEach(() => { - jest.resetAllMocks(); + jest.clearAllMocks(); }); const order = { diff --git a/imports/node-app/core-services/orders/queries/refundsByPaymentId.test.js b/imports/node-app/core-services/orders/queries/refundsByPaymentId.test.js index 4a4d48d39fc..ea031261d5d 100644 --- a/imports/node-app/core-services/orders/queries/refundsByPaymentId.test.js +++ b/imports/node-app/core-services/orders/queries/refundsByPaymentId.test.js @@ -1,23 +1,20 @@ /* eslint camelcase: 0 */ import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js"; -import { rewire$getPaymentMethodConfigByName } from "/imports/node-app/core-services/payments/registration.js"; // TODO: remove cross-plugin import (https://github.com/reactioncommerce/reaction/issues/5653) import refundsByPaymentId from "./refundsByPaymentId.js"; -beforeAll(() => { - rewire$getPaymentMethodConfigByName(() => ({ - functions: { - listRefunds: () => [{ - _id: "refundId", - type: "refund", - amount: 19.99, - currency: "usd" - }] - } - })); -}); +mockContext.queries.getPaymentMethodConfigByName = jest.fn().mockName("getPaymentMethodConfigByName").mockImplementation(() => ({ + functions: { + listRefunds: async () => [{ + _id: "refundId", + type: "refund", + amount: 19.99, + currency: "usd" + }] + } +})); beforeEach(() => { - jest.resetAllMocks(); + jest.clearAllMocks(); }); const order = { diff --git a/imports/node-app/core-services/orders/util/getDataForOrderEmail.test.js b/imports/node-app/core-services/orders/util/getDataForOrderEmail.test.js index bc1937e04d7..abc5f13f9e6 100644 --- a/imports/node-app/core-services/orders/util/getDataForOrderEmail.test.js +++ b/imports/node-app/core-services/orders/util/getDataForOrderEmail.test.js @@ -1,19 +1,21 @@ /* eslint-disable require-jsdoc */ import mockContext from "@reactioncommerce/api-utils/tests/mockContext.js"; import Factory from "/imports/test-utils/helpers/factory"; // TODO: remove cross-plugin import (https://github.com/reactioncommerce/reaction/issues/5653) -import { restore, rewire$getPaymentMethodConfigByName } from "/imports/node-app/core-services/payments/registration.js"; // TODO: remove cross-plugin import (https://github.com/reactioncommerce/reaction/issues/5653) import getDataForOrderEmail from "./getDataForOrderEmail.js"; -beforeAll(() => { - rewire$getPaymentMethodConfigByName(() => ({ - functions: { - listRefunds: () => [] - } - })); -}); +mockContext.queries.getPaymentMethodConfigByName = jest.fn().mockName("getPaymentMethodConfigByName").mockImplementation(() => ({ + functions: { + listRefunds: async () => [{ + _id: "refundId", + type: "refund", + amount: 19.99, + currency: "usd" + }] + } +})); -afterAll(() => { - restore(); +beforeEach(() => { + jest.clearAllMocks(); }); function setupMocks(mockShop, mockCatalogItem) {