From beb419718511b21c3df7d5e594d09c38629c3f68 Mon Sep 17 00:00:00 2001 From: nfmohit Date: Tue, 18 Feb 2025 03:43:47 +0600 Subject: [PATCH] Add RRM `submitChanges` function. --- .../reader-revenue-manager/datastore/base.js | 3 +- .../datastore/settings.js | 31 +++++ .../datastore/settings.test.js | 122 ++++++++++++++++-- 3 files changed, 144 insertions(+), 12 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/datastore/base.js b/assets/js/modules/reader-revenue-manager/datastore/base.js index 025cc439035..0003ceafb65 100644 --- a/assets/js/modules/reader-revenue-manager/datastore/base.js +++ b/assets/js/modules/reader-revenue-manager/datastore/base.js @@ -21,10 +21,11 @@ */ import Modules from 'googlesitekit-modules'; import { MODULES_READER_REVENUE_MANAGER } from './constants'; -import { validateCanSubmitChanges } from './settings'; +import { submitChanges, validateCanSubmitChanges } from './settings'; export default Modules.createModuleStore( 'reader-revenue-manager', { storeName: MODULES_READER_REVENUE_MANAGER, + submitChanges, validateCanSubmitChanges, ownedSettingsSlugs: [ 'publicationID' ], settingSlugs: [ diff --git a/assets/js/modules/reader-revenue-manager/datastore/settings.js b/assets/js/modules/reader-revenue-manager/datastore/settings.js index 67b2e47f903..8ec2d3b61b2 100644 --- a/assets/js/modules/reader-revenue-manager/datastore/settings.js +++ b/assets/js/modules/reader-revenue-manager/datastore/settings.js @@ -24,6 +24,7 @@ import invariant from 'invariant'; /** * Internal dependencies */ +import API from 'googlesitekit-api'; import { MODULES_READER_REVENUE_MANAGER } from './constants'; import { INVARIANT_DOING_SUBMIT_CHANGES, @@ -128,3 +129,33 @@ export function validateCanSubmitChanges( select ) { ); } } + +export async function submitChanges( { dispatch, select } ) { + const { getSnippetMode, hasSettingChanged, haveSettingsChanged } = select( + MODULES_READER_REVENUE_MANAGER + ); + + if ( haveSettingsChanged() ) { + if ( + isFeatureEnabled( 'rrmModuleV2' ) && + hasSettingChanged( 'postTypes' ) && + 'post_types' !== getSnippetMode() + ) { + await dispatch( MODULES_READER_REVENUE_MANAGER ).rollbackSetting( + 'postTypes' + ); + } + + const { error } = await dispatch( + MODULES_READER_REVENUE_MANAGER + ).saveSettings(); + + if ( error ) { + return { error }; + } + } + + await API.invalidateCache( 'modules', 'reader-revenue-manager' ); + + return {}; +} diff --git a/assets/js/modules/reader-revenue-manager/datastore/settings.test.js b/assets/js/modules/reader-revenue-manager/datastore/settings.test.js index d00245786ce..a33871fa99b 100644 --- a/assets/js/modules/reader-revenue-manager/datastore/settings.test.js +++ b/assets/js/modules/reader-revenue-manager/datastore/settings.test.js @@ -37,6 +37,21 @@ import { describe( 'modules/reader-revenue-manager settings', () => { let registry; + const settingsEndpoint = new RegExp( + '^/google-site-kit/v1/modules/reader-revenue-manager/data/settings' + ); + + const validSettings = { + publicationID: 'ABCDEFGH', + publicationOnboardingState: 'ONBOARDING_ACTION_REQUIRED', + publicationOnboardingStateChanged: false, + snippetMode: 'post_types', + postTypes: [ 'post' ], + productID: 'valid-id', + productIDs: [ 'valid' ], + paymentOption: 'valid-option', + }; + beforeAll( () => { API.setUsingCache( false ); } ); @@ -50,17 +65,6 @@ describe( 'modules/reader-revenue-manager settings', () => { } ); describe( 'validateCanSubmitChanges', () => { - const validSettings = { - publicationID: 'ABCDEFGH', - publicationOnboardingState: 'ONBOARDING_ACTION_REQUIRED', - publicationOnboardingStateChanged: false, - snippetMode: 'post_types', - postTypes: [ 'post' ], - productID: 'valid-id', - productIDs: [ 'valid' ], - paymentOption: 'valid-option', - }; - it( 'should throw invariant error for invalid publication ID of type number', () => { const settings = { ...validSettings, @@ -260,4 +264,100 @@ describe( 'modules/reader-revenue-manager settings', () => { ); } ); } ); + + describe( 'submitChanges', () => { + it( 'should dispatch saveSettings', async () => { + registry + .dispatch( MODULES_READER_REVENUE_MANAGER ) + .setSettings( validSettings ); + + fetchMock.postOnce( settingsEndpoint, { + body: validSettings, + status: 200, + } ); + + await registry + .dispatch( MODULES_READER_REVENUE_MANAGER ) + .submitChanges(); + + expect( fetchMock ).toHaveFetched( settingsEndpoint, { + body: { data: validSettings }, + } ); + + expect( + registry + .select( MODULES_READER_REVENUE_MANAGER ) + .haveSettingsChanged() + ).toBe( false ); + } ); + + describe( 'with "rrmModuleV2" feature flag enabled', () => { + beforeEach( () => { + enabledFeatures.add( 'rrmModuleV2' ); + } ); + + it( 'should save selected post types', async () => { + fetchMock.post( settingsEndpoint, { + body: { + ...validSettings, + snippetMode: 'post_types', + postTypes: [ 'post', 'page' ], + }, + status: 200, + } ); + + registry + .dispatch( MODULES_READER_REVENUE_MANAGER ) + .setSettings( { + ...validSettings, + snippetMode: 'post_types', + postTypes: [ 'post', 'page' ], + } ); + + await registry + .dispatch( MODULES_READER_REVENUE_MANAGER ) + .submitChanges(); + + expect( + registry + .select( MODULES_READER_REVENUE_MANAGER ) + .getPostTypes() + ).toEqual( [ 'post', 'page' ] ); + } ); + + it( 'should not save selected post types for a different snippet mode', async () => { + registry + .dispatch( MODULES_READER_REVENUE_MANAGER ) + .receiveGetSettings( { + ...validSettings, + snippetMode: 'post_types', + postTypes: [ 'post', 'page' ], + } ); + + fetchMock.post( settingsEndpoint, ( url, { body } ) => { + const { data } = JSON.parse( body ); + + return { body: data }; + } ); + + registry + .dispatch( MODULES_READER_REVENUE_MANAGER ) + .setSettings( { + ...validSettings, + snippetMode: 'per_post', + postTypes: [ 'page' ], + } ); + + await registry + .dispatch( MODULES_READER_REVENUE_MANAGER ) + .submitChanges(); + + expect( + registry + .select( MODULES_READER_REVENUE_MANAGER ) + .getPostTypes() + ).toEqual( [ 'post', 'page' ] ); + } ); + } ); + } ); } );