From d0cd7f040d51d7a294943933b601345d43de970a Mon Sep 17 00:00:00 2001 From: Ronald Langeveld Date: Fri, 6 Oct 2023 10:52:18 +0700 Subject: [PATCH] Added Recommendations Acceptance tests - Admin X (#18513) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit no issue --- ### 🤖 Generated by Copilot at ebcfe42 This pull request adds acceptance tests for the recommendations feature in the `admin-x-settings` app. It also updates the test utils module to use the appropriate type and fixture for the recommendations API. --- .../acceptance/site/recommendations.test.ts | 61 +++++++++++++++++++ .../admin-x-settings/test/utils/acceptance.ts | 2 + .../test/utils/responses/recommendations.json | 18 ++++++ 3 files changed, 81 insertions(+) create mode 100644 apps/admin-x-settings/test/acceptance/site/recommendations.test.ts create mode 100644 apps/admin-x-settings/test/utils/responses/recommendations.json diff --git a/apps/admin-x-settings/test/acceptance/site/recommendations.test.ts b/apps/admin-x-settings/test/acceptance/site/recommendations.test.ts new file mode 100644 index 0000000000..8f0da644a4 --- /dev/null +++ b/apps/admin-x-settings/test/acceptance/site/recommendations.test.ts @@ -0,0 +1,61 @@ +import {expect, test} from '@playwright/test'; +import {globalDataRequests, mockApi, responseFixtures, toggleLabsFlag} from '../../utils/acceptance'; + +test.describe('Recommendations', async () => { + test.beforeEach(async () => { + toggleLabsFlag('recommendations', true); + }); + test('can add a recommendation', async ({page}) => { + const {lastApiRequests} = await mockApi({page, requests: { + ...globalDataRequests, + // mock the GET url with params + browseRecommendations: {method: 'GET', path: '/recommendations/?filter=url%3A%7E%27example.com%2Fa-cool-website%27&limit=1', response: responseFixtures.recommendations}, + addRecommendation: {method: 'POST', path: '/recommendations/', response: {recommendations: [ + {excerpt: null, + favicon: null, + featured_image: null, + one_click_subscribe: false, + reason: 'This is a cool website', + title: 'example.com', + url: 'https://example.com/a-cool-website'} + ]}} + }}); + await page.goto('/'); + + const section = await page.getByTestId('recommendations'); + + // console.log(section); + await section.getByRole('button', {name: 'Add recommendation'}).click(); + + const modal = page.getByTestId('add-recommendation-modal'); + modal.getByRole('textbox').fill('https://example.com/a-cool-website'); + await modal.getByRole('button', {name: 'Next'}).click(); + modal.getByLabel('SHORT DESCRIPTION').fill('This is a cool website'); + await modal.getByRole('button', {name: 'Add'}).click(); + expect(lastApiRequests.addRecommendation?.body).toEqual({ + recommendations: [ + {excerpt: null, + favicon: null, + featured_image: null, + one_click_subscribe: false, + reason: 'This is a cool website', + title: 'example.com', + url: 'https://example.com/a-cool-website'} + ] + }); + }); + + test('errors when passing an invalid URL', async ({page}) => { + await mockApi({page, requests: { + ...globalDataRequests, + browseRecommendations: {method: 'GET', path: '/recommendations/?filter=url%3A%7E%27example.com%2Fa-cool-website%27&limit=1', response: responseFixtures.recommendations} + }}); + await page.goto('/'); + const section = await page.getByTestId('recommendations'); + await section.getByRole('button', {name: 'Add recommendation'}).click(); + const modal = page.getByTestId('add-recommendation-modal'); + modal.getByRole('textbox').fill('not a real url'); + await modal.getByRole('button', {name: 'Next'}).click(); + await expect(modal).toContainText('Please enter a valid URL.'); + }); +}); diff --git a/apps/admin-x-settings/test/utils/acceptance.ts b/apps/admin-x-settings/test/utils/acceptance.ts index 83c443548a..58f68ec5b5 100644 --- a/apps/admin-x-settings/test/utils/acceptance.ts +++ b/apps/admin-x-settings/test/utils/acceptance.ts @@ -6,6 +6,7 @@ import {LabelsResponseType} from '../../src/api/labels'; import {Locator, Page} from '@playwright/test'; import {NewslettersResponseType} from '../../src/api/newsletters'; import {OffersResponseType} from '../../src/api/offers'; +import {RecommendationResponseType} from '../../src/api/recommendations'; import {RolesResponseType} from '../../src/api/roles'; import {SettingsResponseType} from '../../src/api/settings'; import {SiteResponseType} from '../../src/api/site'; @@ -31,6 +32,7 @@ const siteFixture = JSON.parse(readFileSync(`${__dirname}/responses/site.json`). export const responseFixtures = { settings: JSON.parse(readFileSync(`${__dirname}/responses/settings.json`).toString()) as SettingsResponseType, + recommendations: JSON.parse(readFileSync(`${__dirname}/responses/recommendations.json`).toString()) as RecommendationResponseType, config: JSON.parse(readFileSync(`${__dirname}/responses/config.json`).toString()) as ConfigResponseType, users: JSON.parse(readFileSync(`${__dirname}/responses/users.json`).toString()) as UsersResponseType, me: JSON.parse(readFileSync(`${__dirname}/responses/me.json`).toString()) as UsersResponseType, diff --git a/apps/admin-x-settings/test/utils/responses/recommendations.json b/apps/admin-x-settings/test/utils/responses/recommendations.json new file mode 100644 index 0000000000..76363125e5 --- /dev/null +++ b/apps/admin-x-settings/test/utils/responses/recommendations.json @@ -0,0 +1,18 @@ +{ + "recommendations": { + "id": "21452552", + "title": "Some Recommendation", + "reason": "i like this website", + "excerpt": "this is a great website", + "feature_image": null, + "favicon": null, + "url": "http://www.google.com", + "one_click_subscribe": "false", + "created_at": "2023-10-28T20:00:00.000Z", + "updated_at": "2023-10-30T20:00:00.000Z", + "count": { + "impressions": 30, + "subscriptions": 3 + } + } +}