From 2dcb3b42a5cb50f840e455bdd52873715b4d3d48 Mon Sep 17 00:00:00 2001
From: Ilia <kzerby@gmail.com>
Date: Fri, 18 Apr 2025 11:56:58 -0600
Subject: [PATCH] Fix feed test.

---
 cypress/e2e/atk_feeds/atk_feeds.cy.js      |  64 ++++++---
 module_support/cypress.atk.config.js       |   2 +
 module_support/playwright.atk.config.js    |   2 +
 playwright/e2e/atk_feeds/atk_feeds.spec.js | 148 +++++++++++++--------
 4 files changed, 144 insertions(+), 72 deletions(-)

diff --git a/cypress/e2e/atk_feeds/atk_feeds.cy.js b/cypress/e2e/atk_feeds/atk_feeds.cy.js
index 321f225..659ff6e 100644
--- a/cypress/e2e/atk_feeds/atk_feeds.cy.js
+++ b/cypress/e2e/atk_feeds/atk_feeds.cy.js
@@ -21,27 +21,29 @@ import atkConfig from '../../../cypress.atk.config';
 import qaUserAccounts from '../../data/qaUsers.json';
 
 describe('Feed Tests', () => {
+  const ctx = {
+    feedTypeName: undefined,
+  }
+
   //
   // Create a new feed definition, import fixture, validate that data is in the database.
   //
-  it('(ATK-PW-1180) Creates the feed type settings',{ tags: ['@ATK-PW-1180', '@feeds', 'alters-db'] }, () => {
-    const testId = 'ATK-CY-1110';
+  it('(ATK-PW-1180) Creates the feed type settings', { tags: ['@ATK-PW-1180', '@feeds', '@alters-db'] }, () => {
+    const testId = 'ATK-CY-1180';
     const uniqueToken = atkUtilities.createRandomString(6);
-    const termName = `${testId}: ${uniqueToken}`;
+    const feedTypeName = `${testId}: ${uniqueToken}`;
 
     // Log in with the administrator account.
     // Assuming logInViaForm is adapted for cypress.
     cy.logInViaForm(qaUserAccounts.admin);
-    cy.visit('https://drupalatk:8890/admin/structure');
+    cy.visit(atkConfig.feedTypeAddUrl);
 
     //
     // Add a Feed type
     //
-    cy.contains('Feed types').click();
-    cy.contains('Add feed type').click();
 
     // Fill in the fields.
-    cy.contains('Name').type('Import with url');
+    cy.contains('Name').type(feedTypeName);
     cy.contains('Description').type('Import feeds');
     cy.contains('Explanation').type('ATK Feeds Test');
 
@@ -65,33 +67,31 @@ describe('Feed Tests', () => {
 
     // Save the configured feed type.
     cy.contains('Save and add mappings').click();
+    ctx.feedTypeName = feedTypeName
 
     // Create mapping for imports
     cy.get('#edit-add-target').first().select('Title (title)');
     cy.get('select[data-drupal-selector="edit-mappings-0-map-value-select"]').select('Title');
 
     // Save mapping structure
-   cy.get('[data-drupal-selector="edit-actions-submit"]').click();
+    cy.get('[data-drupal-selector="edit-actions-submit"]').click();
   });
 
-});
+  it('(ATK-PW-1181) Passes and imports items', { tags: ['@ATK-PW-1181', '@feeds', 'alters-db'] }, () => {
+    // ctx.feedTypeName must exist to run this test.
+    cy.wrap(ctx.feedTypeName).should('not.be.undefined', { message: 'Feed type must exist for this test' })
 
-describe('Add Feed Url', () => {
-  it('(ATK-PW-1181) passes and imports items', { tags: ['@ATK-PW-1181', '@feeds', 'alters-db'] }, () => {
     // Login via admin account.
     cy.logInViaForm(qaUserAccounts.admin);
-    cy.visit('/admin/content');
 
     //
     // Add a new feed into the existing feed type.
     //
-    cy.get('button[aria-label="Tabs display toggle"]').click();
-    cy.contains('Feeds').click();
-    cy.contains('Add feed').click();
+    cy.visit(atkConfig.feedAddUrl)
 
     // Find the existing feed type.
     // Select the feed that you have created.
-    cy.contains('Import with url').click();
+    cy.contains('a:visible', ctx.feedTypeName).click();
     cy.contains('Title').type('nytimes rss business');
 
     //
@@ -101,5 +101,37 @@ describe('Add Feed Url', () => {
 
     // Save and export the feed.
     cy.contains('Save and import').click();
+    cy.contains('nytimes rss business has been created.')
+
+    // Validate that content items are created.
+    cy.visit('admin/content')
+    cy.contains('tr', 'Anonymous')
   });
+
+  after(() => {
+    //
+    // Clean up.
+    //
+    cy.visit('admin/content/feed')
+    cy.contains('tr', ctx.feedTypeName).then(($el) => {
+      if ($el.length) {
+        const deleteItemsUrl = $el.find('a:contains("Delete items")').attr('href')
+        const deleteUrl = $el.find('[aria-label^="Delete nytimes"]').attr('href')
+        cy.visit(deleteItemsUrl)
+        cy.get('#edit-submit').click({ force: true })
+        cy.get('h2[id^="status"]')  // Wait to finish delete
+        cy.visit(deleteUrl)
+        cy.get('#edit-submit').click({ force: true })
+      }
+    })
+
+    cy.visit('admin/structure/feeds')
+    cy.contains('tr', ctx.feedTypeName).then(($el) => {
+      if ($el.length) {
+        const deleteUrl = $el.find('[aria-label^="Delete ATK"]').attr('href')
+        cy.visit(deleteUrl)
+        cy.get('#edit-submit').click({ force: true })
+      }
+    })
+  })
 });
\ No newline at end of file
diff --git a/module_support/cypress.atk.config.js b/module_support/cypress.atk.config.js
index bdfc324..d711ff1 100644
--- a/module_support/cypress.atk.config.js
+++ b/module_support/cypress.atk.config.js
@@ -28,6 +28,8 @@ module.exports = {
   termViewUrl: 'taxonomy/term/{tid}',
   xmlSitemapUrl: 'admin/config/search/xmlsitemap',
   blockAddUrl: 'block/add?theme=ucop',
+  feedTypeAddUrl: 'admin/structure/feeds/add',
+  feedAddUrl: 'feed/add',
   email: {
     // Configure email testing using Reroute Email but with Enable rerouting OFF,
     // the module will be enabled, right before the test execution, and get back
diff --git a/module_support/playwright.atk.config.js b/module_support/playwright.atk.config.js
index 0d01b6e..9ee8305 100644
--- a/module_support/playwright.atk.config.js
+++ b/module_support/playwright.atk.config.js
@@ -28,6 +28,8 @@ module.exports = {
   termViewUrl: 'taxonomy/term/{tid}',
   xmlSitemapUrl: 'admin/config/search/xmlsitemap',
   blockAddUrl: 'block/add?theme=ucop',
+  feedTypeAddUrl: 'admin/structure/feeds/add',
+  feedAddUrl: 'feed/add',
   authDir: 'tests/support',
   dataDir: 'tests/data',
   supportDir: 'tests/support',
diff --git a/playwright/e2e/atk_feeds/atk_feeds.spec.js b/playwright/e2e/atk_feeds/atk_feeds.spec.js
index 48bca94..8eecbb2 100644
--- a/playwright/e2e/atk_feeds/atk_feeds.spec.js
+++ b/playwright/e2e/atk_feeds/atk_feeds.spec.js
@@ -26,67 +26,103 @@ import atkConfig from '../../playwright.atk.config'
 // Accounts module is enabled.
 import qaUserAccounts from '../data/qaUsers.json'
 
-//
-// Create a new feed definition, import fixture, validate that data is in the database.
-//
-test('(ATK-PW-1180) Feeds Test using Playwright. Tags : @ATK-PW-1180, @feeds, alters-db', async ({ page }) => {
-  await page.goto('/');
-  await page.getByRole('link', { name: 'Log in' }).click();
-  await page.getByLabel('Username').click();
-  await page.getByLabel('Username').fill('admin');
-  await page.getByLabel('Password').click();
-  await page.getByLabel('Password').fill('admin');
-  await page.getByRole('button', { name: 'Log in' }).click();
+test.describe('Feeds.', () => {
+  // Remember names for clean up.
+  let feedTypeName = undefined
+
   //
-  // Add a Feed type
+  // Create a new feed definition, import fixture, validate that data is in the database.
   //
-  await page.getByRole('link', { name: 'Structure' }).click();
-  await page.getByRole('link', { name: 'Feed types' }).click();
-  await page.getByRole('link', { name: '+Add feed type' }).click();
+  test('(ATK-PW-1180) Feeds Test using Playwright. Tags : @ATK-PW-1180, @feeds, @alters-db', async ({ page, context }) => {
+    await page.goto('/');
+    await atkCommands.logInViaForm(page, context, qaUserAccounts.admin);
+    //
+    // Add a Feed type
+    //
+    await page.goto(atkConfig.feedTypeAddUrl);
 
-  // Fill in the fields
-  await page.getByLabel('Name', { exact: true }).click();
-  await page.getByLabel('Name', { exact: true }).fill('Import with url');
-  await page.getByLabel('Description').click();
-  await page.getByLabel('Description').fill('Import feeds');
-  await page.getByLabel('Explanation or submission').click();
-  await page.getByLabel('Explanation or submission').fill('Atk feeds test');
+    // Make a unique feed name.
+    feedTypeName = 'Import with url ' + atkUtilities.createRandomString(10)
 
-  // Save the configured feed type
-  await page.getByRole('button', { name: 'Save and add mappings' }).click();
+    // Fill in the fields
+    await page.getByLabel('Name', { exact: true }).click();
+    await page.getByLabel('Name', { exact: true }).fill(feedTypeName);
+    await page.getByLabel('Description').click();
+    await page.getByLabel('Description').fill('Import feeds');
+    await page.getByLabel('Explanation or submission').click();
+    await page.getByLabel('Explanation or submission').fill('Atk feeds test');
 
-  //
-  // Create mapping for imports
-  //
-  await page.getByLabel('Add a target').selectOption('title');
-  await page.getByRole('button', { name: 'Save' }).click();
-  await page.locator('#edit-mappings-0-map-value-select').selectOption('title');
-  await page.getByRole('button', { name: 'Save' }).click();
-  await page.getByLabel('Add a target').selectOption('body');
-  await page.getByRole('button', { name: 'Save' }).click();
-  await page.locator('#edit-mappings-1-map-value-select').selectOption('feed_description');
-  await page.getByRole('button', { name: 'Save' }).click();
-  await page.getByLabel('Add a target').selectOption('feeds_item');
-  await page.getByRole('button', { name: 'Save' }).click();
+    // Save the configured feed type
+    await page.getByRole('button', { name: 'Save and add mappings' }).click();
+    await page.waitForEvent('domcontentloaded')
 
-  //
-  // Add a new feed into the existing feed type.
-  //
-  await page.getByRole('link', { name: 'Content', exact: true }).click();
-  await page.getByRole('link', { name: 'Feeds' }).click();
-  await page.getByRole('link', { name: '+Add feed' }).click();
+    //
+    // Create mapping for imports
+    //
+    await page.getByLabel('Add a target').selectOption('title');
+    await page.locator('[data-drupal-selector="edit-mappings-0-map-value-select"]').selectOption('title');
+    await page.getByLabel('Add a target').selectOption('body');
+    await page.locator('[data-drupal-selector="edit-mappings-1-map-value-select"]').selectOption('feed_description');
+    await page.locator('[data-drupal-selector="edit-mappings-1-map-summary-select"]').selectOption('feed_title');
+    await page.getByLabel('Add a target').selectOption('feeds_item');
+    await page.locator('[data-drupal-selector="edit-mappings-2-map-url-select"]').selectOption('url');
+    await page.locator('[data-drupal-selector="edit-mappings-2-map-guid-select"]').selectOption('guid');
+    await page.getByRole('button', { name: 'Save' }).click();
 
-  // Find the existing feed type.
-  // Select the feed that you have created.
-  await page.getByRole('link', { name: 'Import with url' }).click();
-  await page.getByLabel('Title').click();
-  await page.getByLabel('Title').fill('nytimes rss business');
+    //
+    // Add a new feed into the existing feed type.
+    //
+    await page.goto(atkConfig.feedAddUrl);
 
-  //
-  // Insert path to Import file or the data file URL.
-  //
-  await page.getByLabel('Feed URL').click();
-  await page.getByLabel('Feed URL').fill('https://rss.nytimes.com/services/xml/rss/nyt/Business.xml');
-  // Save and export the feed.
-  await page.getByRole('button', { name: 'Save and import' }).click();
-});
+    // Find the existing feed type.
+    // Select the feed that you have created.
+    await page.getByRole('link', { name: feedTypeName }).click();
+    await page.getByLabel('Title').click();
+    await page.getByLabel('Title').fill('nytimes rss business');
+
+    //
+    // Insert path to Import file or the data file URL.
+    //
+    await page.getByLabel('Feed URL').click();
+    await page.getByLabel('Feed URL').fill('https://rss.nytimes.com/services/xml/rss/nyt/Business.xml');
+
+    // Save and export the feed.
+    await page.getByRole('button', { name: 'Save and import' }).click();
+    await page.getByText('nytimes rss business has been created.').waitFor()
+
+    // Validate that at least one article is created. (Author should be "Anonymous")
+    await page.goto('admin/content')
+    expect(await page.locator('tr', { hasText: 'Anonymous'  }).count()).toBeGreaterThan(0)
+  });
+
+  test.afterEach(async ({ page }) => {
+    //
+    // Clean up the created entities.
+    //
+
+    // Delete feed items and delete a feed.
+    await page.goto('admin/content/feed')
+      const rowLocator = page.locator('tr', { hasText: feedTypeName })
+
+    // Skip if the feed doesn't exist.
+    if (await rowLocator.count()) {
+      await rowLocator.locator('.dropbutton__toggle').click()
+      await rowLocator.getByText('Delete items').click()
+      await page.getByRole('button', { name: 'Delete items' }).click()
+      await rowLocator.waitFor()  // Should we navigate back to the feed row.
+
+      await rowLocator.locator('.dropbutton__toggle').click()
+      await rowLocator.getByText('Delete', { exact: true }).click()
+      await page.getByRole('button', { name: 'Delete' }).click()
+    }
+
+    // Delete feed type.
+    await page.goto('admin/structure/feeds')
+    // Skip if the feed type doesn't exist.
+    if (await rowLocator.count()) {
+      await rowLocator.locator('.dropbutton__toggle').click()
+      await rowLocator.getByText('Delete').click()
+      await page.getByRole('button', { name: 'Delete' }).click()
+    }
+  })
+})
-- 
GitLab