Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Conditional Rendering of TextAreaFormField for Sample Test Type #8960

Open
wants to merge 16 commits into
base: develop
Choose a base branch
from

Conversation

JavidSumra
Copy link
Contributor

@JavidSumra JavidSumra commented Oct 29, 2024

Proposed Changes

@ohcnetwork/care-fe-code-reviewers

Merge Checklist

  • Add specs that demonstrate bug / test a new feature.
  • Update product documentation.
  • Ensure that UI text is kept in I18n files.
  • Prep screenshot or demo video for changelog entry, and attach it to issue.
  • Request for Peer Reviews
  • Completion of QA

Summary by CodeRabbit

Release Notes

  • New Features

    • Added internationalization support for dynamic translation of text in the Sample Details component, enhancing accessibility for users in different languages.
    • Introduced new test cases for patient file uploads, including audio recording and file modification permissions.
    • Added a new test suite for the "Patient Doctor Connect" feature, improving testing coverage for patient-doctor interactions.
  • Bug Fixes

    • Adjusted conditional rendering logic in the SampleTest component for better display of sample type details.
  • Documentation

    • Updated localization entries to include new medical terms and improve clarity in the patient management system.

@JavidSumra JavidSumra requested a review from a team as a code owner October 29, 2024 08:33
Copy link

netlify bot commented Oct 29, 2024

Deploy Preview for care-ohc failed.

Name Link
🔨 Latest commit dfbb14a
🔍 Latest deploy log https://app.netlify.com/sites/care-ohc/deploys/672c4946d267dd0008e5a8f6

@JavidSumra JavidSumra changed the title update condition to render component Fix Conditional Rendering of TextAreaFormField for Sample Test Type Oct 29, 2024
Copy link
Member

@rithviknishad rithviknishad left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

solves the mentioned issue; but in the sample details page, the sample test type details (value entered in the text area) is not being shown. let's fix that too

image image

@JavidSumra
Copy link
Contributor Author

JavidSumra commented Oct 29, 2024

@rithviknishad Can I add extra space after type for that or just display it inline?

@rithviknishad
Copy link
Member

you can add it to the right (2nd col. of the grid) like others

@JavidSumra
Copy link
Contributor Author

@rithviknishad requested changes done

src/components/Patient/SampleDetails.tsx Outdated Show resolved Hide resolved
{sampleDetails?.sample_type === "OTHER TYPE" && (
<div>
<span className="font-semibold capitalize leading-relaxed">
Sample Type Description:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add a space after the colon, similar to what's there for other titles.

On a side note, now's probably the time to add in translations for these titles.

Copy link
Contributor Author

@JavidSumra JavidSumra Oct 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So shall I need to add translation for each field title?
@Jacobjeevan

@khavinshankar
Copy link
Member

@Jacobjeevan @rithviknishad can u please re-review this

@nihal467
Copy link
Member

nihal467 commented Nov 4, 2024

@gigincg There is no product requirement for adding a text box for selecting other sample test types in the sample test request form. Can you provide insight into whether it's a required change or not?

@nihal467 nihal467 added the question Further information is requested label Nov 4, 2024
@JavidSumra
Copy link
Contributor Author

Hey @nihal467 I'm not adding textbox it's already present but with the wrong condition for rendering.

@nihal467 nihal467 removed the question Further information is requested label Nov 5, 2024
@nihal467
Copy link
Member

nihal467 commented Nov 5, 2024

@JavidSumra
image

In the Sample Test History section on the Patient Details page, the "Other Type" sample request is currently displaying the Sample Test Type Details description under the Sample Test heading. Please update it to display "Other Type" instead.

Copy link

coderabbitai bot commented Nov 5, 2024

Walkthrough

The changes in this pull request enhance internationalization (i18n) support across several components, primarily by integrating the useTranslation hook from the react-i18next library. This allows for dynamic translation of text strings in the SampleDetails, SampleTest, and SampleTestCard components. Additionally, modifications were made to the conditional rendering logic in the SampleTest component and simplifications in the SampleTestCard component. Various import statements were reorganized in the Cypress test files, and new localization keys were added to the English JSON file for improved user interface adaptability.

Changes

File Change Summary
src/components/Patient/SampleDetails.tsx Integrated i18n support using useTranslation, updated labels and messages for translation.
src/components/Patient/SampleTest.tsx Modified conditional rendering logic for TextAreaFormField to check for "9" instead of "OTHER TYPE".
src/components/Patient/SampleTestCard.tsx Simplified display logic for sample_type, now always displays sample_type in lowercase.
public/locale/en.json Added multiple new key-value pairs for localization support.
cypress/e2e/assets_spec/AssetHomepage.cy.ts Reordered import statements.
cypress/e2e/assets_spec/AssetsCreation.cy.ts Reordered imports, added AssetSearchPage.
cypress/e2e/assets_spec/AssetsManage.cy.ts Reordered import statements.
cypress/e2e/facility_spec/FacilityCreation.cy.ts Reordered import statements.
cypress/e2e/facility_spec/FacilityHomepage.cy.ts Reorganized imports and updated references.
cypress/e2e/facility_spec/FacilityInventory.cy.ts Reordered import statements.
cypress/e2e/facility_spec/FacilityManage.cy.ts Reordered import statements.
cypress/e2e/patient_spec/PatientBedManagement.cy.ts Removed duplicate import of PatientConsultationPage.
cypress/e2e/patient_spec/PatientConsultationCreation.cy.ts Added several previously commented-out imports, adjusted order.
cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts Introduced a new test suite for "Patient Doctor Connect" functionality.
cypress/e2e/patient_spec/PatientFileUpload.ts Added tests for patient file upload functionalities.
cypress/e2e/patient_spec/PatientLogUpdate.cy.ts Added import for PatientLogupdate class.
cypress/e2e/patient_spec/PatientPrescription.cy.ts Corrected import statement for PatientPrescription.
cypress/e2e/patient_spec/PatientRegistration.cy.ts Updated imports, added PatientTransfer and generatePhoneNumber, removed FacilityPage.
cypress/e2e/resource_spec/ResourcesHomepage.cy.ts Reordered import statements.
cypress/e2e/users_spec/UsersCreation.cy.ts Modified import statements and added utility function.
cypress/e2e/users_spec/UsersManage.cy.ts Added import for UserPage.

Assessment against linked issues

Objective Addressed Explanation
Text area should be visible when "Other Type" is selected in Sample Test Type (#8958)

Possibly related PRs

Suggested labels

needs review, tested, P1

Suggested reviewers

  • rithviknishad
  • khavinshankar

🐰 In the code we hop and play,
With translations brightening the day.
From tests to imports, all in line,
Our app now speaks in every sign!
So let’s rejoice, with joy we sing,
For every language, our changes bring! 🎉


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (6)
src/components/Patient/SampleTest.tsx (1)

Line range hint 217-222: Consider internationalizing the field label

The label "Sample Test Type Details" is hardcoded. Consider using the i18n translation key for consistency with other internationalized strings.

 {state.form.sample_type === "9" && (
   <TextAreaFormField
-    {...field("sample_type_other", "Sample Test Type Details")}
+    {...field("sample_type_other", t("sample_test_details"))}
     required
   />
 )}

Note: This assumes you have the useTranslation hook set up and the translation key exists in your locale files.

src/components/Patient/SampleDetails.tsx (2)

456-463: Consider moving "OTHER TYPE" to constants

The conditional rendering fix looks good and addresses the visibility issue. However, consider moving the "OTHER TYPE" string to the constants file to maintain consistency with other type choices.

- {sampleDetails?.sample_type === "OTHER TYPE" && (
+ {sampleDetails?.sample_type === TEST_TYPE_CHOICES.OTHER_TYPE && (

270-271: Standardize spacing in translation strings

There are inconsistencies in how spaces are handled around colons in translations:

  • Some have space after colon: {t("status")}:
  • Some don't: {t("created_on")}:
  • Some include space in key: {t("is_atypical_presentation")}

Consider standardizing this across all translations for consistent UI rendering.

Example standardization:

- {t("status")}: 
+ {t("status")}:{" "}

- {t("created_on")}:
+ {t("created_on")}:{" "}

- {t("is_atypical_presentation")} 
+ {t("is_atypical_presentation")}:{" "}

Also applies to: 280-281, 401-401, 407-407

src/Locale/en.json (3)

306-306: Inconsistent abbreviation formatting in medical terms.

The medical abbreviations are formatted inconsistently:

  • "ari": "ARI - Acute Respiratory illness"
  • "sari": "SARI - Severe Acute Respiratory illness"

Note the inconsistent capitalization of "illness" in both entries.

Apply this diff to maintain consistency:

-  "ari": "ARI - Acute Respiratory illness",
+  "ari": "ARI - Acute Respiratory Illness",
-  "sari": "SARI - Severe Acute Respiratory illness",
+  "sari": "SARI - Severe Acute Respiratory Illness",

Also applies to: 1102-1102


484-485: Maintain consistent capitalization in related terms.

The carrier contact status terms have inconsistent capitalization:

Apply this diff for consistency:

-  "contact_with_confirmed_carrier": "Contact with confirmed carrier",
-  "contact_with_suspected_carrier": "Contact with suspected carrier",
+  "contact_with_confirmed_carrier": "Contact with Confirmed Carrier",
+  "contact_with_suspected_carrier": "Contact with Suspected Carrier",

1098-1101: Group related sample test translations together.

The sample test related translations are currently scattered. Consider grouping them together with a common prefix for better maintainability.

Apply this diff to improve organization:

-  "sample_test_details": "Sample Test Details",
-  "sample_test_history": "Sample Test History",
-  "sample_type": "Sample Type",
-  "sample_type_description": "Sample Type Description",
+  "sample__details": "Sample Test Details",
+  "sample__history": "Sample Test History",
+  "sample__type": "Sample Type",
+  "sample__type_description": "Sample Type Description",
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 5877d9b and 0e98beb.

📒 Files selected for processing (3)
  • src/Locale/en.json (15 hunks)
  • src/components/Patient/SampleDetails.tsx (6 hunks)
  • src/components/Patient/SampleTest.tsx (1 hunks)
🔇 Additional comments (4)
src/components/Patient/SampleTest.tsx (3)

Line range hint 89-94: LGTM: Validation logic is consistent

The validation logic correctly checks for the required sample type details when type "9" is selected, maintaining consistency with the rendering condition.


Line range hint 144-148: LGTM: Submission handling is correct

The submission logic correctly handles the conditional inclusion of sample_type_other in the API request, maintaining consistency with the rendering and validation logic.


Line range hint 217-222: Verify SAMPLE_TYPE_CHOICES constant values

The condition has been changed to use "9" as the identifier for "Other Type". While this matches the pattern of using numeric IDs, we should verify that this matches the constant definition.

✅ Verification successful

The condition correctly matches the constant definition

The verification confirms that id: "9" corresponds to "OTHER TYPE" in the SAMPLE_TYPE_CHOICES constant, making the conditional check in the component accurate and consistent with the data structure.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for SAMPLE_TYPE_CHOICES definition
rg "SAMPLE_TYPE_CHOICES.*=.*" -A 10

Length of output: 700

src/components/Patient/SampleDetails.tsx (1)

17-20: LGTM: Clean i18n integration

The integration of react-i18next is done correctly with proper hook initialization.

Comment on lines 907 to 908
"number_of_aged_dependents": "Number of Aged Dependents (Above 60)",
"number_of_aged_dependents_above_60": "Number Of Aged Dependents (Above 60)",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Remove duplicate translation key.

There are two keys for the same translation with slightly different text:

Remove the duplicate key:

-  "number_of_aged_dependents": "Number of Aged Dependents (Above 60)",
-  "number_of_aged_dependents_above_60": "Number Of Aged Dependents (Above 60)",
+  "number_of_aged_dependents": "Number of Aged Dependents (Above 60)",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"number_of_aged_dependents": "Number of Aged Dependents (Above 60)",
"number_of_aged_dependents_above_60": "Number Of Aged Dependents (Above 60)",
"number_of_aged_dependents": "Number of Aged Dependents (Above 60)",

…f github.com:JavidSumra/care_fe into issues/8958/fix-other-type-text-area
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (3)
src/components/Patient/SampleTestCard.tsx (1)

Line range hint 1-190: Consider enhancing the component to support additional details display.

Given that this PR aims to fix the visibility of additional details for "Other Type" samples, this component might need to be updated to display those details when present. Consider:

  1. Adding a section to display the additional details when sample_type is "Other Type"
  2. Ensuring consistent capitalization and display format across all sample type displays

Would you like help implementing these enhancements to maintain consistency with the text area feature being added?

src/components/Patient/SampleDetails.tsx (2)

456-463: Consider using constants for sample type comparison

While the conditional rendering is correct, using a hardcoded string "OTHER TYPE" could lead to maintainability issues. Consider using a constant from TEST_TYPE_CHOICES that's already imported.

-          {sampleDetails?.sample_type === "OTHER TYPE" && (
+          {sampleDetails?.sample_type === TEST_TYPE_CHOICES.find(t => t.text === "Other Type")?.id && (

401-401: Maintain consistent spacing after colons in translations

Some translation strings have inconsistent spacing after colons. For better maintainability and consistent UI, standardize the spacing across all translations.

-              {t("is_atypical_presentation")}{" "}
+              {t("is_atypical_presentation")}:{" "}
-              {t("is_unusual_course")}{" "}
+              {t("is_unusual_course")}:{" "}
-              {t("contact_with_confirmed_carrier")}{" "}
+              {t("contact_with_confirmed_carrier")}:{" "}
-              {t("contact_with_suspected_carrier")}{" "}
+              {t("contact_with_suspected_carrier")}:{" "}

Also applies to: 407-407, 429-429, 435-435

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 0e98beb and 97bb3f6.

📒 Files selected for processing (2)
  • src/components/Patient/SampleDetails.tsx (6 hunks)
  • src/components/Patient/SampleTestCard.tsx (1 hunks)
🔇 Additional comments (1)
src/components/Patient/SampleDetails.tsx (1)

17-20: LGTM: i18n setup is correct

The useTranslation hook is properly imported and initialized following React hooks conventions.

? itemData.sample_type
: itemData.sample_type_other
)?.toLowerCase()}
{itemData.sample_type?.toLowerCase()}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Based on the search results, I can now provide a final response as we have sufficient context about the sample type handling in the codebase:

The change to lowercase is inconsistent with the established sample type handling pattern

The codebase shows that sample types are handled consistently across multiple components with specific handling for "OTHER TYPE":

  • In SampleDetails.tsx, the sample type is displayed with proper casing using startCase(camelCase()) and has explicit handling for "OTHER TYPE"
  • In SampleTest.tsx, there's specific logic for sample type "9" (OTHER TYPE) that shows additional details
  • The SAMPLE_TYPE_CHOICES constant in constants.tsx defines "OTHER TYPE" in uppercase

The current change to unconditionally convert the sample type to lowercase breaks this consistency and could affect the visibility logic for the "Other Type" additional details field.

Locations that need attention:

  • src/components/Patient/SampleTestCard.tsx: Revert the lowercase conversion to maintain consistency with other components
  • Consider using the same text transformation (startCase(camelCase())) as used in SampleDetails.tsx
🔗 Analysis chain

Verify the relationship between this change and the PR objectives.

This change simplifies the sample type display logic, but it's unclear how it relates to fixing the text area visibility issue for "Other Type" selections. Additionally, this modification might affect the display consistency mentioned in the PR comments where "Other Type" sample requests need specific handling.

Let's verify the impact:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for other components that handle "OTHER TYPE" display
rg -i "OTHER.*TYPE" --type ts --type tsx

# Check for any existing special handling of sample types
ast-grep --pattern 'sample_type.*OTHER'

Length of output: 112


Script:

#!/bin/bash
# Search for "OTHER TYPE" case-insensitively with proper file extension
rg -i "OTHER.*TYPE" -t ts -t tsx

# Search for sample type handling patterns
rg -i "sample_type" -t ts -t tsx -A 2

# Look for conditional rendering related to sample types
ast-grep --pattern 'if ($_ && $_.sample_type) {
  $$$
}'

Length of output: 187


Script:

#!/bin/bash
# Search for "OTHER TYPE" case-insensitively in all files
rg -i "OTHER.*TYPE"

# Search for sample type handling patterns in all files
rg -i "sample_type" -A 2

# Look for files that might contain sample type handling
fd -e ts -e tsx -e js -e jsx

Length of output: 34469

@github-actions github-actions bot added the merge conflict pull requests with merge conflict label Nov 6, 2024
Copy link

github-actions bot commented Nov 6, 2024

👋 Hi, @JavidSumra,
Conflicts have been detected against the base branch. Please rebase your branch against the base branch.


This message is automatically generated by prince-chrismc/label-merge-conflicts-action so don't hesitate to report issues/improvements there.

@github-actions github-actions bot added the Deploy-Failed Deplyment is not showing preview label Nov 7, 2024
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (22)
cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts (3)

1-4: Standardize import paths for better maintainability.

Consider using consistent relative paths for all imports. The pageobject/Patient/PatientDoctorConnect import uses a different style compared to the others.

-import { DoctorConnect } from "pageobject/Patient/PatientDoctorConnect";
+import { DoctorConnect } from "../../pageobject/Patient/PatientDoctorConnect";

Line range hint 6-13: Consider moving test data to fixtures.

The hardcoded test data (patient name, user names) should be moved to Cypress fixtures for better maintainability and reusability across tests.

Example structure:

// cypress/fixtures/users.json
{
  "patient": "Dummy Patient 11",
  "doctor": "Dev Doctor",
  "nurse": "Dev Staff",
  "teleIcuDoctor": "Dev Doctor Two"
}

Line range hint 26-52: Improve test organization and reliability.

The current test case combines multiple functionalities (icon verification, copy functionality, sorting). Consider:

  1. Split into smaller, focused test cases for better maintainability and debugging
  2. Add explicit wait strategies instead of relying on implicit waits
  3. Add error handling for potential failure scenarios

Example refactor:

it("should display correct users under respective sections", () => {
  patientPage.visitPatient(patientName);
  doctorconnect.clickDoctorConnectButton();
  
  cy.get("#doctor-connect-home-doctor").should("be.visible")
    .within(() => {
      cy.contains(doctorUser).should("exist");
    });
  // Similar checks for nurse and teleICU
});

it("should copy phone number correctly", () => {
  // Test only copy functionality
});

it("should filter users correctly by type", () => {
  // Test only sorting functionality
});
cypress/e2e/resource_spec/ResourcesHomepage.cy.ts (1)

Line range hint 24-89: Consider enhancing test robustness with these improvements.

While the test cases are well-structured, consider the following improvements:

  1. Generate phone numbers dynamically to avoid potential conflicts
  2. Extract notification messages to constants
  3. Use dynamic or configurable facility search values
  4. Make network interception more specific with exact endpoint patterns

Example improvements:

+ const TEST_DATA = {
+   NOTIFICATIONS: {
+     RESOURCE_CREATED: "Resource request created successfully",
+     RESOURCE_UPDATED: "Resource request updated successfully",
+     COMMENT_ADDED: "Comment added successfully"
+   },
+   FACILITY_SEARCH: "dummy facility 40"  // Consider moving to test config
+ };

- const phone_number = "9999999999";
+ const phone_number = `9${Math.floor(Math.random() * 1000000000)}`;

- cy.intercept("GET", "**/api/v1/facility/**").as("loadFacilities");
+ cy.intercept("GET", "**/api/v1/facility/[0-9]+/").as("loadFacilities");

- cy.get("#search").click().type("dummy facility 40");
+ cy.get("#search").click().type(TEST_DATA.FACILITY_SEARCH);

- facilityPage.verifySuccessNotification("Resource request created successfully");
+ facilityPage.verifySuccessNotification(TEST_DATA.NOTIFICATIONS.RESOURCE_CREATED);
cypress/e2e/patient_spec/PatientFileUpload.ts (4)

Line range hint 9-24: Consider moving test data to fixtures.

While the test setup is well-structured, hardcoded test data like patient names and file names should be moved to Cypress fixtures for better maintainability and test isolation.

Example implementation:

// cypress/fixtures/patient-files.json
{
  "patients": {
    "audioTest": "Dummy Patient 3",
    "fileUpload": "Dummy Patient 4",
    "permissionTest": "Dummy Patient 5"
  },
  "files": {
    "audio": "cypress audio",
    "document": "cypress name",
    "renamed": "cypress modified name"
  }
}

Then in the test:

let testData: any;

before(() => {
  cy.fixture('patient-files').then((data) => {
    testData = data;
  });
  loginPage.loginAsDistrictAdmin();
  cy.saveLocalStorage();
});

Line range hint 46-65: Add retry logic for file upload notifications.

The file upload test may be flaky due to timing issues with notifications. Consider adding retry logic and better assertions.

Example implementation:

it("Upload a File and archive it", () => {
  // ... existing code ...
  
  // More robust notification check
  cy.get('[data-testid="notification"]', { timeout: 10000 })
    .should('be.visible')
    .and('contain', 'File Uploaded Successfully');
    
  // Verify file presence with retries
  cy.get('[data-testid="uploaded-files"]', { timeout: 10000 })
    .should('exist')
    .and('contain', cypressFileName);
});

Line range hint 66-106: Improve security and maintainability of permission tests.

The permission test has several areas for improvement:

  1. Credentials should not be hardcoded

  2. User roles should be more explicitly defined

  3. Permission checks should be more comprehensive

  4. Move credentials to environment variables or Cypress.env():

// cypress.config.ts
export default {
  env: {
    nurse1Username: 'dummynurse1',
    nurse1Password: 'Coronasafe@123',
    nurse2Username: 'dummynurse2',
    nurse2Password: 'Coronasafe@123'
  }
}
  1. Refactor the permission test:
it("User-level Based Permission for File Modification", () => {
  const users = {
    nurse1: { username: Cypress.env('nurse1Username'), password: Cypress.env('nurse1Password'), canEdit: true },
    nurse2: { username: Cypress.env('nurse2Username'), password: Cypress.env('nurse2Password'), canEdit: false },
    admin: { loginFn: loginPage.loginAsDistrictAdmin, canEdit: true }
  };

  // Test each user's permissions
  Object.entries(users).forEach(([role, user]) => {
    if (user.loginFn) {
      user.loginFn();
    } else {
      loginPage.login(user.username, user.password);
    }
    cy.reload();
    
    // Verify permissions
    patientFileUpload.verifyFileRenameOption(user.canEdit);
    if (user.canEdit) {
      // Verify edit functionality
      patientFileUpload.verifyEditOperations();
    }
  });
});

Line range hint 108-116: Improve test context naming for clarity.

While the test reuse is efficient, the context descriptions could be more explicit about the different entry points and their implications.

-  "Patient File upload in patient details page",
+  "Patient File Upload: Via Patient Details Page Icon",
-  "Patient File upload in patient consultation page",
+  "Patient File Upload: Via Consultation Page File Tab",
cypress/e2e/users_spec/UsersManage.cy.ts (1)

Line range hint 1-168: Consider improving test reliability by addressing potential flakiness.

While reviewing the test implementation, I noticed a few areas that could be improved:

  1. There are explicit wait statements (cy.wait(5000)) with comments like "temporary hack to fix the failure". These fixed waits can make tests flaky and slow.
  2. The tests rely heavily on UI text matching which can be fragile if the text changes.

Consider these improvements:

  1. Replace cy.wait() with more reliable Cypress commands:
- cy.wait(5000); // temporary hack to fix the failure
+ cy.get('[data-testid=skills-list]').should('be.visible');
  1. Add data-testid attributes for critical elements and use them instead of text matching:
- manageUserPage.assertHomeFacility("No Home Facility");
+ manageUserPage.assertHomeFacility('[data-testid=no-home-facility]');
cypress/e2e/patient_spec/PatientRegistration.cy.ts (6)

Line range hint 1-31: Consider improving date handling for better maintainability.

The date formatting is currently hardcoded to 'en-IN' locale. Consider:

  1. Moving the locale to a configuration constant
  2. Using Cypress's built-in date handling utilities or a library like date-fns
+const DATE_LOCALE = 'en-IN';
+
 const getRelativeDateString = (deltaDays = 0) => {
   const date = new Date();
   if (deltaDays) {
     date.setDate(date.getDate() + deltaDays);
   }
   return date
     .toLocaleDateString(
-      "en-IN",
+      DATE_LOCALE,
       {
         day: "2-digit",
         month: "2-digit",
         year: "numeric",
       }
     )
     .replace(/\//g, "");
 };

Line range hint 33-85: Improve test data organization for better maintainability.

The test data is currently defined at the suite level with a mix of different concerns (patient details, insurance details, etc.). Consider:

  1. Organizing test data into separate fixtures
  2. Grouping related data into objects
// fixtures/patient.data.ts
export const patientOneData = {
  personal: {
    name: "Patient With No Consultation",
    gender: "Male",
    updatedGender: "Female",
    phone: generatePhoneNumber(),
    // ... other personal details
  },
  address: {
    street: "Test Patient Address",
    pincode: "682001",
    // ... other address details
  },
  insurance: {
    first: {
      subscriberId: "member id 01",
      // ... other first insurance details
    },
    second: {
      subscriberId: "member id 02",
      // ... other second insurance details
    }
  }
};

Line range hint 87-157: Break down large test case into smaller, focused tests.

The "Create a new patient" test case is too long and tests multiple functionalities. Consider:

  1. Breaking it down into smaller test cases focused on specific features
  2. Using beforeEach to set up common test data
describe("Patient Creation", () => {
  beforeEach(() => {
    // Common setup code
  });

  it("should create patient with basic details", () => {
    // Test basic patient creation
  });

  it("should handle medical history correctly", () => {
    // Test medical history specific functionality
  });

  // ... more focused test cases
});

Line range hint 159-262: Replace arbitrary waits with proper assertions.

The test uses multiple cy.wait(3000) calls which can make tests flaky. Replace them with proper Cypress commands that wait for specific conditions.

- cy.wait(3000);
+ cy.get('[data-testid=patient-form]').should('be.visible');

- cy.wait(5000);
+ cy.get('[data-testid=patient-details]').should('exist');

Line range hint 264-307: Add error handling for network requests.

The patient transfer test case should handle network failures gracefully. Consider:

  1. Adding proper intercepts for network requests
  2. Adding error scenarios
it("should handle patient transfer errors", () => {
  cy.intercept('POST', '/api/transfer', {
    statusCode: 500,
    body: { error: 'Internal Server Error' }
  }).as('transferError');

  // Test steps...

  cy.wait('@transferError');
  cy.get('[data-testid=error-message]')
    .should('be.visible')
    .and('contain', 'Transfer failed');
});

Add accessibility testing to enhance healthcare application compliance

The codebase currently lacks comprehensive accessibility testing. While there are some ARIA attributes and roles implemented across components, the test suite needs enhancement:

  • Add Cypress-Axe integration to cypress/support/e2e.ts
  • Include accessibility checks in PatientRegistration.cy.ts for critical flows:
    • Patient form completion
    • Medical history section
    • Insurance details form
    • Patient dashboard view

Example implementation:

import 'cypress-axe'

// Add before each test
beforeEach(() => {
  cy.injectAxe()
})

// Add after critical user interactions
cy.checkA11y()
🔗 Analysis chain

Line range hint 87-307: Add verification for accessibility attributes.

Given that this is a healthcare application, ensure proper accessibility testing is included.

Consider integrating Cypress Axe for automated accessibility testing:

import 'cypress-axe';

// In your test
it('should be accessible', () => {
  cy.injectAxe();
  cy.checkA11y();
});

Let me analyze the test file further to check for accessibility testing patterns.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for accessibility-related attributes in the codebase
echo "Checking for accessibility attributes..."
rg -i 'aria-|role=' --type ts

Length of output: 9117


Script:

#!/bin/bash
# Check for accessibility testing libraries and patterns
echo "Checking for accessibility testing setup..."
rg -i "cy\.checkA11y|cypress-axe" --type ts

# Check for data-testid attributes which are commonly used for testing
echo -e "\nChecking for test attributes..."
rg "data-testid" cypress/e2e/patient_spec/PatientRegistration.cy.ts

Length of output: 333

cypress/e2e/patient_spec/PatientLogUpdate.cy.ts (4)

Line range hint 65-93: Consider enhancing test isolation and error handling.

The test modifies patient state without cleanup, which could affect subsequent tests. Consider:

  1. Adding cleanup in afterEach to reset patient state
  2. Adding error handling for network requests
  3. Using more specific assertions for notification messages

Example improvement:

 it("Create a new TeleIcu log update for a domicilary care patient", () => {
+    cy.intercept('POST', '**/api/consultation/**').as('saveConsultation');
     patientPage.visitPatient(domicilaryPatient);
     patientConsultationPage.clickEditConsultationButton();
     patientConsultationPage.selectPatientSuggestion("Domiciliary Care");
     cy.submitButton("Update Consultation");
+    cy.wait('@saveConsultation').its('response.statusCode').should('eq', 200);
     cy.verifyNotification("Consultation updated successfully");
     // ... rest of the test
+    return cy.task('resetPatientState', domicilaryPatient); // Add cleanup
 });

Line range hint 95-166: Add data validation in Progress Note test.

The test creates a progress note but doesn't verify all the entered data. Consider:

  1. Validating the diagnosis data after submission
  2. Verifying investigation frequency
  3. Checking prescription details in the UI

Example improvement:

     cy.verifyNotification("Progress Note created successfully");
     cy.closeNotification();
+    // Verify saved data
+    cy.get('#diagnosis-section').within(() => {
+      cy.contains('1A06').should('be.visible');
+    });
+    cy.get('#investigation-section').within(() => {
+      cy.contains('Vitals (GROUP)').should('be.visible');
+      cy.contains('Every 6 hours').should('be.visible');
+    });

Line range hint 267-319: Enhance MEWS Score test reliability.

The MEWS Score test could be more robust:

  1. Add explicit wait for score calculation
  2. Verify exact score components
  3. Test edge cases for score calculation

Example improvement:

     patientLogupdate.typeRespiratory(patientRespiratory);
     cy.get("#consciousness_level-option-RESPONDS_TO_PAIN").click();
     cy.submitButton("Save");
     cy.verifyNotification("Brief Update created successfully");
     cy.closeNotification();
-    cy.verifyContentPresence("#consultation-buttons", ["9"]);
+    // Wait for score calculation and verify components
+    cy.get("#mews-score").should('be.visible').within(() => {
+      cy.get('[data-testid="total-score"]').should('have.text', '9');
+      cy.get('[data-testid="systolic-score"]').should('have.text', '2');
+      cy.get('[data-testid="respiratory-score"]').should('have.text', '3');
+      cy.get('[data-testid="consciousness-score"]').should('have.text', '2');
+    });

Line range hint 321-323: Enhance test cleanup for better isolation.

The afterEach hook only handles localStorage. Consider:

  1. Resetting patient data to initial state
  2. Cleaning up created logs
  3. Resetting any modified UI state

Example improvement:

   afterEach(() => {
     cy.saveLocalStorage();
+    // Reset patient data
+    cy.task('resetTestData', {
+      patients: [domicilaryPatient, patientOne, patientTwo, patientThree],
+      resetType: ['logs', 'consultations']
+    });
+    // Clear any open modals or notifications
+    cy.get('body').then($body => {
+      if ($body.find('.modal-open').length) {
+        cy.get('.modal-close-button').click();
+      }
+    });
   });
cypress/e2e/patient_spec/PatientConsultationCreation.cy.ts (1)

Line range hint 1-300: Comprehensive test coverage with well-structured scenarios.

The test suite demonstrates excellent practices:

  1. Proper use of page objects for maintainability
  2. Comprehensive coverage of various patient consultation scenarios
  3. Thorough validation of UI elements and workflows
  4. Good setup/teardown practices with localStorage management

However, considering the PR's objective of fixing the TextAreaFormField rendering for Sample Test Type, there seems to be a gap in test coverage.

Consider adding a test case to verify the TextAreaFormField visibility when "Other Type" is selected in the Sample Test Type dropdown. Here's a suggested test structure:

it("should display TextAreaFormField when Other Type is selected", () => {
  patientPage.createPatient();
  patientPage.selectFacility(facilityName);
  patientPredefined.createPatient();
  patientPage.patientformvisibility();
  patientPage.clickCreatePatient();
  patientPage.verifyPatientIsCreated();
  
  // Select Sample Test Type as "Other Type"
  patientConsultationPage.selectSampleTestType("Other Type");
  
  // Verify TextAreaFormField is visible
  cy.get("[data-testid=sample-test-details]")
    .should("be.visible")
    .and("not.be.disabled");
    
  // Verify TextAreaFormField accepts input
  const testDetails = "Custom test details";
  cy.get("[data-testid=sample-test-details]")
    .type(testDetails)
    .should("have.value", testDetails);
});
public/locale/en.json (2)

306-307: Ensure consistent abbreviation formatting.

The translation "ARI - Acute Respiratory illness" should maintain consistent capitalization.

-  "ari": "ARI - Acute Respiratory illness",
+  "ari": "ARI - Acute Respiratory Illness",

766-777: Ensure consistent boolean question formatting.

The translations for boolean questions should follow a consistent pattern.

-  "is_atypical_presentation": "Is Atypical presentation",
+  "is_atypical_presentation": "Is Atypical Presentation",
-  "is_unusual_course": "Is unusual course",
+  "is_unusual_course": "Is Unusual Course",
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 97bb3f6 and 3540c9e.

📒 Files selected for processing (18)
  • cypress/e2e/assets_spec/AssetHomepage.cy.ts (1 hunks)
  • cypress/e2e/assets_spec/AssetsCreation.cy.ts (1 hunks)
  • cypress/e2e/assets_spec/AssetsManage.cy.ts (1 hunks)
  • cypress/e2e/facility_spec/FacilityCreation.cy.ts (1 hunks)
  • cypress/e2e/facility_spec/FacilityHomepage.cy.ts (1 hunks)
  • cypress/e2e/facility_spec/FacilityInventory.cy.ts (1 hunks)
  • cypress/e2e/facility_spec/FacilityManage.cy.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientBedManagement.cy.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientConsultationCreation.cy.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientFileUpload.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientLogUpdate.cy.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientPrescription.cy.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientRegistration.cy.ts (1 hunks)
  • cypress/e2e/resource_spec/ResourcesHomepage.cy.ts (1 hunks)
  • cypress/e2e/users_spec/UsersCreation.cy.ts (1 hunks)
  • cypress/e2e/users_spec/UsersManage.cy.ts (1 hunks)
  • public/locale/en.json (15 hunks)
✅ Files skipped from review due to trivial changes (6)
  • cypress/e2e/assets_spec/AssetHomepage.cy.ts
  • cypress/e2e/assets_spec/AssetsCreation.cy.ts
  • cypress/e2e/assets_spec/AssetsManage.cy.ts
  • cypress/e2e/facility_spec/FacilityCreation.cy.ts
  • cypress/e2e/facility_spec/FacilityInventory.cy.ts
  • cypress/e2e/facility_spec/FacilityManage.cy.ts
🔇 Additional comments (21)
cypress/e2e/patient_spec/PatientBedManagement.cy.ts (2)

Line range hint 1-46: Verify the relevance of these changes to the PR objective.

This test file appears to be unrelated to the main PR objective of fixing the TextAreaFormField rendering for Sample Test Type. While the changes look correct, please clarify why these modifications are necessary as part of this PR.

Let's check for related changes in the Sample Test Type functionality:

#!/bin/bash
# Description: Look for related changes in Sample Test Type components and tests
# Expected: Find connections between these changes and the main PR objective

# Search for Sample Test Type related files
rg -l "SampleTest|TextAreaFormField" --type ts --type tsx

# Search for related test files
fd -e cy.ts -e spec.ts . cypress/e2e/ -x rg -l "Sample.*Test|TextArea"

2-2: LGTM! Verify the import usage across test files.

The import is correctly used within this test file for instantiating the patientConsultationPage object.

Let's verify if this import is consistently used across other test files:

✅ Verification successful

Import is correctly used and consistent with other test files

The PatientConsultationPage import is properly used in the test file and is consistent with its usage across other test files in the codebase. The search results show that:

  • The import is used in multiple test files: PatientBedManagement.cy.ts, PatientConsultationCreation.cy.ts, and PatientLogUpdate.cy.ts
  • In each file, it's used to instantiate the page object for testing consultation-related functionality
  • The specific usage in PatientBedManagement.cy.ts is for accessing the edit consultation button, which is required for the bed assignment test case
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for consistent usage of PatientConsultationPage across test files
# Expected: Find other test files that might need this import for consistency

# Search for PatientConsultationPage usage in other test files
rg -t ts "PatientConsultationPage" cypress/e2e/

Length of output: 160


Script:

#!/bin/bash
# Let's try a more comprehensive search strategy

# 1. Find all test files that use PatientConsultationPage (with context)
rg -A 5 "PatientConsultationPage" cypress/

# 2. Check the specific file content to understand the usage
cat "cypress/e2e/patient_spec/PatientBedManagement.cy.ts"

# 3. Check for any references to consultation page or related patterns
rg -i "consultation.*page" cypress/e2e/

Length of output: 17267

cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts (2)

Line range hint 54-56: LGTM!

The cleanup strategy using afterEach hook is appropriate and follows best practices.


Line range hint 15-24: Verify custom Cypress command implementation.

The test uses a custom awaitUrl command. Ensure this command is properly defined in your Cypress commands file.

✅ Verification successful

Let me try searching with a different pattern to ensure we don't miss any command definitions.


Let's check the implementation of the awaitUrl command in the commands file we found.


Custom command awaitUrl is properly implemented and widely used

The awaitUrl command is correctly defined in cypress/support/commands.ts and is used consistently across many test files. It provides URL navigation with built-in user verification by intercepting the getcurrentuser API call, which is a good practice for ensuring the application state is ready before proceeding with tests.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for awaitUrl command definition
rg -A 5 "Cypress.Commands.add\('awaitUrl'" || echo "Custom command 'awaitUrl' not found"

Length of output: 137


Script:

#!/bin/bash
# Search for awaitUrl in command files with different patterns
fd -e ts -e js "commands" --exec rg -l "awaitUrl"

# Also search for any file containing awaitUrl definition
rg -l "awaitUrl"

Length of output: 1693


Script:

#!/bin/bash
# Check the implementation of awaitUrl in commands.ts
rg -A 5 "awaitUrl" cypress/support/commands.ts

Length of output: 249

cypress/e2e/resource_spec/ResourcesHomepage.cy.ts (3)

1-4: LGTM! Well-organized imports following page object pattern.

The imports are cleanly organized and follow the page object pattern, which promotes test maintainability and reusability.


Line range hint 6-22: LGTM! Robust test setup with proper state management.

The test setup follows Cypress best practices:

  • Proper initialization of page objects
  • Efficient state management using local storage
  • Clear URL verification for test context

Line range hint 1-89: Verify if these changes belong in this PR.

This file appears to be tangential to the main PR objective of fixing the TextAreaFormField rendering issue. While the changes are clean, consider whether they should be part of a separate PR focused on test organization.

cypress/e2e/patient_spec/PatientFileUpload.ts (2)

Line range hint 1-8: LGTM! Well-structured page object setup.

The code follows the page object pattern effectively, improving test maintainability and reusability.


Line range hint 25-45: Add error handling and file content verification for audio upload test.

The audio recording test should:

  1. Verify the uploaded file type is correct
  2. Handle potential upload failures
  3. Verify the downloaded file matches the uploaded content

Example implementation:

it("Record an Audio and download the file", () => {
  // ... existing code ...
  
  // Verify file type
  patientFileUpload.verifyUploadFilePresence(cypressAudioName)
    .find('[data-testid="file-type"]')
    .should('contain', 'audio');
    
  // Handle upload failure
  cy.on('fail', (error) => {
    if (error.message.includes('File Upload Failed')) {
      // Handle the error appropriately
      cy.log('Upload failed, retrying...');
      patientFileUpload.clickUploadAudioFile();
    }
  });
  
  // Verify downloaded file
  cy.readFile(`cypress/downloads/${cypressAudioName}`).should('exist');
});
cypress/e2e/facility_spec/FacilityHomepage.cy.ts (1)

2-5: Verify the necessity of import changes.

The changes to imports, particularly adding AssetPagination, appear unrelated to the PR's objective of fixing the TextAreaFormField conditional rendering for Sample Test Type. Please clarify the relationship between these changes and the main PR objective.

cypress/e2e/users_spec/UsersManage.cy.ts (1)

4-4: LGTM! Import statement is correctly placed.

The import of UserPage from the UserSearch module is properly organized with other related imports.

cypress/e2e/patient_spec/PatientPrescription.cy.ts (1)

3-3: LGTM! Import statement reorganization.

The import statement has been moved but maintains the same functionality.

cypress/e2e/users_spec/UsersCreation.cy.ts (2)

3-9: LGTM! Import organization looks good.

The reorganization of imports improves code organization while maintaining all necessary dependencies for the test suite.


Line range hint 1-215: Verify the relevance of these changes to the PR objectives.

While the import reorganization is clean, this file appears unrelated to the main PR objective of fixing the TextAreaFormField conditional rendering for Sample Test Type. Could you clarify why these changes are included in this PR?

cypress/e2e/patient_spec/PatientLogUpdate.cy.ts (1)

5-5: LGTM! Import statement properly uncommented.

The import statement for PatientLogupdate is correctly placed with other page object imports and follows the established pattern.

cypress/e2e/patient_spec/PatientConsultationCreation.cy.ts (1)

3-3: LGTM! Import statements are properly organized and utilized.

The previously commented-out imports are now active and are being used effectively throughout the test cases:

  • PatientInvestigation for testing investigation workflows
  • PatientPredefined for patient creation
  • PatientTreatmentPlan for treatment plan validations
  • ShiftCreation for patient transfer scenarios

Also applies to: 5-5, 6-6, 8-8, 9-9

public/locale/en.json (5)

484-485: Maintain parallel structure in carrier contact translations.

Both translations follow the same pattern and are consistent.


550-550: Review medical terminology formatting.

The translations maintain proper medical terminology and are correctly formatted.

Also applies to: 568-568, 570-570


907-907: Verify parenthetical information formatting.

The translation maintains consistent formatting with parenthetical information.


1097-1101: Ensure consistent capitalization in sample test translations.

The translations maintain proper capitalization and are consistent with the rest of the file.


1190-1190: Verify date-related translation consistency.

The translation "tested_on" follows the same pattern as other date-related translations in the file.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (19)
cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts (2)

Line range hint 1-14: Consider improving test data management and import organization.

  1. Consider moving test data to a separate fixture file to improve maintainability and reusability.
  2. Group related imports together (page objects, test utilities, etc.).
+ import { DoctorConnect } from "pageobject/Patient/PatientDoctorConnect";
+ import { PatientPage } from "../../pageobject/Patient/PatientCreation";
+ import LoginPage from "../../pageobject/Login/LoginPage";

+ import { testData } from "../fixtures/doctorConnect.json";  // Move test data to fixture

  describe("Patient Doctor Connect in consultation page", () => {
    const loginPage = new LoginPage();
    const patientPage = new PatientPage();
    const doctorconnect = new DoctorConnect();
-   const patientName = "Dummy Patient 11";
-   const doctorUser = "Dev Doctor";
-   const nurseUser = "Dev Staff";
-   const teleIcuUser = "Dev Doctor Two";
+   const { patientName, doctorUser, nurseUser, teleIcuUser } = testData;

Line range hint 29-54: Consider splitting the test case and adding better assertions.

The current test case combines multiple functionalities which could make failures harder to debug. Consider:

  1. Split into separate test cases for:

    • User visibility verification
    • Phone number copy functionality
    • Icon visibility
    • Sort functionality
  2. Add explicit wait conditions and better error handling

Example refactor:

it("should display all user types correctly", () => {
  patientPage.visitPatient(patientName);
  doctorconnect.clickDoctorConnectButton();
  
  cy.verifyContentPresence("#doctor-connect-home-doctor", [doctorUser])
    .should("be.visible");
  cy.verifyContentPresence("#doctor-connect-home-nurse", [nurseUser])
    .should("be.visible");
  cy.verifyContentPresence("#doctor-connect-remote-doctor", [teleIcuUser])
    .should("be.visible");
});

it("should copy phone number correctly", () => {
  doctorconnect.CopyFunctionTrigger();
  doctorconnect.clickCopyPhoneNumber("#doctor-connect-home-doctor", doctorUser);
  doctorconnect.verifyCopiedContent();
});

// Additional test cases for other functionalities...
cypress/e2e/resource_spec/ResourcesHomepage.cy.ts (1)

Line range hint 24-26: Consider adding error handling for download verification.

The download button test could be enhanced with retry logic and proper error handling, as file downloads can be flaky in E2E tests.

 it("Checks if all download button works", () => {
-    resourcePage.verifyDownloadButtonWorks();
+    cy.wrap(null).then(() => {
+      return cy.wrap(resourcePage.verifyDownloadButtonWorks())
+        .should((result) => {
+          expect(result).to.be.true;
+        })
+        .catch((error) => {
+          cy.log('Download failed:', error);
+          throw error;
+        });
+    });
 });
cypress/e2e/patient_spec/PatientFileUpload.ts (5)

Line range hint 9-24: Consider improving test data management and error handling.

The test setup could be enhanced in the following ways:

  1. Move hardcoded test data (patient names, credentials) to test fixtures or environment variables
  2. Add error handling for failed login attempts in the before hook
  3. Consider using custom commands for common setup operations
+ // Add at the top of the file
+ import testData from '../../fixtures/patient-upload-test-data.json';

  function runTests(
    testDescription: string,
    visitPatientFileUploadSection: () => void,
  ) {
    describe(testDescription, () => {
-     const cypressAudioName = "cypress audio";
-     const cypressFileName = "cypress name";
-     const newFileName = "cypress modified name";
-     const patientNameOne = "Dummy Patient 3";
-     const patientNameTwo = "Dummy Patient 4";
-     const patientNameThree = "Dummy Patient 5";
+     const { audioName, fileName, newFileName, patients } = testData;

      before(() => {
-       loginPage.loginAsDistrictAdmin();
+       cy.wrap(loginPage.loginAsDistrictAdmin()).then((response) => {
+         expect(response.status).to.eq(200);
+       });
        cy.saveLocalStorage();
      });

Line range hint 26-39: Enhance test reliability for audio recording workflow.

The test could be improved to be more robust:

  1. Add retry logic for file presence verification
  2. Verify the audio file format and content
  3. Add explicit waits for notifications to avoid race conditions
  it("Record an Audio and download the file", () => {
    patientPage.visitPatient(patientNameOne);
    visitPatientFileUploadSection.call(patientFileUpload);
    patientFileUpload.recordAudio();
    patientFileUpload.typeAudioName(cypressAudioName);
    patientFileUpload.clickUploadAudioFile();
-   cy.verifyNotification("File Uploaded Successfully");
+   cy.verifyNotification("File Uploaded Successfully", { timeout: 10000 });
-   patientFileUpload.verifyUploadFilePresence(cypressAudioName);
+   cy.get('[data-testid="uploaded-files"]', { timeout: 10000 })
+     .should('exist')
+     .and('contain', cypressAudioName)
+     .then(($el) => {
+       // Verify file format
+       expect($el.find('[data-testid="file-format"]')).to.contain('audio/wav');
+     });
    cy.get("button").contains("Download").click();
-   cy.verifyNotification("Downloading file...");
+   cy.verifyNotification("Downloading file...", { timeout: 10000 });
+   // Verify downloaded file exists in downloads folder
+   cy.readFile(`cypress/downloads/${cypressAudioName}.wav`).should('exist');
  });

Line range hint 41-56: Add error handling and state persistence checks.

The file upload and archive test should handle error cases and verify state persistence:

  1. Add error handling for failed uploads
  2. Verify archived state persists after page reload
  3. Add cleanup in afterEach to ensure test isolation
  it("Upload a File and archive it", () => {
+   cy.intercept('POST', '**/api/files/upload').as('fileUpload');
+   cy.intercept('PUT', '**/api/files/archive').as('fileArchive');

    patientPage.visitPatient(patientNameTwo);
    visitPatientFileUploadSection.call(patientFileUpload);
    patientFileUpload.uploadFile();
    patientFileUpload.typeFileName(cypressFileName);
    patientFileUpload.clickUploadFile();
-   cy.verifyNotification("File Uploaded Successfully");
+   cy.wait('@fileUpload').then((interception) => {
+     expect(interception.response.statusCode).to.eq(200);
+     cy.verifyNotification("File Uploaded Successfully");
+   });
    cy.closeNotification();
    patientFileUpload.verifyUploadFilePresence(cypressFileName);
    patientFileUpload.archiveFile();
    patientFileUpload.clickSaveArchiveFile();
-   cy.verifyNotification("File archived successfully");
+   cy.wait('@fileArchive').then((interception) => {
+     expect(interception.response.statusCode).to.eq(200);
+     cy.verifyNotification("File archived successfully");
+   });
    patientFileUpload.verifyArchiveFile(cypressFileName);
+   // Verify state persists after reload
+   cy.reload();
+   patientFileUpload.verifyArchiveFile(cypressFileName);
  });

Line range hint 58-106: Refactor user permission test for better maintainability.

The user permission test is complex and could benefit from:

  1. Breaking it into smaller, focused test cases
  2. Using custom commands for common login flows
  3. Adding proper test data cleanup
- it("User-level Based Permission for File Modification", () => {
+ describe("User-level Based Permission for File Modification", () => {
+   beforeEach(() => {
+     cy.task('db:seed', { entity: 'test-file', name: cypressFileName });
+   });

+   it("allows Nurse 1 to modify their own files", () => {
      loginPage.login("dummynurse1", "Coronasafe@123");
      cy.reload();
      patientPage.visitPatient(patientNameThree);
      visitPatientFileUploadSection.call(patientFileUpload);
      // ... test Nurse 1 permissions
+   });

+   it("prevents Nurse 2 from modifying Nurse 1's files", () => {
      loginPage.login("dummynurse2", "Coronasafe@123");
      cy.reload();
      // ... test Nurse 2 permissions
+   });

+   it("allows District Admin to modify any file", () => {
      loginPage.loginAsDistrictAdmin();
      cy.reload();
      // ... test District Admin permissions
+   });

+   afterEach(() => {
+     cy.task('db:cleanup', { entity: 'test-file' });
+   });
+ });

Line range hint 108-117: Improve test descriptions for better clarity.

The test execution could be more descriptive about the different contexts being tested:

  runTests(
-   "Patient File upload in patient details page",
+   "Patient File Upload: via Patient Details Page Navigation",
    patientFileUpload.clickFileUploadIcon,
  );
  runTests(
-   "Patient File upload in patient consultation page",
+   "Patient File Upload: via Patient Consultation Page Navigation",
    patientFileUpload.clickFileTab,
  );
cypress/e2e/facility_spec/FacilityHomepage.cy.ts (1)

2-3: Consider consolidating Asset-related imports.

The AssetPagination import seems to be used only for pagination functionality. Consider moving all Asset-related page objects into a single import statement for better organization.

-import { AssetPagination } from "../../pageobject/Asset/AssetPagination";
+import { AssetPagination, AssetHome } from "../../pageobject/Asset";
cypress/e2e/patient_spec/PatientRegistration.cy.ts (4)

Line range hint 9-40: Consider extracting test data to fixtures.

The test data (e.g., patient details, facility names, etc.) is currently defined as constants in the test file. Consider moving this to Cypress fixtures for better maintainability and reusability.

Example structure:

// fixtures/patient-data.json
{
  "patientOne": {
    "name": "Patient With No Consultation",
    "gender": "Male",
    "updatedGender": "Female",
    "address": "Test Patient Address",
    // ... other patient details
  }
}

Line range hint 156-187: Strengthen assertions in patient details verification.

The patient details verification could be more robust by:

  1. Adding explicit assertions for each field instead of relying on the generic verifyPatientDashboardDetails
  2. Verifying the response status and body of API calls

Example improvement:

it("Create a new patient with all field in registration form and no consultation", () => {
  // ... existing code ...
  
  // Intercept and verify API response
  cy.intercept('POST', '/api/patient').as('createPatient');
  patientPage.clickCreatePatient();
  cy.wait('@createPatient').then((interception) => {
    expect(interception.response.statusCode).to.equal(201);
    expect(interception.response.body).to.have.property('id');
  });

  // Explicit field-by-field verification
  cy.get('[data-testid="patient-name"]').should('have.text', patientOneName);
  cy.get('[data-testid="patient-gender"]').should('have.text', patientOneGender);
  // ... other field verifications
});

Line range hint 189-251: Improve waiting strategy in edit patient test.

The test uses arbitrary cy.wait(3000) calls which could lead to flaky tests. Consider using Cypress's built-in retry-ability and network waiting instead.

Example improvement:

it("Edit the patient details with no consultation and verify", () => {
  // ... existing code ...
  
  // Replace arbitrary waits with proper network waiting
  cy.intercept('PUT', '/api/patient/*').as('updatePatient');
  patientPage.clickUpdatePatient();
  cy.wait('@updatePatient')
    .its('response.statusCode')
    .should('eq', 200);
  
  // Replace cy.wait(5000) with proper element waiting
  cy.get('[data-testid="patient-dashboard"]')
    .should('be.visible')
    .within(() => {
      // Verify patient details
    });
});

Line range hint 253-297: Add error case coverage in transfer tests.

While the happy path and same-facility error case are covered, consider adding more error scenarios for patient transfer:

  1. Invalid phone number
  2. Non-existent patient
  3. Network failures

Example additional test:

it("Should handle invalid phone number during transfer", () => {
  patientPage.createPatient();
  patientPage.selectFacility(patientTransferFacility);
  patientPage.patientformvisibility();
  patientPage.typePatientPhoneNumber('invalid');
  patientTransfer.clickAdmitPatientRecordButton();
  cy.get('[data-testid="error-message"]')
    .should('be.visible')
    .and('contain', 'Invalid phone number');
});
cypress/e2e/patient_spec/PatientLogUpdate.cy.ts (3)

Line range hint 8-324: Consider enhancing test maintainability and robustness.

A few suggestions to improve the test suite:

  1. Move test data to fixtures to improve maintainability:
// fixtures/patient-log-data.json
{
  "patients": {
    "domiciliary": "Dummy Patient 11",
    "admitted": {
      "one": "Dummy Patient 9",
      "two": "Dummy Patient 10",
      "three": "Dummy Patient 8"
    }
  },
  "beds": {
    "one": "Dummy Bed 5",
    "two": "Dummy Bed 2",
    "three": "Dummy Bed 3"
  },
  "vitals": {
    "systolic": "149",
    "diastolic": "119",
    // ... other vitals
  }
}
  1. Extract commonly used strings into constants:
const NOTIFICATIONS = {
  PROGRESS_NOTE_CREATED: "Progress Note created successfully",
  CONSULTATION_UPDATED: "Consultation updated successfully",
  // ... other notifications
};
  1. Add more robust verifications:
// Instead of just verifying content presence
cy.verifyContentPresence("#consultation-preview", [patientCategory]);

// Also verify the exact values and structure
cy.get("#consultation-preview")
  .find("[data-testid='patient-category']")
  .should("have.text", patientCategory);
  1. Consider breaking down larger test cases into smaller, focused ones using beforeEach for common setup.

Line range hint 8-324: Consider adding more error scenario coverage.

Suggest adding test cases for:

  1. Network failures:
it("handles network errors gracefully", () => {
  cy.intercept("POST", "/api/patient/log", {
    statusCode: 500,
    body: { message: "Internal Server Error" }
  }).as("saveLog");
  
  // Perform actions that trigger the API call
  // Verify error handling
});
  1. Form validation:
it("validates required fields", () => {
  // Submit form without required fields
  cy.submitButton("Save");
  // Verify validation messages
  cy.get("[data-testid='error-message']")
    .should("be.visible")
    .and("contain", "Required field");
});
  1. Edge cases:
  • Maximum/minimum values for vital signs
  • Special characters in text fields
  • Concurrent updates

Line range hint 325-329: Consider adding explicit test data cleanup.

To ensure test isolation, consider adding cleanup in the afterEach hook:

afterEach(() => {
  // Save localStorage as currently done
  cy.saveLocalStorage();
  
  // Clean up test data
  cy.task("cleanupTestData", {
    patients: [patientOne, patientTwo, patientThree, domicilaryPatient]
  });
  
  // Reset application state
  cy.window().then((win) => {
    win.sessionStorage.clear();
  });
});
public/locale/en.json (3)

306-306: LGTM! Consider expanding medical abbreviations for clarity.

The medical condition keys follow a consistent naming pattern. However, consider adding comments or expanding the abbreviations in the values for better clarity:

-  "ari": "ARI - Acute Respiratory illness",
+  "ari": "ARI - Acute Respiratory Illness",
-  "sari": "SARI - Severe Acute Respiratory illness",
+  "sari": "SARI - Severe Acute Respiratory Illness"

Also applies to: 1102-1102


1098-1099: Consider adding placeholders for dynamic content in sample test related strings.

For better internationalization support, consider adding placeholders for dynamic content that might need different word ordering in other languages:

-  "sample_test_details": "Sample Test Details",
+  "sample_test_details": "Sample Test Details for {{testName}}",
-  "sample_test_history": "Sample Test History",
+  "sample_test_history": "Sample Test History for {{patientName}}",
-  "sample_type_description": "Sample Type Description",
+  "sample_type_description": "Description for {{sampleType}}"

Also applies to: 1101-1101


907-907: Consider adding a note about the age threshold.

The key includes the age threshold in parentheses, which is good. However, consider adding it as a separate configuration value in case the threshold needs to change:

-  "number_of_aged_dependents": "Number of Aged Dependents (Above 60)",
+  "number_of_aged_dependents": "Number of Aged Dependents (Above {{ageThreshold}})"
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 97bb3f6 and df35f72.

📒 Files selected for processing (18)
  • cypress/e2e/assets_spec/AssetHomepage.cy.ts (1 hunks)
  • cypress/e2e/assets_spec/AssetsCreation.cy.ts (1 hunks)
  • cypress/e2e/assets_spec/AssetsManage.cy.ts (1 hunks)
  • cypress/e2e/facility_spec/FacilityCreation.cy.ts (1 hunks)
  • cypress/e2e/facility_spec/FacilityHomepage.cy.ts (1 hunks)
  • cypress/e2e/facility_spec/FacilityInventory.cy.ts (1 hunks)
  • cypress/e2e/facility_spec/FacilityManage.cy.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientBedManagement.cy.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientConsultationCreation.cy.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientFileUpload.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientLogUpdate.cy.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientPrescription.cy.ts (1 hunks)
  • cypress/e2e/patient_spec/PatientRegistration.cy.ts (1 hunks)
  • cypress/e2e/resource_spec/ResourcesHomepage.cy.ts (1 hunks)
  • cypress/e2e/users_spec/UsersCreation.cy.ts (1 hunks)
  • cypress/e2e/users_spec/UsersManage.cy.ts (1 hunks)
  • public/locale/en.json (15 hunks)
✅ Files skipped from review due to trivial changes (6)
  • cypress/e2e/assets_spec/AssetHomepage.cy.ts
  • cypress/e2e/facility_spec/FacilityCreation.cy.ts
  • cypress/e2e/facility_spec/FacilityInventory.cy.ts
  • cypress/e2e/facility_spec/FacilityManage.cy.ts
  • cypress/e2e/patient_spec/PatientConsultationCreation.cy.ts
  • cypress/e2e/users_spec/UsersCreation.cy.ts
🔇 Additional comments (14)
cypress/e2e/patient_spec/PatientBedManagement.cy.ts (2)

2-2: LGTM! Import statement cleanup looks good.

The import statement for PatientConsultationPage is properly organized and the component is correctly used in the test file.


Line range hint 1-47: Verify the relevance of this file change to the PR objectives.

This file only contains an import statement cleanup, but the PR's main objective is to fix the conditional rendering of TextAreaFormField for Sample Test Type. Please clarify if this change is intentional or if it was accidentally included in this PR.

cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts (3)

Line range hint 16-28: LGTM! Well-structured test lifecycle management.

The test setup follows Cypress best practices:

  • Proper use of before/beforeEach hooks
  • Efficient local storage handling
  • Clean state management with filter clearing

Line range hint 56-58: LGTM! Proper test cleanup.

The afterEach hook correctly preserves the local storage state for subsequent tests.


Line range hint 1-58: Add test coverage for TextAreaFormField conditional rendering.

The PR's main objective is to fix the conditional rendering of TextAreaFormField for "Other Type" sample tests, but this functionality isn't covered in the current test suite.

Would you like me to help create a new test case that verifies the TextAreaFormField's conditional rendering behavior?

cypress/e2e/resource_spec/ResourcesHomepage.cy.ts (2)

1-3: LGTM! Clean import organization.

The imports are now well-organized, following a logical order with the page objects grouped together.


Line range hint 1-89: Comprehensive test coverage with robust implementation.

The test suite demonstrates excellent practices:

  • Proper use of page object pattern for maintainability
  • Comprehensive coverage of core functionalities
  • Robust setup/teardown with localStorage management
  • Effective API interception for async operations
  • Clear assertions and error messages

Let's verify the consistency of page object usage across other test files:

✅ Verification successful

Page object pattern consistently implemented across test files

The verification confirms excellent consistency in page object pattern implementation across the test suite:

  • All test files properly import page objects from the pageobject directory
  • Consistent instantiation pattern using const instance = new PageClass()
  • Clear separation of concerns with dedicated page objects for different features (Login, Facility, Patient, Asset etc.)
  • Proper reuse of common page objects like LoginPage across multiple test files
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for consistent page object pattern usage across test files
# Expect: Similar import structure and usage of page objects

# Search for page object imports in test files
rg -A 3 "import \w+Page from.*pageobject" "cypress/e2e/"

# Search for page object instantiation pattern
rg "const \w+ = new \w+Page\(\)" "cypress/e2e/"

Length of output: 18060

cypress/e2e/assets_spec/AssetsCreation.cy.ts (1)

2-5: LGTM! Import changes are well-organized.

The addition of AssetSearchPage import and the grouping of related imports improve code organization.

cypress/e2e/facility_spec/FacilityHomepage.cy.ts (1)

2-5: Verify the relationship between import changes and PR objectives.

While the import reorganization improves code organization, these changes seem unrelated to the PR's main objective of fixing the TextAreaFormField conditional rendering issue. The changes to import statements should be in a separate PR focused on code cleanup.

Let's verify if these import changes are necessary for the TextAreaFormField fix:

cypress/e2e/users_spec/UsersManage.cy.ts (2)

4-4: LGTM: Import statement is correctly used.

The UserPage import is properly utilized in the test suite (instantiated on line 8), maintaining good page object pattern practices.


4-4: Verify relevance to PR objectives.

This change appears unrelated to the PR's main objective of fixing the conditional rendering of TextAreaFormField for Sample Test Type. Please clarify how this import modification contributes to addressing issue #8958.

cypress/e2e/patient_spec/PatientPrescription.cy.ts (1)

3-3: LGTM: Import statement is correctly uncommented.

The import is necessary as it's used to instantiate the patientPrescription object used throughout the test suite.

cypress/e2e/patient_spec/PatientLogUpdate.cy.ts (1)

5-5: LGTM! Import statement follows Page Object Model pattern.

The import statement is properly structured and maintains consistency with other imports in the file.

public/locale/en.json (1)

484-485: LGTM! Contact tracing and travel history keys are well-structured.

The keys and values for contact tracing and travel history are clear and consistent.

Also applies to: 570-570

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
changes required Deploy-Failed Deplyment is not showing preview merge conflict pull requests with merge conflict
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Text Area Not Visible When 'Other Type' is Selected in Sample Test Type
5 participants