Skip to content

Commit

Permalink
feat: add e2e testing for both menu links. Also fixed some e2e stuff. (
Browse files Browse the repository at this point in the history
bradymiller authored Oct 4, 2024
1 parent 74c9a1c commit 30a9ace
Showing 10 changed files with 299 additions and 27 deletions.
11 changes: 6 additions & 5 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1223,7 +1223,7 @@ jobs:


build_nginx_84:
name: PHP 8.4 - Nginx - MariaDB 11.4
name: PHP 8.4 - Nginx - MariaDB 11.4 (skipping E2e testing at this time)
runs-on: ubuntu-22.04
env:
DOCKER_DIR: nginx_84
@@ -1273,11 +1273,12 @@ jobs:
build_test_unit
if: ${{ success() || failure() }}

- name: E2e testing
- name: E2e testing (skipping at this time for PHP 8.4-dev)
run: |
source ci/ciLibrary.source
build_test_e2e
if: ${{ success() || failure() }}
echo "SKIPPING THIS TEST FOR NOW UNTIL IT STARTS WORKING IN FUTURE FOR PHP 8.4-dev"
# source ci/ciLibrary.source
# build_test_e2e
# if: ${{ success() || failure() }}

- name: Api testing
run: |
8 changes: 1 addition & 7 deletions ci/ciLibrary.source
Original file line number Diff line number Diff line change
@@ -105,13 +105,7 @@ build_test_e2e() {
if [ "$failTest" == false ]; then
exit
fi
# hail mary run
failTest=false
docker exec -i $(docker ps | grep openemr[_\-] | cut -f 1 -d " ") sh -c "${CHROMIUM_INSTALL}; export PANTHER_NO_SANDBOX=1; export PANTHER_CHROME_ARGUMENTS='--disable-dev-shm-usage'; cd ${OPENEMR_DIR}; php ${OPENEMR_DIR}/vendor/bin/phpunit --testsuite e2e --testdox" || failTest=true
if [ "$failTest" == false ]; then
exit
fi
# failed 3 tests, so send the official fail
# failed 2 tests, so send the official fail
exit 1
}

2 changes: 1 addition & 1 deletion interface/reports/unique_seen_patients_report.php
Original file line number Diff line number Diff line change
@@ -64,7 +64,7 @@
}
}
</style>
<title><?php echo xlt('Front Office Receipts'); ?></title>
<title><?php echo xlt('Unique Seen Patients'); ?></title>

<?php Header::setupHeader('datetime-picker'); ?>

187 changes: 187 additions & 0 deletions tests/Tests/E2e/CheckMainMenuLinksTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
<?php

declare(strict_types=1);

namespace OpenEMR\Tests\E2e;

use Symfony\Component\Panther\PantherTestCase;
use Symfony\Component\Panther\Client;

class CheckMainMenuLinksTest extends PantherTestCase
{
/**
* The base url used for e2e (end to end) browser testing.
*/
private $e2eBaseUrl;

protected function setUp(): void
{
$this->e2eBaseUrl = getenv("OPENEMR_BASE_URL_E2E", true) ?: "http://localhost";
}

/**
* @dataProvider menuLinkProvider
*/
public function testCheckMenuLink(string $menuLink, string $expectedTabTitle): void
{
if ($expectedTabTitle == "Care Coordination" && !empty(getenv('UNABLE_SUPPORT_OPENEMR_NODEJS', true) ?? '')) {
// Care Coordination page check will be skipped since this flag is set (which means the environment does not have
// a high enough version of nodejs)
$this->markTestSkipped('Test skipped because this environment does not support high enough nodejs version.');
}
$openEmrPage = $this->e2eBaseUrl;
$client = static::createPantherClient(['external_base_uri' => $openEmrPage]);
$client->manage()->window()->maximize();
try {
// login
$crawler = $client->request('GET', '/interface/login/login.php?site=default');
$form = $crawler->filter('#login_form')->form();
$form['authUser'] = 'admin';
$form['clearPass'] = 'pass';
$crawler = $client->submit($form);
// check if the menu cog is showing. if so, then click it.
if ($crawler->filterXPath('//div[@id="mainBox"]/nav/button[@data-target="#mainMenu"]')->isDisplayed()) {
$crawler->filterXPath('//div[@id="mainBox"]/nav/button[@data-target="#mainMenu"]')->click();
}
// got to and click the menu link
$menuLinkSequenceArray = explode('||', $menuLink);
$counter = 0;
foreach ($menuLinkSequenceArray as $menuLinkItem) {
if ($counter == 0) {
if (count($menuLinkSequenceArray) > 1) {
// start clicking through a dropdown/nested menu item
$menuLink = '//div[@id="mainMenu"]/div/div/div/div[text()="' . $menuLinkItem . '"]';
} else {
// just clicking a simple/single menu item
$menuLink = '//div[@id="mainMenu"]/div/div/div[text()="' . $menuLinkItem . '"]';
}
} elseif ($counter == 1) {
if (count($menuLinkSequenceArray) == 2) {
// click the nested menu item
$menuLink = '//div[@id="mainMenu"]/div/div/div/div[text()="' . $menuLinkSequenceArray[0] . '"]/../ul/li/div[text()="' . $menuLinkItem . '"]';
} else {
// continue clicking through a dropdown/nested menu item
$menuLink = '//div[@id="mainMenu"]/div/div/div/div[text()="' . $menuLinkSequenceArray[0] . '"]/../ul/li/div/div[text()="' . $menuLinkItem . '"]';
}
} else { // $counter > 1
// click the nested menu item
$menuLink = '//div[@id="mainMenu"]/div/div/div/div[text()="' . $menuLinkSequenceArray[0] . '"]/../ul/li/div/div[text()="' . $menuLinkSequenceArray[1] . '"]/../ul/li/div[text()="' . $menuLinkItem . '"]';
}
$client->waitFor($menuLink);
$crawler = $client->refreshCrawler();
$crawler->filterXPath($menuLink)->click();
$counter++;
}
// wait for the tab title to be shown
$client->waitForElementToContain("//div[@id='tabs_div']/div/div[not(contains(concat(' ',normalize-space(@class),' '),' tabsNoHover '))]", $expectedTabTitle);
// Perform the final assertion
$this->assertSame($expectedTabTitle, $crawler->filterXPath("//div[@id='tabs_div']/div/div[not(contains(concat(' ',normalize-space(@class),' '),' tabsNoHover '))]")->text());
} catch (\Throwable $e) {
// Close client
$client->quit();
// re-throw the exception
throw $e;
}
// Close client
$client->quit();
}

public static function menuLinkProvider()
{
return [
'Calendar menu link' => ['Calendar', 'Calendar'],
'Finder menu link' => ['Finder', 'Patient Finder'],
'Flow menu link' => ['Flow', 'Flow Board'],
'Recalls menu link' => ['Recalls', 'Recall Board'],
'Messages menu link' => ['Messages', 'Message Center'],
'Patient -> New/Search menu link' => ['Patient||New/Search', 'Search or Add Patient'],
'Fees -> Billing Manager menu link' => ['Fees||Billing Manager', 'Billing Manager'],
'Fees -> Batch Payments menu link' => ['Fees||Batch Payments', 'New Payment'],
'Fees -> Posting Payments menu link' => ['Fees||Posting Payments', 'EOB Posting - Search'],
'Fees -> EDI History menu link' => ['Fees||EDI History', 'EDI History'],
'Modules -> Manage Modules menu link' => ['Modules||Manage Modules', 'Manage Modules'],
'Modules -> Carecoordination menu link' => ['Modules||Carecoordination', 'Care Coordination'],
'Procedures -> Procedures Providers menu link' => ['Procedures||Providers', 'Procedure Providers'],
'Procedures -> Configuration menu link' => ['Procedures||Configuration', 'Configure Orders and Results'],
'Procedures -> Load Compendium menu link' => ['Procedures||Load Compendium', 'Load Compendium'],
'Procedures -> Batch Results menu link' => ['Procedures||Batch Results', 'Procedure Results'],
'Procedures -> Electronic Reports menu link' => ['Procedures||Electronic Reports', 'Procedure Orders and Reports'],
'Procedures -> Lab Documents menu link' => ['Procedures||Lab Documents', 'Lab Documents'],
'Admin -> Config menu link' => ['Admin||Config', 'Configuration'],
'Admin -> Clinic -> Facilities menu link' => ['Admin||Clinic||Facilities', 'Facilities'],
'Admin -> Clinic -> Calendar menu link' => ['Admin||Clinic||Calendar', 'Calendar'],
'Admin -> Clinic -> Import Holidays menu link' => ['Admin||Clinic||Import Holidays', 'Holidays management'],
'Admin -> Patients -> Patient Reminders menu link' => ['Admin||Patients||Patient Reminders', 'Patient Reminders'],
'Admin -> Patients -> Merge Patients menu link' => ['Admin||Patients||Merge Patients', 'Merge Patients'],
'Admin -> Patients -> Manage Duplicates menu link' => ['Admin||Patients||Manage Duplicates', 'Duplicate Patient Management'],
'Admin -> Practice -> Practice Settings menu link' => ['Admin||Practice||Practice Settings', 'Practice Settings'],
'Admin -> Practice -> Rules menu link' => ['Admin||Practice||Rules', 'Plans Configuration Go'],
'Admin -> Practice -> Alerts menu link' => ['Admin||Practice||Alerts', 'Clinical Decision Rules Alert Manager'],
'Admin -> Coding -> Codes menu link' => ['Admin||Coding||Codes', 'Codes'],
'Admin -> Coding -> Native Data Loads menu link' => ['Admin||Coding||Native Data Loads', 'Install Code Set'],
'Admin -> Coding -> External Data Loads menu link' => ['Admin||Coding||External Data Loads', 'External Data Loads'],
'Admin -> Forms -> Forms Administration menu link' => ['Admin||Forms||Forms Administration', 'Forms Administration'],
'Admin -> Forms -> Layouts menu link' => ['Admin||Forms||Layouts', 'Layout Editor'],
'Admin -> Forms -> Lists menu link' => ['Admin||Forms||Lists', 'List Editor'],
'Admin -> Documents -> Document Templates menu link' => ['Admin||Documents||Document Templates', 'Document Template Management'],
'Admin -> System -> Backup menu link' => ['Admin||System||Backup', 'Backup'],
'Admin -> System -> Files menu link' => ['Admin||System||Files', 'File management'],
'Admin -> System -> Language menu link' => ['Admin||System||Language', 'Multi Language Tool'],
'Admin -> System -> Certificates menu link' => ['Admin||System||Certificates', 'SSL Certificate Administration'],
'Admin -> System -> Logs menu link' => ['Admin||System||Logs', 'Logs Viewer'],
'Admin -> System -> Audit Log Tamper menu link' => ['Admin||System||Audit Log Tamper', 'Audit Log Tamper Report'],
'Admin -> System -> Diagnostics menu link' => ['Admin||System||Diagnostics', 'Diagnostics'],
'Admin -> System -> API Clients menu link' => ['Admin||System||API Clients', 'Client Registrations'],
'Admin -> Users menu link' => ['Admin||Users', 'User / Groups'],
'Admin -> Address Book menu link' => ['Admin||Address Book', 'Address Book'],
'Admin -> ACL menu link' => ['Admin||ACL', 'Access Control List Administration'],
'Reports -> Clients -> List menu link' => ['Reports||Clients||List', 'Patient List'],
'Reports -> Clients -> Rx menu link' => ['Reports||Clients||Rx', 'Prescriptions and Dispensations'],
'Reports -> Clients -> Patient List Creation menu link' => ['Reports||Clients||Patient List Creation', 'Patient List Creation'],
'Reports -> Clients -> Message List menu link' => ['Reports||Clients||Message List', 'Message List'],
'Reports -> Clients -> Clinical menu link' => ['Reports||Clients||Clinical', 'Clinical Reports'],
'Reports -> Clients -> Referrals menu link' => ['Reports||Clients||Referrals', 'Referrals'],
'Reports -> Clients -> Immunization Registry menu link' => ['Reports||Clients||Immunization Registry', 'Immunization Registry'],
'Reports -> Clinic -> Report Results menu link' => ['Reports||Clinic||Report Results', 'Report Results/History'],
'Reports -> Clinic -> Standard Measures menu link' => ['Reports||Clinic||Standard Measures', 'Standard Measures'],
'Reports -> Clinic -> Automated Measures (AMC) menu link' => ['Reports||Clinic||Automated Measures (AMC)', 'Automated Measure Calculations (AMC)'],
'Reports -> Clinic -> 2024 Real World Testing Report menu link' => ['Reports||Clinic||2024 Real World Testing Report', '2024 Real World Testing Report'],
'Reports -> Clinic -> 2023 Real World Testing Report menu link' => ['Reports||Clinic||2023 Real World Testing Report', '2023 Real World Testing Report'],
'Reports -> Clinic -> Alerts Log menu link' => ['Reports||Clinic||Alerts Log', 'Alerts Log'],
'Reports -> Visits -> Daily Report menu link' => ['Reports||Visits||Daily Report', 'Daily Summary Report'],
'Reports -> Visits -> Patient Flow Board menu link' => ['Reports||Visits||Patient Flow Board', 'Patient Flow Board Report'],
'Reports -> Visits -> Encounters menu link' => ['Reports||Visits||Encounters', 'Encounters Report'],
'Reports -> Visits -> Appt-Enc menu link' => ['Reports||Visits||Appt-Enc', 'Appointments and Encounters'],
'Reports -> Visits -> Superbill menu link' => ['Reports||Visits||Superbill', 'Reports - Superbill'],
'Reports -> Visits -> Eligibility menu link' => ['Reports||Visits||Eligibility', 'Eligibility 270 Inquiry Batch'],
'Reports -> Visits -> Eligibility Response menu link' => ['Reports||Visits||Eligibility Response', 'EDI-271 Response File Upload'],
'Reports -> Visits -> Chart Activity menu link' => ['Reports||Visits||Chart Activity', 'Chart Location Activity'],
'Reports -> Visits -> Charts Out menu link' => ['Reports||Visits||Charts Out', 'Charts Checked Out'],
'Reports -> Visits -> Services menu link' => ['Reports||Visits||Services', 'Services by Category'],
'Reports -> Visits -> Syndromic Surveillance menu link' => ['Reports||Visits||Syndromic Surveillance', 'Syndromic Surveillance - Non Reported Issues'],
'Reports -> Financial -> Sales menu link' => ['Reports||Financial||Sales', 'Sales by Item'],
'Reports -> Financial -> Cash Rec menu link' => ['Reports||Financial||Cash Rec', 'Cash Receipts by Provider'],
'Reports -> Financial -> Front Rec menu link' => ['Reports||Financial||Front Rec', 'Front Office Receipts'],
'Reports -> Financial -> Pmt Method menu link' => ['Reports||Financial||Pmt Method', 'Receipts Summary'],
'Reports -> Financial -> Collections and Aging menu link' => ['Reports||Financial||Collections and Aging', 'Collections Report'],
'Reports -> Financial -> Pat Ledger' => ['Reports||Financial||Pat Ledger', 'Patient Ledger by Date'],
'Reports -> Financial -> Financial Summary by Service Code menu link' => ['Reports||Financial||Financial Summary by Service Code', 'Financial Summary by Service Code'],
'Reports -> Financial -> Payment Processing menu link' => ['Reports||Financial||Payment Processing', 'Payment Processing'],
'Reports -> Procedures -> Pending Res menu link' => ['Reports||Procedures||Pending Res', 'Pending Orders'],
'Reports -> Procedures -> Statistics menu link' => ['Reports||Procedures||Statistics', 'Procedure Statistics Report'],
'Reports -> Insurance -> Distribution menu link' => ['Reports||Insurance||Distribution', 'Patient Insurance Distribution'],
'Reports -> Insurance -> Indigents menu link' => ['Reports||Insurance||Indigents', 'Indigent Patients Report'],
'Reports -> Insurance -> Unique SP menu link' => ['Reports||Insurance||Unique SP', 'Unique Seen Patients'],
'Reports -> Services -> Background Services menu link' => ['Reports||Services||Background Services', 'Background Services'],
'Reports -> Services -> Direct Message Log menu link' => ['Reports||Services||Direct Message Log', 'Direct Message Log'],
'Reports -> Services -> IP Tracker menu link' => ['Reports||Services||IP Tracker', 'IP Tracker'],
'Miscellaneous -> Dicom Viewer menu link' => ['Miscellaneous||Dicom Viewer', 'Dicom Viewer'],
'Miscellaneous -> Patient Education menu link' => ['Miscellaneous||Patient Education', 'Web Search - Patient Education Materials'],
'Miscellaneous -> Authorizations menu link' => ['Miscellaneous||Authorizations', 'Authorizations (More)'],
'Miscellaneous -> Chart Tracker menu link' => ['Miscellaneous||Chart Tracker', 'Chart Tracker'],
'Miscellaneous -> Office Notes menu link' => ['Miscellaneous||Office Notes', 'Office Notes'],
'Miscellaneous -> Batch Communication Tool menu link' => ['Miscellaneous||Batch Communication Tool', 'BatchCom'],
'Miscellaneous -> New Documents menu link' => ['Miscellaneous||New Documents', 'Documents']
];
}
}
79 changes: 79 additions & 0 deletions tests/Tests/E2e/CheckUserMenuLinksTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?php

declare(strict_types=1);

namespace OpenEMR\Tests\E2e;

use Symfony\Component\Panther\PantherTestCase;
use Symfony\Component\Panther\Client;

class CheckUserMenuLinksTest extends PantherTestCase
{
/**
* The base url used for e2e (end to end) browser testing.
*/
private $e2eBaseUrl;

protected function setUp(): void
{
$this->e2eBaseUrl = getenv("OPENEMR_BASE_URL_E2E", true) ?: "http://localhost";
}

/**
* @dataProvider menuLinkProvider
*/
public function testCheckUserLink(string $menutreeicon, string $menuLinkItem, string $expectedTabTitle): void
{
$openEmrPage = $this->e2eBaseUrl;
$client = static::createPantherClient(['external_base_uri' => $openEmrPage]);
$client->manage()->window()->maximize();
try {
// login
$crawler = $client->request('GET', '/interface/login/login.php?site=default');
$form = $crawler->filter('#login_form')->form();
$form['authUser'] = 'admin';
$form['clearPass'] = 'pass';
$crawler = $client->submit($form);

// got to and click the user menu link
$menuLink = '//i[@id="user_icon"]';
$menuLink2 = '//ul[@id="userdropdown"]//i[contains(@class, "' . $menutreeicon . '")]';
$client->waitFor($menuLink);
$crawler = $client->refreshCrawler();
$crawler->filterXPath($menuLink)->click();
$client->waitFor($menuLink2);
$crawler = $client->refreshCrawler();
$crawler->filterXPath($menuLink2)->click();

// wait for the tab title to be shown
if ($menuLinkItem == 'Logout') {
// special case for Logout
$client->waitFor('//input[@id="authUser"]');
$title = $client->getTitle();
$this->assertSame('OpenEMR Login', $title);
} else {
$client->waitForElementToContain("//div[@id='tabs_div']/div/div[not(contains(concat(' ',normalize-space(@class),' '),' tabsNoHover '))]", $expectedTabTitle);
// Perform the final assertion
$this->assertSame($expectedTabTitle, $crawler->filterXPath("//div[@id='tabs_div']/div/div[not(contains(concat(' ',normalize-space(@class),' '),' tabsNoHover '))]")->text());
}
} catch (\Throwable $e) {
// Close client
$client->quit();
// re-throw the exception
throw $e;
}
// Close client
$client->quit();
}

public static function menuLinkProvider()
{
return [
'Settings user menu link' => ['fa-cog', 'Settings', 'User Settings'],
'Change Password user menu link' => ['fa-lock', 'Change Password', 'Change Password'],
'MFA Management user menu link' => ['fa-key', 'MFA Management', 'Manage Multi Factor Authentication'],
'About OpenEMR user menu link' => ['fa-info', 'About OpenEMR', 'About OpenEMR'],
'Logout user menu link' => ['fa-sign-out-alt', 'Logout', 'OpenEMR Login']
];
}
}
Loading
Oops, something went wrong.

0 comments on commit 30a9ace

Please sign in to comment.