Repository: HealthResearchAuthority/rsp-iras-qa
Pull request #15: rsp-2569-2571-ability to view manage review body list
Author: login: vijay-kumar-hra
Created: 2025-04-06T11:22:05Z | Merged: 2025-04-11T14:21:01Z

## What was the purpose of this ticket?
RSP-2569
As a user
I want the ability to view a list of all review bodies
So that I can view the status and key details of the review bodies

RSP-2571
As a user
I want the ability to view a review body organisational profile
So that I can access all the review body information

## Jira Ref

[RSP-2569](https://nihr.atlassian.net/browse/RSP-2569)
[RSP-2571](https://nihr.atlassian.net/browse/RSP-2571)

## Type of Change

Put [X] inside the [] to make the box ticked

- [X] New Tests
- [] Updating Tests
- [] Fixing Tests
- [] Framework Improvements
- [] Documentation

## Solution

What work was completed to cover off the story?

added new feature file and relevant files  

## Checklist

Put [X] inside the [] to make the box ticked

- [X] Your code builds clean without any warnings, i.e. no ESLint or SonarCube errors
- [X] You have run the Pipeline jobs against this branch successfully
- [X] Any new or updated tests add value, i.e. provide correct assurances, fail when expected and log errors appropriately
- [X] Tests have been tagged appropriately
- [X] No duplicate tests, steps or functions have been added
- [X] You are using the correct naming conventions
- [X] Added files have been placed correctly within the projects folder structure
- [] There is no dead code e.g. no "TODO" comments left, no unused imports etc
- [] Any Framework updates have been explained and demonstrated to the team



Diff:
diff --git a/src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesPage.ts b/src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesPage.ts
index 67fbf6040..2c8b1c7e3 100644
--- a/src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesPage.ts
+++ b/src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesPage.ts
@@ -1,6 +1,7 @@
 import { expect, Locator, Page } from '@playwright/test';
 import * as manageReviewBodiesPageData from '../../../../../resources/test_data/iras/reviewResearch/userAdministration/manageReviewBodies/manage_review_body_page_data.json';
 import * as linkTextData from '../../../../../resources/test_data/common/link_text_data.json';
+import { confirmStringNotNull } from '../../../../../utils/UtilFunctions';
 
 //Declare Page Objects
 export default class ManageReviewBodiesPage {
@@ -10,8 +11,12 @@ export default class ManageReviewBodiesPage {
   readonly pageHeading: Locator;
   readonly addNewReviewBodyRecordLink: Locator;
   readonly mainPageContent: Locator;
+  readonly review_bodies_list_rows: Locator;
+  readonly organisation_name_from_list: Locator;
+  readonly status_from_list: Locator;
   readonly actionsLink: Locator;
   readonly statusCell: Locator;
+  readonly orgListRows: Locator;
 
   //Initialize Page Objects
   constructor(page: Page) {
@@ -30,10 +35,14 @@ export default class ManageReviewBodiesPage {
         exact: true,
       }
     );
+    this.review_bodies_list_rows = this.page.locator('table tbody tr');
+    this.organisation_name_from_list = this.page.locator('td:nth-child(1)');
+    this.status_from_list = this.page.locator('td:nth-child(3)');
     this.actionsLink = this.page
       .getByRole('link')
       .getByText(this.manageReviewBodiesPageData.Manage_Review_Body_Page.actions_link, { exact: true });
     this.statusCell = this.page.getByRole('cell').locator('strong');
+    this.orgListRows = this.page.getByRole('table').getByRole('row');
   }
 
   //Page Methods
@@ -46,9 +55,46 @@ export default class ManageReviewBodiesPage {
     expect(await this.page.title()).toBe(this.manageReviewBodiesPageData.Manage_Review_Body_Page.title);
   }
 
+  async searchAndClickReviewBodyProfile(reviewBodyName: string, reviewBodyStatus: string) {
+    let dataFound = false;
+    while (!dataFound) {
+      const rowCount = await this.review_bodies_list_rows.count();
+      for (let i = rowCount - 1; i > 0; i--) {
+        const organisationNameText = await this.review_bodies_list_rows
+          .nth(i)
+          .locator(this.organisation_name_from_list)
+          .textContent();
+        const organisationStatusText = await this.review_bodies_list_rows
+          .nth(i)
+          .locator(this.status_from_list)
+          .textContent();
+        if (organisationNameText?.trim() === reviewBodyName && organisationStatusText?.trim() === reviewBodyStatus) {
+          await this.review_bodies_list_rows.nth(i).getByText('View/Edit').click();
+          dataFound = true;
+          break;
+        }
+      }
+      // This code need to be updated when pagination enabled in manage review bodies page
+      if (!dataFound) {
+        throw new Error('Review body, Data not found');
+      }
+    }
+  }
+
   async getRowByOrgName(orgName: string, exactMatch: boolean) {
     return this.mainPageContent.locator('tr', {
       has: this.page.locator('td').getByText(`${orgName}`, { exact: exactMatch }),
     });
   }
+
+  async getOrgNamesListFromUI() {
+    const orgNames: string[] = [];
+    const rowCount = await this.orgListRows.count();
+    for (let i = 1; i < rowCount; i++) {
+      const columns = this.orgListRows.nth(i).getByRole('cell');
+      const orgValue = confirmStringNotNull(await columns.first().textContent());
+      orgNames.push(orgValue);
+    }
+    return orgNames;
+  }
 }
diff --git a/src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfilePage.ts b/src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfilePage.ts
index 7f94ba5fb..57ced3800 100644
--- a/src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfilePage.ts
+++ b/src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfilePage.ts
@@ -13,6 +13,7 @@ export default class ReviewBodyProfilePage {
   private _countries: string[];
   private _email_address: string;
   private _description: string;
+  private _last_updated_date: string;
   readonly back_link: Locator;
   readonly page_heading: Locator;
   readonly row_value_locator: Locator;
@@ -55,6 +56,7 @@ export default class ReviewBodyProfilePage {
     this._countries = [];
     this._email_address = '';
     this._description = '';
+    this._last_updated_date = '';
 
     //Locators
     this.page_heading = this.page
@@ -194,4 +196,12 @@ export default class ReviewBodyProfilePage {
   async setDescription(value: string): Promise<void> {
     this._description = value;
   }
+
+  async getLastUpdatedDate(): Promise<string> {
+    return this._last_updated_date;
+  }
+
+  async setLastUpdatedDate(value: string): Promise<void> {
+    this._last_updated_date = value;
+  }
 }
diff --git a/src/resources/test_data/iras/reviewResearch/userAdministration/manageReviewBodies/create_review_body_page_data.json b/src/resources/test_data/iras/reviewResearch/userAdministration/manageReviewBodies/create_review_body_page_data.json
index 920c55372..7c85350f8 100644
--- a/src/resources/test_data/iras/reviewResearch/userAdministration/manageReviewBodies/create_review_body_page_data.json
+++ b/src/resources/test_data/iras/reviewResearch/userAdministration/manageReviewBodies/create_review_body_page_data.json
@@ -366,6 +366,12 @@
       "Max_Words": "The description cannot exceed 500 words.",
       "Max_Email_Chars": "Max 255 characters allowed",
       "Email_Format": "Invalid email format"
+    },
+    "Valid_Data_In_All_Fields_Disabled": {
+      "organisation_name_text": "QA Automation HSC Research and Development 20250406050232641",
+      "country_checkbox": ["England", "Northern Ireland", "Scotland", "Wales"],
+      "email_address_text": "qaauto_hscrd@health.org",
+      "description_text": "qaauto_Responsible for confirmation of research governance compliance"
     }
   }
 }
diff --git a/src/steps/Common/CommonSteps.ts b/src/steps/Common/CommonSteps.ts
index ea6161047..ccbec5eba 100644
--- a/src/steps/Common/CommonSteps.ts
+++ b/src/steps/Common/CommonSteps.ts
@@ -178,7 +178,10 @@ Given(
       await userProfilePage.first_change_link.click(); //work around for now >> to click on first Change link
     } else if (pageKey === 'Create_User_Profile_Confirmation_Page' && linkKey === 'Back_To_Manage_Users') {
       await createUserProfileConfirmationPage.back_to_manage_user_link.click(); //work around for now >> to click on Back_To_Manage_Users link ..# "Back to Manage Users" in app, "Back to Manage users" in figma >>clarification needed
-    } else {
+    }else if (pageKey === 'Manage_Review_Bodies_Page' && linkKey === 'View_Edit') {
+      await commonItemsPage.govUkLink.getByText(linkValue, { exact: true }).first().click();
+    } 
+    else {
       await commonItemsPage.govUkLink.getByText(linkValue, { exact: true }).click();
     }
   }
diff --git a/src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesSteps.ts b/src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesSteps.ts
index ae098ac46..cb33d404b 100644
--- a/src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesSteps.ts
+++ b/src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesSteps.ts
@@ -78,6 +78,32 @@ Then(
   }
 );
 
+Then(
+  'I search {string} review body and click on view edit link for {string} with {string} status',
+  async ({ createReviewBodyPage, manageReviewBodiesPage }, recordType: string, datasetName: string, status: string) => {
+    if (recordType.toLowerCase() == 'existing') {
+      const dataset = createReviewBodyPage.createReviewBodyPageData.Create_Review_Body[datasetName];
+      const existingOrgName = dataset.organisation_name_text;
+      await manageReviewBodiesPage.searchAndClickReviewBodyProfile(existingOrgName, status);
+    } else {
+      const reviewBodyRow = await manageReviewBodiesPage.getRowByOrgName(
+        await createReviewBodyPage.getUniqueOrgName(),
+        true
+      );
+      await reviewBodyRow.locator(manageReviewBodiesPage.actionsLink).click();
+    }
+  }
+);
+
+Then(
+  'I can see the list is sorted by default in the alphabetical order of {string}',
+  async ({ manageReviewBodiesPage }) => {
+    const orgNames: string[] = await manageReviewBodiesPage.getOrgNamesListFromUI();
+    const sortedOrgNames = [...orgNames].sort((a, b) => a.localeCompare(b, 'en', { sensitivity: 'base' }));
+    expect(orgNames).toEqual(sortedOrgNames);
+  }
+);
+
 Then(
   'I click the view edit link for the newly created review body',
   async ({ manageReviewBodiesPage, createReviewBodyPage }) => {
diff --git a/src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts b/src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
index ac426f096..71556bd58 100644
--- a/src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
+++ b/src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
@@ -2,7 +2,7 @@ import { createBdd } from 'playwright-bdd';
 import { expect, test } from '../../../../../hooks/CustomFixtures';
 import { confirmStringNotNull } from '../../../../../utils/UtilFunctions';
 
-const { When, Then } = createBdd(test);
+const { Then, When } = createBdd(test);
 
 Then('I can see the review body profile page', async ({ reviewBodyProfilePage }) => {
   await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
@@ -18,6 +18,9 @@ Then('I can see the review body profile page', async ({ reviewBodyProfilePage })
   await reviewBodyProfilePage.setDescription(
     confirmStringNotNull(await reviewBodyProfilePage.description_value.textContent())
   );
+  await reviewBodyProfilePage.setLastUpdatedDate(
+    confirmStringNotNull(await reviewBodyProfilePage.last_updated_value.textContent())
+  );
 });
 
 Then(
@@ -64,6 +67,11 @@ When(
   }
 );
 
+Then('I can see the last updated date field is blank', async ({ reviewBodyProfilePage }) => {
+  const lastUpdatedDateActualValue = confirmStringNotNull(await reviewBodyProfilePage.getLastUpdatedDate()).trim();
+  expect(lastUpdatedDateActualValue).toBe(''); // defect open - last updated date stamped for new review body
+});
+
 Then(
   'I can see the {string} ui labels on the manage review body profile page',
   async ({ commonItemsPage, reviewBodyProfilePage }, datasetName: string) => {
diff --git a/tests/features/cross-compatible/stories/systemTests/reviewResearch/userAdministration/manageReviewBodies/ViewReviewBodies.feature b/tests/features/cross-compatible/stories/systemTests/reviewResearch/userAdministration/manageReviewBodies/ViewReviewBodies.feature
new file mode 100644
index 000000000..94a9d116e
--- /dev/null
+++ b/tests/features/cross-compatible/stories/systemTests/reviewResearch/userAdministration/manageReviewBodies/ViewReviewBodies.feature
@@ -0,0 +1,78 @@
+@UserAdministration @ViewReviewBodies @adminUser @SystemTest @rsp-2571 @rsp-2569
+Feature: HRAPROG-393- User Administration: Manage Review Bodies list and view review bodies profile details
+
+    Background:
+        Given I have navigated to the 'Home_Page'
+        And I click the 'System_Admin' link on the 'Banner'
+        And I can see the 'System_Administration_Page'
+        And I click the 'Manage_Review_Bodies' link on the 'System_Administration_Page'
+        And I can see the manage review bodies list page
+
+    @viewListOfReviewBodies
+    Scenario Outline: Verify the user is able to view list of review bodies in alphabetical order of Organisation Name
+        And I click the 'Add_New_Review_Body_Record' link on the 'Manage_Review_Bodies_Page'
+        And I can see the add a new review body page
+        When I fill the new review body page using '<Add_Review_Body>'
+        And I capture the page screenshot
+        And I click the 'Continue' button on the 'Create_Review_Body_Page'
+        Then I can see the check and create review body page for '<Add_Review_Body>'
+        And I capture the page screenshot
+        When I click the 'Create_Profile' button on the 'Check_Create_Review_Body_Page'
+        Then I can see the create Review body confirmation page for '<Add_Review_Body>'
+        And I capture the page screenshot
+        When I have navigated to the 'Manage_Review_Bodies_Page'
+        And I can see the manage review bodies list page
+        Then I can see the review body for '<Add_Review_Body>' is present in the list
+        And I capture the page screenshot
+        And I can see the status of the review body is '<Status>'
+        Then I can see the list is sorted by default in the alphabetical order of 'Organisation Name'
+
+        Examples:
+            | Add_Review_Body          | Status  |
+            | Valid_Data_In_All_Fields | enabled |
+
+    @verifyManageReviewBodiesPageBackButtonFlow
+    Scenario: Verify the user can navigate from 'Manage review bodies' page by clicking 'Back' button
+        And I click the 'Back' link on the 'Manage_Review_Bodies_Page'
+        Then I can see the 'System_Administration_Page'
+
+
+    @viewEnabledDisabledReviewBodies
+    Scenario Outline: Verify that user is able to view active and disabled review bodies
+        When I search 'existing' review body and click on view edit link for '<Review_Body_Name>' with '<Status>' status
+        Then I can see the review body profile page
+        And I capture the page screenshot
+        When I click the 'Back' link on the 'Review_Body_Profile_Page'
+        And I capture the page screenshot
+        Then I can see the manage review bodies list page
+
+        Examples:
+            | Review_Body_Name                  | Status   |
+            | Valid_Data_In_All_Fields          | ACTIVE   |
+            | Valid_Data_In_All_Fields_Disabled | DISABLED |
+
+
+    @viewNewReviewBody
+    Scenario Outline: Verify that user is able to view review body details with blank last updated date for the new record
+        And I click the 'Add_New_Review_Body_Record' link on the 'Manage_Review_Bodies_Page'
+        And I can see the add a new review body page
+        When I fill the new review body page using '<Review_Body_Name>'
+        And I capture the page screenshot
+        And I click the 'Continue' button on the 'Create_Review_Body_Page'
+        Then I can see the check and create review body page for '<Review_Body_Name>'
+        And I capture the page screenshot
+        When I click the 'Create_Profile' button on the 'Check_Create_Review_Body_Page'
+        Then I can see the create Review body confirmation page for '<Review_Body_Name>'
+        And I capture the page screenshot
+        When I have navigated to the 'Manage_Review_Bodies_Page'
+        And I can see the manage review bodies list page
+        And I search 'new' review body and click on view edit link for '<Review_Body_Name>' with '<Status>' status
+        And I can see the review body profile page
+        And I capture the page screenshot
+        Then I can see the last updated date field is blank
+
+        Examples:
+            | Review_Body_Name         | Status |
+            | Valid_Data_In_All_Fields | ACTIVE |
+
+


Reviews:
user: login: Chris-McNeill-PA-HRA
body: Very good work, just a couple of comments to address, nothing major
state: CHANGES_REQUESTED
author_association: COLLABORATOR
submitted_at: 2025-04-07T16:37:41Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T08:12:36Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T08:13:24Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T08:14:35Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T08:21:30Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T08:27:32Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T08:40:21Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T08:40:54Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T08:41:27Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T08:41:49Z
user: login: Chris-McNeill-PA-HRA
state: CHANGES_REQUESTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T18:02:04Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T19:41:07Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T19:41:15Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T19:42:30Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T19:42:36Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-10T19:45:53Z
user: login: Chris-McNeill-PA-HRA
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-11T10:46:22Z
user: login: Chris-McNeill-PA-HRA
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-11T10:49:30Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-11T11:40:15Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-11T11:40:59Z
user: login: vijay-kumar-hra
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-11T11:41:33Z
user: login: Chris-McNeill-PA-HRA
body: Approved assuming that the sonar issue you mentioned is fixed by reverting back to [...orgName].sort....
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-04-11T14:07:35Z

Review comments:
diff_hunk: @@ -0,0 +1,74 @@
+import { expect, Locator, Page } from '@playwright/test';
+import * as manageReviewBodiesPageData from '../../../../../resources/test_data/iras/reviewResearch/userAdministration/manageReviewBodies/pages/manage_review_body_page_data.json';
+import * as linkTextData from '../../../../../resources/test_data/common/link_text_data.json';
+
+//Declare Page Objects
+export default class ManageReviewBodiesPage {
+  readonly page: Page;
+  readonly manageReviewBodiesPageData: typeof manageReviewBodiesPageData;
+  readonly linkTextData: typeof linkTextData;
+  readonly pageHeading: Locator;
+  readonly addNewReviewBodyRecordLink: Locator;
+  readonly mainPageContent: Locator;
+  readonly review_bodies_list_rows: Locator;
+  readonly organisation_name_from_list: Locator;
+  readonly status_from_list: Locator;
+
+  //Initialize Page Objects
+  constructor(page: Page) {
+    this.page = page;
+    this.manageReviewBodiesPageData = manageReviewBodiesPageData;
+    this.linkTextData = linkTextData;
+
+    //Locators
+    this.pageHeading = this.page
+      .getByRole('heading')
+      .getByText(this.manageReviewBodiesPageData.Manage_Review_Body_Page.heading);
+    this.mainPageContent = this.page.getByTestId('main-content');
+    this.addNewReviewBodyRecordLink = this.mainPageContent.getByText(
+      this.linkTextData.Manage_Review_Bodies_Page.Add_New_Review_Body_Record,
+      {
+        exact: true,
+      }
+    );
+    this.review_bodies_list_rows = this.page.locator('table tbody tr');
+    this.organisation_name_from_list = this.page.locator('td:nth-child(1)');
+    this.status_from_list = this.page.locator('td:nth-child(3)');
+  }
+
+  //Page Methods
+  async goto() {
+    await this.page.goto('reviewbody/view');
+  }
+
+  async assertOnManageReviewBodiesPage() {
+    await expect(this.pageHeading).toBeVisible();
+    expect(await this.page.title()).toBe(this.manageReviewBodiesPageData.Manage_Review_Body_Page.title);
+  }
+
+  async searchAndClickReviewBodyProfile(reviewBodyName: string, reviewBodyStatus: string) {
path: src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesPage.ts
user: login: Chris-McNeill-PA-HRA
body: On my branch, which will be merged in shortly I have a page method `getRowByOrgName` which you may be able to re-use to perhaps more easily find the unique row of the record you are looking for.
Once it returns the row you could then click the relevant View/Edit button
created_at: 2025-04-07T16:19:16Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,131 @@
+import { expect, Locator, Page } from '@playwright/test';
+import * as reviewBodyProfilePageData from '../../../../../resources/test_data/iras/reviewResearch/userAdministration/manageReviewBodies/pages/review_body_profile_page_data.json';
+import * as buttonTextData from '../../../../../resources/test_data/common/button_text_data.json';
+import * as linkTextData from '../../../../../resources/test_data/common/link_text_data.json';
+
+//Declare Page Objects
+export default class CheckCreateReviewBodyPage {
+  readonly page: Page;
+  readonly reviewBodyProfilePageData: typeof reviewBodyProfilePageData;
+  readonly buttonTextData: typeof buttonTextData;
+  readonly linkTextData: typeof linkTextData;
+  readonly back_link: Locator;
+  readonly page_heading: Locator;
+  readonly sub_heading: Locator;
+  readonly guidance_text: Locator;
+  readonly row_value_locator: Locator;
+  readonly row_change_link_locator: Locator;
+  readonly organisation_name_row: Locator;
+  readonly organisation_name_value: Locator;
+  readonly organisation_name_change_link: Locator;
+  readonly country_row: Locator;
+  readonly country_value: Locator;
+  readonly country_change_link: Locator;
+  readonly email_address_row: Locator;
+  readonly email_address_value: Locator;
+  readonly email_address_change_link: Locator;
+  readonly description_row: Locator;
+  readonly description_value: Locator;
+  readonly description_change_link: Locator;
+  readonly create_profile_btn: Locator;
+  readonly users_row: Locator;
+  readonly users_change_link: Locator;
+  readonly row_view_this_review_body_list_of_users_link_locator: Locator;
+  readonly view_this_review_body_list_of_users_link: Locator;
+  readonly row_view_this_review_body_audit_history_link: Locator;
+  readonly view_this_review_body_audit_history_link: Locator;
+  readonly audit_row: Locator;
+  readonly last_updated_row: Locator;
+  readonly last_updated_value: Locator;
+
+  //Initialize Page Objects
+  constructor(page: Page) {
+    this.page = page;
+    this.reviewBodyProfilePageData = reviewBodyProfilePageData;
+    this.buttonTextData = buttonTextData;
+    this.linkTextData = linkTextData;
+
+    //Locators
path: src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfilePage.ts
user: login: Chris-McNeill-PA-HRA
body: This looks great!
created_at: 2025-04-07T16:19:56Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,45 @@
+import { createBdd } from 'playwright-bdd';
+import { test } from '../../../../../hooks/CustomFixtures';
+import ManageReviewBodiesPage from '../../../../../pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesPage';
+
+const { Then, When } = createBdd(test);
+
+Then('I can see the Manage review bodies list page', async ({ manageReviewBodiesPage }) => {
+  await manageReviewBodiesPage.assertOnManageReviewBodiesPage();
+});
+
+Then(
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesSteps.ts
user: login: Chris-McNeill-PA-HRA
body: Make sure to pull down the latest from main after my merge.
But weren't you implementing the alphabetical sort step as part of your tests?
I took it out of mine after our call the other day
created_at: 2025-04-07T16:23:43Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,46 @@
+import { createBdd } from 'playwright-bdd';
+import { expect, test } from '../../../../../hooks/CustomFixtures';
+import { confirmStringNotNull } from '../../../../../utils/UtilFunctions';
+
+const { Then } = createBdd(test);
+
+Then('I can see the review body profile page', async ({ reviewBodyProfilePage }) => {
+  await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
+});
+
+Then(
+  'I can verify the field values on review body profile page for {string}',
+  async ({ createReviewBodyPage, reviewBodyProfilePage }, datasetName: string) => {
+    const dataset = createReviewBodyPage.createReviewBodyPageData.Create_Review_Body[datasetName];
+    const expectedCountryValues: string = dataset.country_checkbox.toString();
+
+    expect(confirmStringNotNull(await reviewBodyProfilePage.organisation_name_value.textContent())).toBe(
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
user: login: Chris-McNeill-PA-HRA
body: Its easier for this to just use the toHaveText assertion method. 
E.g. `await expect(reviewBodyProfilePage.organisation_name_value).toHaveText(dataset.organisation_name_text)`

Saves having to call ConfirmStringNotNull every time.
Do for each of the text fields in this step
created_at: 2025-04-07T16:26:47Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,46 @@
+import { createBdd } from 'playwright-bdd';
+import { expect, test } from '../../../../../hooks/CustomFixtures';
+import { confirmStringNotNull } from '../../../../../utils/UtilFunctions';
+
+const { Then } = createBdd(test);
+
+Then('I can see the review body profile page', async ({ reviewBodyProfilePage }) => {
+  await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
+});
+
+Then(
+  'I can verify the field values on review body profile page for {string}',
+  async ({ createReviewBodyPage, reviewBodyProfilePage }, datasetName: string) => {
+    const dataset = createReviewBodyPage.createReviewBodyPageData.Create_Review_Body[datasetName];
+    const expectedCountryValues: string = dataset.country_checkbox.toString();
+
+    expect(confirmStringNotNull(await reviewBodyProfilePage.organisation_name_value.textContent())).toBe(
+      dataset.organisation_name_text
+    );
+    await expect(reviewBodyProfilePage.organisation_name_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.country_value.textContent())).toBe(
+      expectedCountryValues.replaceAll(',', ', ')
+    );
+    await expect(reviewBodyProfilePage.country_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.email_address_value.textContent())).toBe(
+      dataset.email_address_text
+    );
+    await expect(reviewBodyProfilePage.email_address_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.description_value.textContent())).toBe(
+      dataset.description_text
+    );
+    await expect(reviewBodyProfilePage.description_change_link).toBeVisible();
+
+    await expect(reviewBodyProfilePage.view_this_review_body_list_of_users_link).toBeVisible();
+    await expect(reviewBodyProfilePage.view_this_review_body_audit_history_link).toBeVisible();
+    await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
user: login: Chris-McNeill-PA-HRA
body: I'm not sure you need this in here, but if you are then it would make sense to put it as the first assertion in this step
created_at: 2025-04-07T16:28:23Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,46 @@
+import { createBdd } from 'playwright-bdd';
+import { expect, test } from '../../../../../hooks/CustomFixtures';
+import { confirmStringNotNull } from '../../../../../utils/UtilFunctions';
+
+const { Then } = createBdd(test);
+
+Then('I can see the review body profile page', async ({ reviewBodyProfilePage }) => {
+  await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
+});
+
+Then(
+  'I can verify the field values on review body profile page for {string}',
+  async ({ createReviewBodyPage, reviewBodyProfilePage }, datasetName: string) => {
+    const dataset = createReviewBodyPage.createReviewBodyPageData.Create_Review_Body[datasetName];
+    const expectedCountryValues: string = dataset.country_checkbox.toString();
+
+    expect(confirmStringNotNull(await reviewBodyProfilePage.organisation_name_value.textContent())).toBe(
+      dataset.organisation_name_text
+    );
+    await expect(reviewBodyProfilePage.organisation_name_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.country_value.textContent())).toBe(
+      expectedCountryValues.replaceAll(',', ', ')
+    );
+    await expect(reviewBodyProfilePage.country_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.email_address_value.textContent())).toBe(
+      dataset.email_address_text
+    );
+    await expect(reviewBodyProfilePage.email_address_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.description_value.textContent())).toBe(
+      dataset.description_text
+    );
+    await expect(reviewBodyProfilePage.description_change_link).toBeVisible();
+
+    await expect(reviewBodyProfilePage.view_this_review_body_list_of_users_link).toBeVisible();
+    await expect(reviewBodyProfilePage.view_this_review_body_audit_history_link).toBeVisible();
+    await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
+    const expectedPageTitle = `${reviewBodyProfilePage.reviewBodyProfilePageData.Review_Body_Profile_Page.heading_prefix_label}${dataset.organisation_name_text}`;
+    const actualPageTitle = await reviewBodyProfilePage.page_heading.textContent();
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
user: login: Chris-McNeill-PA-HRA
body: Wrap the `await reviewBodyProfilePage.page_heading.textContent()`; in a ConfirmStringNotNull method.
Prevents you having to use `?` in the assertion as its definitely a string
created_at: 2025-04-07T16:30:30Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,46 @@
+import { createBdd } from 'playwright-bdd';
+import { expect, test } from '../../../../../hooks/CustomFixtures';
+import { confirmStringNotNull } from '../../../../../utils/UtilFunctions';
+
+const { Then } = createBdd(test);
+
+Then('I can see the review body profile page', async ({ reviewBodyProfilePage }) => {
+  await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
+});
+
+Then(
+  'I can verify the field values on review body profile page for {string}',
+  async ({ createReviewBodyPage, reviewBodyProfilePage }, datasetName: string) => {
+    const dataset = createReviewBodyPage.createReviewBodyPageData.Create_Review_Body[datasetName];
+    const expectedCountryValues: string = dataset.country_checkbox.toString();
+
+    expect(confirmStringNotNull(await reviewBodyProfilePage.organisation_name_value.textContent())).toBe(
+      dataset.organisation_name_text
+    );
+    await expect(reviewBodyProfilePage.organisation_name_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.country_value.textContent())).toBe(
+      expectedCountryValues.replaceAll(',', ', ')
+    );
+    await expect(reviewBodyProfilePage.country_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.email_address_value.textContent())).toBe(
+      dataset.email_address_text
+    );
+    await expect(reviewBodyProfilePage.email_address_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.description_value.textContent())).toBe(
+      dataset.description_text
+    );
+    await expect(reviewBodyProfilePage.description_change_link).toBeVisible();
+
+    await expect(reviewBodyProfilePage.view_this_review_body_list_of_users_link).toBeVisible();
+    await expect(reviewBodyProfilePage.view_this_review_body_audit_history_link).toBeVisible();
+    await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
+    const expectedPageTitle = `${reviewBodyProfilePage.reviewBodyProfilePageData.Review_Body_Profile_Page.heading_prefix_label}${dataset.organisation_name_text}`;
+    const actualPageTitle = await reviewBodyProfilePage.page_heading.textContent();
+    expect(actualPageTitle?.trim()).toBe(expectedPageTitle);
+  }
+);
+
+Then('I can see the last updated date field is blank', async ({ reviewBodyProfilePage }) => {
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
user: login: Chris-McNeill-PA-HRA
body: Same as previous - pass into the ConfirmStringNotNull method.
created_at: 2025-04-07T16:31:08Z
author_association: COLLABORATOR
diff_hunk: @@ -171,6 +171,30 @@ Feature: Run Axe Accessibilty Test Tool Against App Pages
     And I analyse the results from the Axe scan
     Then I expect to receive no WCAG Violations
 
+  @axeAccessibilityManageReviewBodies @adminUser
path: tests/features/cross-compatible/accessibility/AxeAccessibility.feature
user: login: Chris-McNeill-PA-HRA
body: Remember to pull latest from main when I've merged, should cover all this 
created_at: 2025-04-07T16:31:57Z
author_association: COLLABORATOR
diff_hunk: @@ -171,6 +171,30 @@ Feature: Run Axe Accessibilty Test Tool Against App Pages
     And I analyse the results from the Axe scan
     Then I expect to receive no WCAG Violations
 
+  @axeAccessibilityManageReviewBodies @adminUser
+  Scenario: Manage Review Bodies list page
+    Given I have navigated to the 'Home_Page'
+    When I click the 'System_Admin' link on the 'Banner'
+    Then I can see the 'System_Administration_Page'
+    When I click the 'Manage_Review_Bodies' link on the 'System_Administration_Page'
+    Then I can see the Manage review bodies list page
+    When I Scan the page with the Axe Accessibilty Tool
+    And I analyse the results from the Axe scan
+    Then I expect to receive no WCAG Violations
+
+  @axeAccessibilityManageReviewBodies_dryrun @adminUser
path: tests/features/cross-compatible/accessibility/AxeAccessibility.feature
user: login: Chris-McNeill-PA-HRA
body: Ensure this tag is unique & relevant to the test e.g. `@axeAccessibilityManageReviewBodyProfile`
created_at: 2025-04-07T16:32:49Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,71 @@
+@UserAdministration @ManageReviewBodies @viewReviewBodies @adminUser @rsp-2571 @rsp-2569
+Feature: HRAPROG-393- User Administration: Manage Review Bodies
path: tests/features/cross-compatible/stories/systemTests/reviewResearch/userAdministration/manageReviewBodies/ViewReviewBodies.feature
user: login: Chris-McNeill-PA-HRA
body: Check with Tiji but I think this title needs to be more unique
E.g. `Feature: HRAPROG-393- User Body Administration: Review Body Profiles`
created_at: 2025-04-07T16:34:43Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,71 @@
+@UserAdministration @ManageReviewBodies @viewReviewBodies @adminUser @rsp-2571 @rsp-2569
+Feature: HRAPROG-393- User Administration: Manage Review Bodies
+
+    Background:
+        Given I have navigated to the 'Home_Page'
+        And I click the 'System_Admin' link on the 'Banner'
+        And I can see the 'System_Administration_Page'
+        And I click the 'Manage_Review_Bodies' link on the 'System_Administration_Page'
+        And I can see the Manage review bodies list page
+
+    @viewListOfReviewBodies
+    Scenario Outline: Verify the user is able to view list of review bodies in alphabetical order of Organisation Name
+        And I click the 'Add_New_Review_Body_Record' link on the 'Manage_Review_Bodies_Page'
+        And I can see the Add a new review body page
+        When I fill the new review body page using '<Add_Review_Body>'
+        And I click the 'Continue' button on the 'Create_Review_Body_Page'
+        Then I can see the Check and create review body page for '<Add_Review_Body>'
+        When I click the 'Create_Profile' button on the 'Check_And_Create_Review_Body_Page'
+        Then I can see the create Review body confirmation page for '<Add_Review_Body>'
+        When I click the 'Back_To_Manage_Review_Bodies' link on the 'Create_Review_Body_Confirmation_Page'
+        Then I can see the Manage review bodies list page
+        Then I can see the list is sorted by default in the alphabetical order of 'Organisation Name'
+        And I can see the newly created 'review body' should be present in the list
+        And I can see the status of the newly created 'review body' is 'active'
+
+        Examples:
+            | Add_Review_Body                    |
+            | Valid_Data_In_All_Fields           |
+            | Valid_Data_In_All_Mandatory_Fields |
+
+
+    @verifyManageReviewBodiesPageBackButtonFlow
+    Scenario: Verify the user can navigate from 'Manage review bodies' page by clicking 'Back' button
+        And I click the 'Back' link on the 'Manage_Review_Bodies_Page'
+        Then I can see the 'System_Administration_Page'
+
+
+    @viewReviewBodies
path: tests/features/cross-compatible/stories/systemTests/reviewResearch/userAdministration/manageReviewBodies/ViewReviewBodies.feature
user: login: Chris-McNeill-PA-HRA
body: Ensure at least one of the scenario tags is unique to the scenario, @viewReviewBodies is a duplicate of the one at the feature level
created_at: 2025-04-07T16:37:18Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,74 @@
+import { expect, Locator, Page } from '@playwright/test';
+import * as manageReviewBodiesPageData from '../../../../../resources/test_data/iras/reviewResearch/userAdministration/manageReviewBodies/pages/manage_review_body_page_data.json';
+import * as linkTextData from '../../../../../resources/test_data/common/link_text_data.json';
+
+//Declare Page Objects
+export default class ManageReviewBodiesPage {
+  readonly page: Page;
+  readonly manageReviewBodiesPageData: typeof manageReviewBodiesPageData;
+  readonly linkTextData: typeof linkTextData;
+  readonly pageHeading: Locator;
+  readonly addNewReviewBodyRecordLink: Locator;
+  readonly mainPageContent: Locator;
+  readonly review_bodies_list_rows: Locator;
+  readonly organisation_name_from_list: Locator;
+  readonly status_from_list: Locator;
+
+  //Initialize Page Objects
+  constructor(page: Page) {
+    this.page = page;
+    this.manageReviewBodiesPageData = manageReviewBodiesPageData;
+    this.linkTextData = linkTextData;
+
+    //Locators
+    this.pageHeading = this.page
+      .getByRole('heading')
+      .getByText(this.manageReviewBodiesPageData.Manage_Review_Body_Page.heading);
+    this.mainPageContent = this.page.getByTestId('main-content');
+    this.addNewReviewBodyRecordLink = this.mainPageContent.getByText(
+      this.linkTextData.Manage_Review_Bodies_Page.Add_New_Review_Body_Record,
+      {
+        exact: true,
+      }
+    );
+    this.review_bodies_list_rows = this.page.locator('table tbody tr');
+    this.organisation_name_from_list = this.page.locator('td:nth-child(1)');
+    this.status_from_list = this.page.locator('td:nth-child(3)');
+  }
+
+  //Page Methods
+  async goto() {
+    await this.page.goto('reviewbody/view');
+  }
+
+  async assertOnManageReviewBodiesPage() {
+    await expect(this.pageHeading).toBeVisible();
+    expect(await this.page.title()).toBe(this.manageReviewBodiesPageData.Manage_Review_Body_Page.title);
+  }
+
+  async searchAndClickReviewBodyProfile(reviewBodyName: string, reviewBodyStatus: string) {
path: src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesPage.ts
user: login: vijay-kumar-hra
body: used getorgName method for searching new review bodies   
created_at: 2025-04-10T08:12:36Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,45 @@
+import { createBdd } from 'playwright-bdd';
+import { test } from '../../../../../hooks/CustomFixtures';
+import ManageReviewBodiesPage from '../../../../../pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesPage';
+
+const { Then, When } = createBdd(test);
+
+Then('I can see the Manage review bodies list page', async ({ manageReviewBodiesPage }) => {
+  await manageReviewBodiesPage.assertOnManageReviewBodiesPage();
+});
+
+Then(
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesSteps.ts
user: login: vijay-kumar-hra
body: I have implemented the alphabetical sorting for review bodies 
created_at: 2025-04-10T08:13:24Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,46 @@
+import { createBdd } from 'playwright-bdd';
+import { expect, test } from '../../../../../hooks/CustomFixtures';
+import { confirmStringNotNull } from '../../../../../utils/UtilFunctions';
+
+const { Then } = createBdd(test);
+
+Then('I can see the review body profile page', async ({ reviewBodyProfilePage }) => {
+  await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
+});
+
+Then(
+  'I can verify the field values on review body profile page for {string}',
+  async ({ createReviewBodyPage, reviewBodyProfilePage }, datasetName: string) => {
+    const dataset = createReviewBodyPage.createReviewBodyPageData.Create_Review_Body[datasetName];
+    const expectedCountryValues: string = dataset.country_checkbox.toString();
+
+    expect(confirmStringNotNull(await reviewBodyProfilePage.organisation_name_value.textContent())).toBe(
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
user: login: vijay-kumar-hra
body: removed this code and re-used the existing steps 
created_at: 2025-04-10T08:14:35Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,46 @@
+import { createBdd } from 'playwright-bdd';
+import { expect, test } from '../../../../../hooks/CustomFixtures';
+import { confirmStringNotNull } from '../../../../../utils/UtilFunctions';
+
+const { Then } = createBdd(test);
+
+Then('I can see the review body profile page', async ({ reviewBodyProfilePage }) => {
+  await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
+});
+
+Then(
+  'I can verify the field values on review body profile page for {string}',
+  async ({ createReviewBodyPage, reviewBodyProfilePage }, datasetName: string) => {
+    const dataset = createReviewBodyPage.createReviewBodyPageData.Create_Review_Body[datasetName];
+    const expectedCountryValues: string = dataset.country_checkbox.toString();
+
+    expect(confirmStringNotNull(await reviewBodyProfilePage.organisation_name_value.textContent())).toBe(
+      dataset.organisation_name_text
+    );
+    await expect(reviewBodyProfilePage.organisation_name_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.country_value.textContent())).toBe(
+      expectedCountryValues.replaceAll(',', ', ')
+    );
+    await expect(reviewBodyProfilePage.country_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.email_address_value.textContent())).toBe(
+      dataset.email_address_text
+    );
+    await expect(reviewBodyProfilePage.email_address_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.description_value.textContent())).toBe(
+      dataset.description_text
+    );
+    await expect(reviewBodyProfilePage.description_change_link).toBeVisible();
+
+    await expect(reviewBodyProfilePage.view_this_review_body_list_of_users_link).toBeVisible();
+    await expect(reviewBodyProfilePage.view_this_review_body_audit_history_link).toBeVisible();
+    await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
user: login: vijay-kumar-hra
body: These fields are out of scope now so I have removed it
created_at: 2025-04-10T08:21:29Z
author_association: COLLABORATOR
diff_hunk: @@ -171,6 +171,30 @@ Feature: Run Axe Accessibilty Test Tool Against App Pages
     And I analyse the results from the Axe scan
     Then I expect to receive no WCAG Violations
 
+  @axeAccessibilityManageReviewBodies @adminUser
path: tests/features/cross-compatible/accessibility/AxeAccessibility.feature
user: login: vijay-kumar-hra
body: merged main into my branch 
created_at: 2025-04-10T08:27:32Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,46 @@
+import { createBdd } from 'playwright-bdd';
+import { expect, test } from '../../../../../hooks/CustomFixtures';
+import { confirmStringNotNull } from '../../../../../utils/UtilFunctions';
+
+const { Then } = createBdd(test);
+
+Then('I can see the review body profile page', async ({ reviewBodyProfilePage }) => {
+  await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
+});
+
+Then(
+  'I can verify the field values on review body profile page for {string}',
+  async ({ createReviewBodyPage, reviewBodyProfilePage }, datasetName: string) => {
+    const dataset = createReviewBodyPage.createReviewBodyPageData.Create_Review_Body[datasetName];
+    const expectedCountryValues: string = dataset.country_checkbox.toString();
+
+    expect(confirmStringNotNull(await reviewBodyProfilePage.organisation_name_value.textContent())).toBe(
+      dataset.organisation_name_text
+    );
+    await expect(reviewBodyProfilePage.organisation_name_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.country_value.textContent())).toBe(
+      expectedCountryValues.replaceAll(',', ', ')
+    );
+    await expect(reviewBodyProfilePage.country_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.email_address_value.textContent())).toBe(
+      dataset.email_address_text
+    );
+    await expect(reviewBodyProfilePage.email_address_change_link).toBeVisible();
+    expect(confirmStringNotNull(await reviewBodyProfilePage.description_value.textContent())).toBe(
+      dataset.description_text
+    );
+    await expect(reviewBodyProfilePage.description_change_link).toBeVisible();
+
+    await expect(reviewBodyProfilePage.view_this_review_body_list_of_users_link).toBeVisible();
+    await expect(reviewBodyProfilePage.view_this_review_body_audit_history_link).toBeVisible();
+    await reviewBodyProfilePage.assertOnReviewbodyProfilePage();
+    const expectedPageTitle = `${reviewBodyProfilePage.reviewBodyProfilePageData.Review_Body_Profile_Page.heading_prefix_label}${dataset.organisation_name_text}`;
+    const actualPageTitle = await reviewBodyProfilePage.page_heading.textContent();
+    expect(actualPageTitle?.trim()).toBe(expectedPageTitle);
+  }
+);
+
+Then('I can see the last updated date field is blank', async ({ reviewBodyProfilePage }) => {
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
user: login: vijay-kumar-hra
body: updated it and used ConfirmStringNotNull method
created_at: 2025-04-10T08:40:21Z
author_association: COLLABORATOR
diff_hunk: @@ -171,6 +171,30 @@ Feature: Run Axe Accessibilty Test Tool Against App Pages
     And I analyse the results from the Axe scan
     Then I expect to receive no WCAG Violations
 
+  @axeAccessibilityManageReviewBodies @adminUser
+  Scenario: Manage Review Bodies list page
+    Given I have navigated to the 'Home_Page'
+    When I click the 'System_Admin' link on the 'Banner'
+    Then I can see the 'System_Administration_Page'
+    When I click the 'Manage_Review_Bodies' link on the 'System_Administration_Page'
+    Then I can see the Manage review bodies list page
+    When I Scan the page with the Axe Accessibilty Tool
+    And I analyse the results from the Axe scan
+    Then I expect to receive no WCAG Violations
+
+  @axeAccessibilityManageReviewBodies_dryrun @adminUser
path: tests/features/cross-compatible/accessibility/AxeAccessibility.feature
user: login: vijay-kumar-hra
body: updated with unique tag name 
created_at: 2025-04-10T08:40:54Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,71 @@
+@UserAdministration @ManageReviewBodies @viewReviewBodies @adminUser @rsp-2571 @rsp-2569
+Feature: HRAPROG-393- User Administration: Manage Review Bodies
path: tests/features/cross-compatible/stories/systemTests/reviewResearch/userAdministration/manageReviewBodies/ViewReviewBodies.feature
user: login: vijay-kumar-hra
body: Changed the title to be unique 
created_at: 2025-04-10T08:41:27Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,71 @@
+@UserAdministration @ManageReviewBodies @viewReviewBodies @adminUser @rsp-2571 @rsp-2569
+Feature: HRAPROG-393- User Administration: Manage Review Bodies
+
+    Background:
+        Given I have navigated to the 'Home_Page'
+        And I click the 'System_Admin' link on the 'Banner'
+        And I can see the 'System_Administration_Page'
+        And I click the 'Manage_Review_Bodies' link on the 'System_Administration_Page'
+        And I can see the Manage review bodies list page
+
+    @viewListOfReviewBodies
+    Scenario Outline: Verify the user is able to view list of review bodies in alphabetical order of Organisation Name
+        And I click the 'Add_New_Review_Body_Record' link on the 'Manage_Review_Bodies_Page'
+        And I can see the Add a new review body page
+        When I fill the new review body page using '<Add_Review_Body>'
+        And I click the 'Continue' button on the 'Create_Review_Body_Page'
+        Then I can see the Check and create review body page for '<Add_Review_Body>'
+        When I click the 'Create_Profile' button on the 'Check_And_Create_Review_Body_Page'
+        Then I can see the create Review body confirmation page for '<Add_Review_Body>'
+        When I click the 'Back_To_Manage_Review_Bodies' link on the 'Create_Review_Body_Confirmation_Page'
+        Then I can see the Manage review bodies list page
+        Then I can see the list is sorted by default in the alphabetical order of 'Organisation Name'
+        And I can see the newly created 'review body' should be present in the list
+        And I can see the status of the newly created 'review body' is 'active'
+
+        Examples:
+            | Add_Review_Body                    |
+            | Valid_Data_In_All_Fields           |
+            | Valid_Data_In_All_Mandatory_Fields |
+
+
+    @verifyManageReviewBodiesPageBackButtonFlow
+    Scenario: Verify the user can navigate from 'Manage review bodies' page by clicking 'Back' button
+        And I click the 'Back' link on the 'Manage_Review_Bodies_Page'
+        Then I can see the 'System_Administration_Page'
+
+
+    @viewReviewBodies
path: tests/features/cross-compatible/stories/systemTests/reviewResearch/userAdministration/manageReviewBodies/ViewReviewBodies.feature
user: login: vijay-kumar-hra
body: Updated the tag name to be unique 
created_at: 2025-04-10T08:41:49Z
author_association: COLLABORATOR
diff_hunk: @@ -46,9 +55,46 @@ export default class ManageReviewBodiesPage {
     expect(await this.page.title()).toBe(this.manageReviewBodiesPageData.Manage_Review_Body_Page.title);
   }
 
+  async searchAndClickReviewBodyProfile(reviewBodyName: string, reviewBodyStatus: string) {
+    let dataFound = false;
+    while (!dataFound) {
+      const rowCount = await this.review_bodies_list_rows.count();
+      for (let i = rowCount - 1; i > 0; i--) {
+        const organisationNameText = await this.review_bodies_list_rows
+          .nth(i)
+          .locator(this.organisation_name_from_list)
+          .textContent();
+        const organisationStatusText = await this.review_bodies_list_rows
+          .nth(i)
+          .locator(this.status_from_list)
+          .textContent();
+        if (organisationNameText?.trim() === reviewBodyName && organisationStatusText?.trim() === reviewBodyStatus) {
+          await this.review_bodies_list_rows.nth(i).getByText('View/Edit').click();
+          dataFound = true;
+          break;
+        }
+      }
+      // This code need to be updated when pagination enabled in manage review bodies page
+      if (!dataFound) {
+        throw new Error('Review body, Data not found');
+      }
+    }
+  }
+
   async getRowByOrgName(orgName: string, exactMatch: boolean) {
     return this.mainPageContent.locator('tr', {
       has: this.page.locator('td').getByText(`${orgName}`, { exact: exactMatch }),
     });
   }
+
+  async getOrgNamesListFromUI() {
+    const orgNames: string[] = [];
+    const rowCount = await this.orgListRows.count();
+    for (let i = 1; i < rowCount; i++) {
+      const columns = this.orgListRows.nth(i).getByRole('cell');
+      const orgValue = confirmStringNotNull(await columns.nth(0).textContent());
path: src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesPage.ts
user: login: Chris-McNeill-PA-HRA
body: Its essentially the same thing but if your alway getting the first or last nth, it would be preferred to use those built in playwright methods
E.g. `confirmStringNotNull(await columns.first().textContent()); `
`confirmStringNotNull(await columns.last().textContent());`
created_at: 2025-04-10T17:06:06Z
author_association: COLLABORATOR
diff_hunk: @@ -63,3 +66,17 @@ When(
     await expect(reviewBodyProfilePage.description_value).toHaveText(dataset.description_text);
   }
 );
+
+Then(
+  'I can see the list is sorted by default in the alphabetical order of {string}',
+  async ({ manageReviewBodiesPage }) => {
+    const OrgNames: string[] = await manageReviewBodiesPage.getOrgNamesListFromUI();
+    const sortedOrgNames = [...OrgNames].sort((a, b) => a.localeCompare(b, 'en', { sensitivity: 'base' }));
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
user: login: Chris-McNeill-PA-HRA
body: Good but this should be in the Manage Review Body step file, as it relates to the Manage Review Body page.
Also there is no need for the `[...OrgNames]`, just use `orgNames` local variables should start lower case
created_at: 2025-04-10T17:07:09Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,74 @@
+import { expect, Locator, Page } from '@playwright/test';
+import * as manageReviewBodiesPageData from '../../../../../resources/test_data/iras/reviewResearch/userAdministration/manageReviewBodies/pages/manage_review_body_page_data.json';
+import * as linkTextData from '../../../../../resources/test_data/common/link_text_data.json';
+
+//Declare Page Objects
+export default class ManageReviewBodiesPage {
+  readonly page: Page;
+  readonly manageReviewBodiesPageData: typeof manageReviewBodiesPageData;
+  readonly linkTextData: typeof linkTextData;
+  readonly pageHeading: Locator;
+  readonly addNewReviewBodyRecordLink: Locator;
+  readonly mainPageContent: Locator;
+  readonly review_bodies_list_rows: Locator;
+  readonly organisation_name_from_list: Locator;
+  readonly status_from_list: Locator;
+
+  //Initialize Page Objects
+  constructor(page: Page) {
+    this.page = page;
+    this.manageReviewBodiesPageData = manageReviewBodiesPageData;
+    this.linkTextData = linkTextData;
+
+    //Locators
+    this.pageHeading = this.page
+      .getByRole('heading')
+      .getByText(this.manageReviewBodiesPageData.Manage_Review_Body_Page.heading);
+    this.mainPageContent = this.page.getByTestId('main-content');
+    this.addNewReviewBodyRecordLink = this.mainPageContent.getByText(
+      this.linkTextData.Manage_Review_Bodies_Page.Add_New_Review_Body_Record,
+      {
+        exact: true,
+      }
+    );
+    this.review_bodies_list_rows = this.page.locator('table tbody tr');
+    this.organisation_name_from_list = this.page.locator('td:nth-child(1)');
+    this.status_from_list = this.page.locator('td:nth-child(3)');
+  }
+
+  //Page Methods
+  async goto() {
+    await this.page.goto('reviewbody/view');
+  }
+
+  async assertOnManageReviewBodiesPage() {
+    await expect(this.pageHeading).toBeVisible();
+    expect(await this.page.title()).toBe(this.manageReviewBodiesPageData.Manage_Review_Body_Page.title);
+  }
+
+  async searchAndClickReviewBodyProfile(reviewBodyName: string, reviewBodyStatus: string) {
path: src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesPage.ts
user: login: Chris-McNeill-PA-HRA
body: The method I mentioned in previous comment was specifically the `getRowByOrgName` method.
Use that in your step (see other [comment](https://github.com/HealthResearchAuthority/rsp-iras-qa/pull/15#discussion_r2037978816)) instead and you can remove this search and click method
created_at: 2025-04-10T17:24:07Z
author_association: COLLABORATOR
diff_hunk: @@ -171,6 +171,30 @@ Feature: Run Axe Accessibilty Test Tool Against App Pages
     And I analyse the results from the Axe scan
     Then I expect to receive no WCAG Violations
 
+  @axeAccessibilityManageReviewBodiesList @adminUser
path: tests/features/cross-compatible/accessibility/AxeAccessibility.feature
user: login: Chris-McNeill-PA-HRA
body: This is a duplicate of `@axeAccessibilityManageReviewBodies ` that I merged in the other, please remove this
created_at: 2025-04-10T17:37:04Z
author_association: COLLABORATOR
diff_hunk: @@ -171,6 +171,30 @@ Feature: Run Axe Accessibilty Test Tool Against App Pages
     And I analyse the results from the Axe scan
     Then I expect to receive no WCAG Violations
 
+  @axeAccessibilityManageReviewBodiesList @adminUser
+  Scenario: Manage Review Bodies list page
+    Given I have navigated to the 'Home_Page'
+    When I click the 'System_Admin' link on the 'Banner'
+    Then I can see the 'System_Administration_Page'
+    When I click the 'Manage_Review_Bodies' link on the 'System_Administration_Page'
+    Then I can see the manage review bodies list page
+    When I Scan the page with the Axe Accessibilty Tool
+    And I analyse the results from the Axe scan
+    Then I expect to receive no WCAG Violations
+
+  @axeAccessibilityManageReviewBodyProfile @adminUser
path: tests/features/cross-compatible/accessibility/AxeAccessibility.feature
user: login: Chris-McNeill-PA-HRA
body: This is a duplicate of `@axeAccessibilityReviewBodiesProfile` that I merged in the other, please remove this
created_at: 2025-04-10T17:37:45Z
author_association: COLLABORATOR
diff_hunk: @@ -77,3 +77,17 @@ Then(
     await selectedReviewBodyRow.locator(manageReviewBodiesPage.actionsLink).click();
   }
 );
+
+Then(
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesSteps.ts
user: login: Chris-McNeill-PA-HRA
body: No need to use `toLocaleLowerCase(),` simply use `toLowerCase()`
Use the `getRowByOrgName` method instead of searchAndClick method

My suggested code for this step is:

```
Then(
  'I search {string} review body and click on view edit link for {string} with {string} status',
  async ({ createReviewBodyPage, manageReviewBodiesPage }, recordType: string, datasetName: string, status: string) => {
    let orgName: string;
    if (recordType.toLowerCase() == 'existing') {
      const dataset = createReviewBodyPage.createReviewBodyPageData.Create_Review_Body[datasetName];
      orgName = dataset.organisation_name_text;
    } else {
      orgName = await createReviewBodyPage.getUniqueOrgName();
    }
    const reviewBodyRow = await manageReviewBodiesPage.getRowByOrgName(orgName, true);
    expect(reviewBodyRow.locator(manageReviewBodiesPage.statusCell)).toHaveText(status);
    await reviewBodyRow.locator(manageReviewBodiesPage.actionsLink).click();
  }
);
```
created_at: 2025-04-10T18:01:35Z
author_association: COLLABORATOR
diff_hunk: @@ -46,9 +55,46 @@ export default class ManageReviewBodiesPage {
     expect(await this.page.title()).toBe(this.manageReviewBodiesPageData.Manage_Review_Body_Page.title);
   }
 
+  async searchAndClickReviewBodyProfile(reviewBodyName: string, reviewBodyStatus: string) {
+    let dataFound = false;
+    while (!dataFound) {
+      const rowCount = await this.review_bodies_list_rows.count();
+      for (let i = rowCount - 1; i > 0; i--) {
+        const organisationNameText = await this.review_bodies_list_rows
+          .nth(i)
+          .locator(this.organisation_name_from_list)
+          .textContent();
+        const organisationStatusText = await this.review_bodies_list_rows
+          .nth(i)
+          .locator(this.status_from_list)
+          .textContent();
+        if (organisationNameText?.trim() === reviewBodyName && organisationStatusText?.trim() === reviewBodyStatus) {
+          await this.review_bodies_list_rows.nth(i).getByText('View/Edit').click();
+          dataFound = true;
+          break;
+        }
+      }
+      // This code need to be updated when pagination enabled in manage review bodies page
+      if (!dataFound) {
+        throw new Error('Review body, Data not found');
+      }
+    }
+  }
+
   async getRowByOrgName(orgName: string, exactMatch: boolean) {
     return this.mainPageContent.locator('tr', {
       has: this.page.locator('td').getByText(`${orgName}`, { exact: exactMatch }),
     });
   }
+
+  async getOrgNamesListFromUI() {
+    const orgNames: string[] = [];
+    const rowCount = await this.orgListRows.count();
+    for (let i = 1; i < rowCount; i++) {
+      const columns = this.orgListRows.nth(i).getByRole('cell');
+      const orgValue = confirmStringNotNull(await columns.nth(0).textContent());
path: src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesPage.ts
user: login: vijay-kumar-hra
body: updated as per the review comments 
created_at: 2025-04-10T19:41:07Z
author_association: COLLABORATOR
diff_hunk: @@ -63,3 +66,17 @@ When(
     await expect(reviewBodyProfilePage.description_value).toHaveText(dataset.description_text);
   }
 );
+
+Then(
+  'I can see the list is sorted by default in the alphabetical order of {string}',
+  async ({ manageReviewBodiesPage }) => {
+    const OrgNames: string[] = await manageReviewBodiesPage.getOrgNamesListFromUI();
+    const sortedOrgNames = [...OrgNames].sort((a, b) => a.localeCompare(b, 'en', { sensitivity: 'base' }));
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
user: login: vijay-kumar-hra
body: updated as per the review comments 
created_at: 2025-04-10T19:41:15Z
author_association: COLLABORATOR
diff_hunk: @@ -171,6 +171,30 @@ Feature: Run Axe Accessibilty Test Tool Against App Pages
     And I analyse the results from the Axe scan
     Then I expect to receive no WCAG Violations
 
+  @axeAccessibilityManageReviewBodiesList @adminUser
path: tests/features/cross-compatible/accessibility/AxeAccessibility.feature
user: login: vijay-kumar-hra
body: Removed accessibility scenarios as per the review comments 
created_at: 2025-04-10T19:42:30Z
author_association: COLLABORATOR
diff_hunk: @@ -171,6 +171,30 @@ Feature: Run Axe Accessibilty Test Tool Against App Pages
     And I analyse the results from the Axe scan
     Then I expect to receive no WCAG Violations
 
+  @axeAccessibilityManageReviewBodiesList @adminUser
+  Scenario: Manage Review Bodies list page
+    Given I have navigated to the 'Home_Page'
+    When I click the 'System_Admin' link on the 'Banner'
+    Then I can see the 'System_Administration_Page'
+    When I click the 'Manage_Review_Bodies' link on the 'System_Administration_Page'
+    Then I can see the manage review bodies list page
+    When I Scan the page with the Axe Accessibilty Tool
+    And I analyse the results from the Axe scan
+    Then I expect to receive no WCAG Violations
+
+  @axeAccessibilityManageReviewBodyProfile @adminUser
path: tests/features/cross-compatible/accessibility/AxeAccessibility.feature
user: login: vijay-kumar-hra
body: Removed accessibility scenarios as per the review comments 
created_at: 2025-04-10T19:42:35Z
author_association: COLLABORATOR
diff_hunk: @@ -77,3 +77,17 @@ Then(
     await selectedReviewBodyRow.locator(manageReviewBodiesPage.actionsLink).click();
   }
 );
+
+Then(
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesSteps.ts
user: login: vijay-kumar-hra
body: updated if condition and  toLowerCase(). Need to select active and disabled review bodies based on organisation name and Status field when both matches, also when pagination is enabled, we need to modify this method to search multiple pages to pick the review bodies
created_at: 2025-04-10T19:45:53Z
author_association: COLLABORATOR
diff_hunk: @@ -77,3 +77,17 @@ Then(
     await selectedReviewBodyRow.locator(manageReviewBodiesPage.actionsLink).click();
   }
 );
+
+Then(
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesSteps.ts
user: login: Chris-McNeill-PA-HRA
body: Fair enough but you need to add the click to the else statement here, your getting the Row and doing nothing with it

```
const reviewBodyRow = await manageReviewBodiesPage.getRowByOrgName(await createReviewBodyPage.getUniqueOrgName(), true);
await reviewBodyRow.click();
```
created_at: 2025-04-11T10:46:22Z
author_association: COLLABORATOR
diff_hunk: @@ -63,3 +66,17 @@ When(
     await expect(reviewBodyProfilePage.description_value).toHaveText(dataset.description_text);
   }
 );
+
+Then(
+  'I can see the list is sorted by default in the alphabetical order of {string}',
+  async ({ manageReviewBodiesPage }) => {
+    const OrgNames: string[] = await manageReviewBodiesPage.getOrgNamesListFromUI();
+    const sortedOrgNames = [...OrgNames].sort((a, b) => a.localeCompare(b, 'en', { sensitivity: 'base' }));
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
user: login: Chris-McNeill-PA-HRA
body: You haven't removed the [...] surrounding orgName as requested
` const sortedOrgNames = orgNames.sort(`........
created_at: 2025-04-11T10:49:30Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,74 @@
+import { expect, Locator, Page } from '@playwright/test';
+import * as manageReviewBodiesPageData from '../../../../../resources/test_data/iras/reviewResearch/userAdministration/manageReviewBodies/pages/manage_review_body_page_data.json';
+import * as linkTextData from '../../../../../resources/test_data/common/link_text_data.json';
+
+//Declare Page Objects
+export default class ManageReviewBodiesPage {
+  readonly page: Page;
+  readonly manageReviewBodiesPageData: typeof manageReviewBodiesPageData;
+  readonly linkTextData: typeof linkTextData;
+  readonly pageHeading: Locator;
+  readonly addNewReviewBodyRecordLink: Locator;
+  readonly mainPageContent: Locator;
+  readonly review_bodies_list_rows: Locator;
+  readonly organisation_name_from_list: Locator;
+  readonly status_from_list: Locator;
+
+  //Initialize Page Objects
+  constructor(page: Page) {
+    this.page = page;
+    this.manageReviewBodiesPageData = manageReviewBodiesPageData;
+    this.linkTextData = linkTextData;
+
+    //Locators
+    this.pageHeading = this.page
+      .getByRole('heading')
+      .getByText(this.manageReviewBodiesPageData.Manage_Review_Body_Page.heading);
+    this.mainPageContent = this.page.getByTestId('main-content');
+    this.addNewReviewBodyRecordLink = this.mainPageContent.getByText(
+      this.linkTextData.Manage_Review_Bodies_Page.Add_New_Review_Body_Record,
+      {
+        exact: true,
+      }
+    );
+    this.review_bodies_list_rows = this.page.locator('table tbody tr');
+    this.organisation_name_from_list = this.page.locator('td:nth-child(1)');
+    this.status_from_list = this.page.locator('td:nth-child(3)');
+  }
+
+  //Page Methods
+  async goto() {
+    await this.page.goto('reviewbody/view');
+  }
+
+  async assertOnManageReviewBodiesPage() {
+    await expect(this.pageHeading).toBeVisible();
+    expect(await this.page.title()).toBe(this.manageReviewBodiesPageData.Manage_Review_Body_Page.title);
+  }
+
+  async searchAndClickReviewBodyProfile(reviewBodyName: string, reviewBodyStatus: string) {
path: src/pages/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesPage.ts
user: login: vijay-kumar-hra
body: Used getRowByOrgName method for selecting the new record and using searchAndClick method for selecting the existing review body with status (Active/Disabled)
created_at: 2025-04-11T11:40:15Z
author_association: COLLABORATOR
diff_hunk: @@ -63,3 +66,17 @@ When(
     await expect(reviewBodyProfilePage.description_value).toHaveText(dataset.description_text);
   }
 );
+
+Then(
+  'I can see the list is sorted by default in the alphabetical order of {string}',
+  async ({ manageReviewBodiesPage }) => {
+    const OrgNames: string[] = await manageReviewBodiesPage.getOrgNamesListFromUI();
+    const sortedOrgNames = [...OrgNames].sort((a, b) => a.localeCompare(b, 'en', { sensitivity: 'base' }));
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ReviewBodyProfileSteps.ts
user: login: vijay-kumar-hra
body: Fixed as per the review comments and dry run is successful 
created_at: 2025-04-11T11:40:59Z
author_association: COLLABORATOR
diff_hunk: @@ -77,3 +77,17 @@ Then(
     await selectedReviewBodyRow.locator(manageReviewBodiesPage.actionsLink).click();
   }
 );
+
+Then(
path: src/steps/IRAS/reviewResearch/userAdministration/manageReviewBodies/ManageReviewBodiesSteps.ts
user: login: vijay-kumar-hra
body: updated as per the review comments and dry run is successful 
created_at: 2025-04-11T11:41:33Z
author_association: COLLABORATOR

PR comments:
user: login: sonarqubecloud[bot]
created_at: 2025-04-11T14:19:28Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=HealthResearchAuthority_rsp-iras-qa&pullRequest=15) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=HealthResearchAuthority_rsp-iras-qa&pullRequest=15&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=HealthResearchAuthority_rsp-iras-qa&pullRequest=15&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=HealthResearchAuthority_rsp-iras-qa&pullRequest=15&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=HealthResearchAuthority_rsp-iras-qa&pullRequest=15&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=HealthResearchAuthority_rsp-iras-qa&pullRequest=15&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=HealthResearchAuthority_rsp-iras-qa&pullRequest=15)


author_association: NONE