🐛 Fixed First Promoter always showing Active (#20010)

ref https://github.com/TryGhost/Ghost/issues/19797

- Fixed FirstPromoter always showing Active in Integration Settings list
- This was due to the position of the variable in the array being in the
wrong positon and indexed incorrectly.
- Added additional testing to avoid it from cropping up again.
This commit is contained in:
Ronald Langeveld 2024-04-11 13:09:12 +08:00 committed by GitHub
parent a788a9673c
commit d12b79e036
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 52 additions and 4 deletions

View File

@ -81,7 +81,13 @@ const BuiltInIntegrations: React.FC = () => {
const pinturaEditor = usePinturaEditor();
const {settings} = useGlobalData();
const [ampEnabled, unsplashEnabled, firstPromoterEnabled, slackUrl, slackUsername] = getSettingValues<boolean>(settings, ['amp', 'unsplash', 'pintura', 'firstpromoter', 'slack_url', 'slack_username']);
const [ampEnabled, unsplashEnabled, firstPromoterEnabled, slackUrl, slackUsername] = getSettingValues<boolean>(settings, [
'amp',
'unsplash',
'firstpromoter',
'slack_url',
'slack_username'
]);
return (
<List titleSeparator={false}>
@ -102,6 +108,7 @@ const BuiltInIntegrations: React.FC = () => {
active={slackUrl && slackUsername}
detail='A messaging app for teams'
icon={<SlackIcon className='h-8 w-8' />}
testId='slack-integration'
title='Slack' />
<IntegrationItem
@ -111,6 +118,7 @@ const BuiltInIntegrations: React.FC = () => {
active={ampEnabled}
detail='Google AMP will be removed in Ghost 6.0'
icon={<AmpIcon className='h-8 w-8' />}
testId='amp-integration'
title='AMP' />
<IntegrationItem
@ -120,6 +128,7 @@ const BuiltInIntegrations: React.FC = () => {
active={unsplashEnabled}
detail='Beautiful, free photos'
icon={<UnsplashIcon className='h-8 w-8' />}
testId='unsplash-integration'
title='Unsplash' />
<IntegrationItem
@ -129,6 +138,7 @@ const BuiltInIntegrations: React.FC = () => {
active={firstPromoterEnabled}
detail='Launch your member referral program'
icon={<FirstPromoterIcon className='h-8 w-8' />}
testId='firstpromoter-integration'
title='FirstPromoter' />
<IntegrationItem
@ -136,9 +146,10 @@ const BuiltInIntegrations: React.FC = () => {
openModal('integrations/pintura');
}}
active={pinturaEditor.isEnabled}
detail='Advanced image editing' icon=
{<PinturaIcon className='h-8 w-8' />} title
='Pintura' />
detail='Advanced image editing'
icon={<PinturaIcon className='h-8 w-8' />}
testId='pintura-integration'
title='Pintura' />
</List>
);
};

View File

@ -0,0 +1,37 @@
import {expect, test} from '@playwright/test';
import {globalDataRequests} from '../../../utils/acceptance';
import {mockApi, responseFixtures} from '@tryghost/admin-x-framework/test/acceptance';
test.describe('Integrations List', async () => {
// This is a test for the integrations list, which is a list of integrations that can be toggled on and off
// To ensure the app logic shows the correct initial state, all integrations are disabled by default, except for Unsplash
test('Only Unsplash Shows Active on initial new setup', async ({page}) => {
await mockApi({page, requests: {
...globalDataRequests,
getSettingValue: {method: 'GET', path: '/settings/', response: responseFixtures.settings}
}});
await page.goto('/');
const section = page.getByTestId('integrations');
// const zapierElement = await section.getByText('Zapier').last();
const zapierElement = section.getByTestId('zapier-integration');
const slackElement = section.getByTestId('slack-integration');
const ampElement = section.getByTestId('amp-integration');
const unsplashElement = section.getByTestId('unsplash-integration');
const firstPromoterElement = section.getByTestId('firstpromoter-integration');
const pinturaElement = section.getByTestId('pintura-integration');
const zapierStatus = await zapierElement.getByText('Active');
const slackStatus = await slackElement.getByText('Active');
const ampStatus = await ampElement.getByText('Active');
const unsplashStatus = await unsplashElement.getByText('Active');
const firstPromoterStatus = await firstPromoterElement.getByText('Active');
const pinturaStatus = await pinturaElement.getByText('Active');
expect(await zapierStatus.isVisible()).toBe(false);
expect(await slackStatus.isVisible()).toBe(false);
expect(await ampStatus.isVisible()).toBe(false);
expect(await unsplashStatus.isVisible()).toBe(true); // Unsplash is the only active integration
expect(await firstPromoterStatus.isVisible()).toBe(false);
expect(await pinturaStatus.isVisible()).toBe(false);
});
});