fix(payments-legacy): support cms localization

Because:

- Legacy mapper was not using localization data from the CMS

This commit:

- Updated legacy mapper to utilize localization data.

Closes #FXA-10436
This commit is contained in:
Reino Muhl 2024-09-20 14:53:09 -04:00
Родитель 811374e473
Коммит b5a67cef1d
Не найден ключ, соответствующий данной подписи
4 изменённых файлов: 56 добавлений и 16 удалений

Просмотреть файл

@ -147,8 +147,9 @@ describe('StripeMapperService', () => {
expect(nonMatchingPlans[0].split(' - ')[1]).toBe('webIconURL');
});
it('should return data from cms', async () => {
it('should return data from cms default locale if no localization data is available', async () => {
const expected = PurchaseWithDetailsOfferingContentTransformedFactory();
expected.purchaseDetails.data.attributes.localizations.data = [];
mockCMSConfigUtil.transformedPurchaseWithCommonContentForPlanId.mockReturnValueOnce(
expected
);
@ -178,6 +179,39 @@ describe('StripeMapperService', () => {
expect(nonMatchingPlans).toHaveLength(0);
});
it('should return data from cms for locale when available', async () => {
const expected = PurchaseWithDetailsOfferingContentTransformedFactory();
mockCMSConfigUtil.transformedPurchaseWithCommonContentForPlanId.mockReturnValueOnce(
expected
);
const productMetadata = {
productSet: 'set',
productOrder: 'order',
};
const stripePlan = StripePlanFactory() as Stripe.Plan;
stripePlan.product = StripeProductFactory({
metadata: productMetadata,
});
const { mappedPlans, nonMatchingPlans } =
await stripeMapper.mapCMSToStripePlans([stripePlan], 'en', false);
const actualProduct = mappedPlans[0].product as Stripe.Product;
expect(mappedPlans[0].metadata?.['webIconURL']).toBe(
expected.purchaseDetails.data.attributes.localizations.data[0]
.attributes.webIcon
);
expect(actualProduct.metadata?.['webIconURL']).toBe(
expected.purchaseDetails.data.attributes.localizations.data[0]
.attributes.webIcon
);
expect(actualProduct.metadata?.['productSet']).toBe(
productMetadata.productSet
);
expect(actualProduct.metadata?.['productOrder']).toBe(
productMetadata.productOrder
);
expect(nonMatchingPlans).toHaveLength(0);
});
it('should return data from CMS and not error on locale plan', async () => {
const expected = PurchaseWithDetailsOfferingContentTransformedFactory({
purchaseDetails: {

Просмотреть файл

@ -95,13 +95,23 @@ export class StripeMapperService {
continue;
}
const commonContent =
cmsConfigData.offering.data.attributes.commonContent;
const purchaseDetails = cmsConfigData.purchaseDetails;
const commonContentAttributes =
cmsConfigData.offering.data.attributes.commonContent.data.attributes;
const commonContentAttributesLocalized = commonContentAttributes
.localizations.data.length
? commonContentAttributes.localizations.data[0].attributes
: commonContentAttributes;
const purchaseDetailsAttributes =
cmsConfigData.purchaseDetails.data.attributes;
const purchaseDetailsLocalizedAttributes = purchaseDetailsAttributes
.localizations.data.length
? purchaseDetailsAttributes.localizations.data[0].attributes
: purchaseDetailsAttributes;
const planMapper = new PlanMapperUtil(
commonContent.data.attributes,
purchaseDetails.data.attributes,
commonContentAttributesLocalized,
purchaseDetailsLocalizedAttributes,
mergedStripeMetadata,
cmsEnabled
);

Просмотреть файл

@ -148,6 +148,7 @@ async function run(config) {
const strapiClient = new StrapiClient(strapiClientConfig, firestore);
const productConfigurationManager = new ProductConfigurationManager(
strapiClient,
priceManager,
statsd
);
Container.set(ProductConfigurationManager, productConfigurationManager);

Просмотреть файл

@ -50,7 +50,6 @@ const {
const {
ProductConfigurationManager,
PurchaseWithDetailsOfferingContentTransformedFactory,
PurchaseDetailsTransformedFactory,
} = require('@fxa/shared/cms');
const customer1 = require('./fixtures/stripe/customer1.json');
@ -3426,15 +3425,11 @@ describe('#integration - StripeHelper', () => {
const newWebIconURL = 'http://strapi.example/webicon';
const mockCMSConfigUtil = {
transformedPurchaseWithCommonContentForPlanId: (planId) => {
return PurchaseWithDetailsOfferingContentTransformedFactory({
purchaseDetails: {
data: {
attributes: PurchaseDetailsTransformedFactory({
webIcon: newWebIconURL,
}),
},
},
});
const mockValue =
PurchaseWithDetailsOfferingContentTransformedFactory();
mockValue.purchaseDetails.data.attributes.webIcon = newWebIconURL;
mockValue.purchaseDetails.data.attributes.localizations.data = [];
return mockValue;
},
};
const mockProductConfigurationManager = {