return runWithPouchDump('billing', async function() { await authenticateUser(); await visit('/pricing'); await click('button:contains(+ new item)'); assert.equal(currentURL(), '/pricing/edit/new'); await fillIn('.price-name input', 'Xray Foot'); await fillIn('.price-amount input', 100); await fillIn('.price-department input', 'Imaging'); await select('.price-category', 'Imaging'); await click('button:contains(Add):last'); await waitToAppear('.modal-dialog'); assert.dom('.modal-title').hasText('Pricing Item Saved', 'Pricing Item saved'); await click('button:contains(Ok)'); await click('button:contains(Add Override)'); await waitToAppear('.modal-dialog'); assert.dom('.modal-title').hasText('Add Override', 'Add Override Dialog displays'); await select('.pricing-profile', 'Half off'); await fillIn('.pricing-override-price input', 20); await click('button:contains(Add):last'); await waitToAppear('.override-profile'); assert.dom('.override-profile').hasText('Half off', 'Pricing override saved'); await click('button:contains(Delete)'); await waitToAppear('.modal-dialog'); await click('button:contains(Ok)'); assert.dom('.override-profile').doesNotExist('Pricing override deleted'); });
async function generateReport(reportName, startDate, endDate) { await authenticateUser(); await visit('/patients/reports'); await select('[data-test-selector="select-report-type"] select', reportName); await fillIn('[data-test-selector="select-report-start-date"] input', startDate); await fillIn('[data-test-selector="select-report-end-date"] input', endDate); await click('button:contains(Generate Report)'); }
return runWithPouchDump('billing', async function() { await authenticateUser(); await visit(path); assert.equal(currentURL(), path); includesPrices.forEach(function(priceName) { assert.equal(find(`.price-name:contains(${priceName})`).length, 1, `${priceName} displays`); }); excludesPrices.forEach(function(priceName) { assert.equal(find(`.price-name:contains(${priceName})`).length, 0, `${priceName} is not present`); }); });
return runWithPouchDump('default', async function() { await authenticateUser(); await visit('/patients/reports'); let generateReportButton = find('button:contains(Generate Report)'); assert.equal(currentURL(), '/patients/reports'); assert.equal(generateReportButton.length, 1, 'Generate Report button is visible'); let reportType = find('[data-test-selector="select-report-type"]'); assert.equal(reportType.length, 1, 'Report type select is visible'); assert.equal(reportType.find(':selected').text().trim(), 'Admissions Detail', 'Default value selected"'); });
return runWithPouchDump('default', async function() { await authenticateUser(); await visit('/patients/reports'); await select('[data-test-selector="select-report-type"] select', reportName); let reportStartDate = find('[data-test-selector="select-report-start-date"]'); let reportEndDate = find('[data-test-selector="select-report-end-date"]'); assert.equal(reportStartDate.length, 1, 'Report start date select is visible'); assert.equal(reportEndDate.length, 1, 'Report end date select is visible'); let reportType = find('[data-test-selector="select-report-type"] select'); assert.equal(reportType.find(':selected').text().trim(), reportName, `${reportName} option selected`); });
return runWithPouchDump('default', async function() { await authenticateUser(); await visit('/patients'); assert.equal(currentURL(), '/patients'); let noPatientsFound = find('[data-test-selector="no-patients-found"]'); assert.equal(noPatientsFound.text().trim(), 'No patients found. Create a new patient record?', 'no records found'); let newPatientButton = find('button:contains(+ new patient)'); assert.equal(newPatientButton.length, 1, 'Add new patient button is visible'); await click('button:contains(+ new patient)'); assert.equal(currentURL(), '/patients/edit/new'); });
return runWithPouchDump('billing', async function() { await authenticateUser(); await visit('/pricing/profiles'); assert.equal(currentURL(), '/pricing/profiles'); assert.equal(find('.pricing-profile-name:contains(Half off)').length, 1, 'Pricing profile exists to delete'); await click('button:contains(Delete)'); await waitToAppear('.modal-dialog'); assert.dom('.modal-title').hasText('Delete Profile', 'Pricing Profile delete confirmation is displayed'); await click('button:contains(Ok)'); await waitToDisappear('.pricing-profile-name:contains(Half off)'); assert.equal(find('.pricing-profile-name:contains(Half off)').length, 0, 'Pricing profile disappears from list'); });
return runWithPouchDump('default', async function() { await authenticateUser(); await visit('/patients/edit/new'); assert.equal(currentURL(), '/patients/edit/new'); await fillIn('.test-first-name input', 'John'); await fillIn('.test-last-name input', 'Doe'); await click('.panel-footer button:contains(Add)'); await waitToAppear('.message:contains(The patient record for John Doe has been saved)'); assert.dom('.message').hasText('The patient record for John Doe has been saved.'); await waitToAppear('.patient-summary'); assert.dom('.patient-summary').exists(); assert.dom('#general').exists(); });
return runWithPouchDump('billing', async function() { await authenticateUser(); await visit('/pricing/lab'); assert.equal(currentURL(), '/pricing/lab'); assert.equal(find('.price-name:contains(Blood test)').length, 1, 'Price exists to delete'); await click('button:contains(Delete)'); await waitToAppear('.modal-dialog'); assert.dom('.alert').hasText( 'Are you sure you wish to delete Blood test?', 'Pricing item is displayed for deletion' ); await click('button:contains(Delete):last'); await waitToDisappear('.price-name:contains(Blood test)'); assert.equal(find('.price-name:contains(Blood test)').length, 0, 'Price disappears from price list'); });
return runWithPouchDump('default', async function() { let role = PREDEFINED_USER_ROLES.findBy('name', 'User Administrator'); await authenticateUser({ roles: role.roles, role: role.name, authenticated: { role: role.name } }); await addAllUsers(assert); await visit('/'); // Default home page for User Administrator is admin/users assert.equal(currentURL(), '/admin/users', 'User Administrator initial page displays'); assert.equal(find('td.user-display-name:first').text(), 'HospitalRun Administrator'); assert.equal(find('td.user-name:first').text(), 'hradmin'); assert.equal(find('td.user-email:first').text(), '*****@*****.**'); assert.equal(find('td.user-role:first').text(), 'System Administrator'); });
return runWithPouchDump('billing', async function() { await authenticateUser(); await visit('/pricing/profiles'); assert.equal(currentURL(), '/pricing/profiles'); await click('button:contains(+ new item)'); await waitToAppear('.modal-dialog'); assert.dom('.modal-title').hasText('New Pricing Profile', 'New Pricing Profile modal appears'); await fillIn('.pricing-profile-name input', 'Quarter Off'); await fillIn('.pricing-profile-percentage input', 25); await fillIn('.pricing-profile-discount input', 10); await click('button:contains(Add)'); await waitToAppear('.modal-title:contains(Pricing Profile Saved)'); await click('button:contains(Ok)'); await waitToAppear('.pricing-profile-name:contains(Quarter Off)'); assert.equal(find('.pricing-profile-name:contains(Quarter Off)').text(), 'Quarter Off', 'New price profile displays'); });
return runWithPouchDump('default', async function() { // go to /pricing/lab, add item and confirm Pricing Type is 'Lab Procedure' (bug fixed in PR #1526) await authenticateUser(); await visit('/pricing/lab'); await click('button:contains(+ new item)'); assert.equal(currentURL(), '/pricing/edit/newLab'); await fillIn('.price-name input', 'Test Lab Item'); await fillIn('.price-amount input', 10); await fillIn('.price-department input', 'Test Expense Acct'); await click('button:contains(Add):last'); await waitToAppear('.modal-dialog'); assert.dom('.modal-title').hasText('Pricing Item Saved', 'Pricing Item saved'); await click('button:contains(Return)'); assert.dom('td:nth-child(4)').hasText('Lab Procedure'); await click('button:contains(Delete)'); await waitToAppear('.modal-dialog'); await click('button:contains(Delete):last'); // test that changing Category sets proper Pricing Type depending on which Category selected await visit('/pricing/ward'); await click('button:contains(+ new item)'); assert.equal(currentURL(), '/pricing/edit/newWard'); await fillIn('.price-name input', 'Test Ward Item'); await fillIn('.price-amount input', 10); await fillIn('.price-department input', 'Test Expense Acct'); await fillIn('.price-type input', 'fake price type'); await select('.price-category', 'Procedure'); assert.dom('.price-type input').hasText('', 'Changing Category to "Procedure" sets Pricing Type to ""'); await select('.price-category', 'Imaging'); await click('button:contains(Add):last'); await waitToAppear('.modal-dialog'); assert.dom('.modal-title').hasText('Pricing Item Saved', 'Pricing Item saved'); await click('button:contains(Return)'); assert.dom('td:nth-child(4)').hasText('Imaging Procedure'); });
return runWithPouchDump('patient', async function() { await authenticateUser(); await visit('/patients'); await fillIn('[role="search"] div input', 'Joe'); await click('.glyphicon-search'); assert.equal(currentURL(), '/patients/search/Joe', 'Searched for Joe'); assert.equal(find('button:contains(Delete)').length, 1, 'There is one search item'); await fillIn('[role="search"] div input', 'joe'); await click('.glyphicon-search'); assert.equal(currentURL(), '/patients/search/joe', 'Searched for all lower case joe'); assert.equal(find('button:contains(Delete)').length, 1, 'There is one search item'); await fillIn('[role="search"] div input', 'ItemNotFound'); await click('.glyphicon-search'); assert.equal(currentURL(), '/patients/search/ItemNotFound', 'Searched for ItemNotFound'); assert.equal(find('button:contains(Delete)').length, 0, 'There is no search result'); });
return runWithPouchDump('patient', async function() { await authenticateUser(); await visit('/patients'); assert.equal(currentURL(), '/patients', 'Patient listing url is correct'); assert.equal(find('tr.clickable td:contains(Joe)').length, 1, 'One patient exists to delete.'); await click('tr.clickable button:contains(Delete)'); await waitToAppear('.modal-dialog'); assert.dom('.modal-title').hasText('Delete Patient', 'Delete Patient '); assert.dom('.modal-body').hasText( 'Are you sure you wish to delete Joe Bagadonuts?', 'Patient information appears in modal' ); await click('.modal-footer button:contains(Delete)'); await waitToDisappear('.modal-dialog'); await waitToDisappear('tr.clickable td:contains(Joe)'); assert.equal(find('tr.clickable td:contains(Joe)').length, 0, 'Patient has been successfully deleted.'); });
return runWithPouchDump('patient', async function() { await authenticateUser(); await visit('/patients/admitted'); assert.equal(currentURL(), '/patients/admitted'); assert.dom('.clickable').exists({ count: 1 }, 'One patient is listed'); await click('button:contains(Discharge)'); await waitToAppear('.view-current-title:contains(Edit Visit)'); assert.equal(currentURL(), '/visits/edit/03C7BF8B-04E0-DD9E-9469-96A5604F5340', 'should return visits/edit instead'); await click('.panel-footer button:contains(Discharge)'); await waitToAppear('.modal-dialog'); assert.dom('.modal-title').hasText('Patient Discharged', 'Patient has been discharged'); await click('button:contains(Ok)'); await visit('/patients/admitted'); await waitToAppear('.view-current-title:contains(Admitted Patients)'); assert.dom('.clickable').doesNotExist('No patient is listed'); });
return runWithPouchDump('billing', async function() { await authenticateUser(); await visit('/pricing'); await fillIn('[role="search"] div input', 'Xray Hand'); await click('.glyphicon-search'); assert.equal(currentURL(), '/pricing/search/Xray%20Hand', 'Searched for Name: Xray Hand'); assert.equal(find('button:contains(Delete)').length, 1, 'There is one search item'); await fillIn('[role="search"] div input', 'Blood'); await click('.glyphicon-search'); assert.equal(currentURL(), '/pricing/search/Blood', 'Searched for Name: Blood'); assert.equal(find('button:contains(Delete)').length, 1, 'There is one search item'); await fillIn('[role="search"] div input', 'Leg'); await click('.glyphicon-search'); assert.equal(currentURL(), '/pricing/search/Leg', 'Searched for Name: Leg'); assert.equal(find('button:contains(Delete)').length, 1, 'There is one search item'); await fillIn('[role="search"] div input', 'Gauze'); await click('.glyphicon-search'); assert.equal(currentURL(), '/pricing/search/Gauze', 'Searched for Name: Gauze'); assert.equal(find('button:contains(Delete)').length, 1, 'There is one search item'); await fillIn('[role="search"] div input', 'xray'); await click('.glyphicon-search'); assert.equal(currentURL(), '/pricing/search/xray', 'Searched for all lower case xray'); assert.equal(find('button:contains(Delete)').length, 1, 'There is one search item'); await fillIn('[role="search"] div input', 'd'); await click('.glyphicon-search'); assert.equal(currentURL(), '/pricing/search/d', 'Searched for the letter d'); assert.equal(find('button:contains(Delete)').length, 3, 'There are three search items'); await fillIn('[role="search"] div input', 'ItemNotFound'); await click('.glyphicon-search'); assert.equal(currentURL(), '/pricing/search/ItemNotFound', 'Searched for ItemNotFound'); assert.dom('.clickable').doesNotExist('There is no search result'); });
return runWithPouchDump('default', async function() { await authenticateUser(); await addAllUsers(assert); await visit('/admin/users'); stubRequest('put', '/db/_users/org.couchdb.user:jane@donuts.com', function(request) { let expectedBody = { _id: 'org.couchdb.user:jane@donuts.com', deleted: false, displayName: 'Jane Bagadonuts', email: '*****@*****.**', name: '*****@*****.**', password: '******', roles: ['Hospital Administrator', 'user'], userPrefix: 'p02', type: 'user' }; assert.equal(request.requestBody, JSON.stringify(expectedBody), 'New user data sent to the server'); request.ok({ 'ok': true, 'id': 'org.couchdb.user:jane@donuts.com', 'rev': '1-ef3d54502f2cc8e8f73d8547881f0836' }); }); await visit('/admin/users/edit/new'); await select('.user-role', 'Hospital Administrator'); await fillIn('.user-display-name input', 'Jane Bagadonuts'); await fillIn('.user-email input', '*****@*****.**'); await fillIn('.user-password input', 'password'); await click('button:contains(Add)'); await waitToAppear('.modal-dialog'); assert.dom('.modal-title').hasText('User Saved', 'User was saved successfully'); assert.dom('.view-current-title').hasText('Edit User', 'Page title changed to Edit User'); await click('button:contains(Ok)'); });
return runWithPouchDump('default', async function() { await authenticateUser(); await addAllUsers(assert); stubRequest('put', '/db/_users/org.couchdb.user:joe@donuts.com', function(request) { let expectedBody = { _id: 'org.couchdb.user:joe@donuts.com', derived_key: 'derivedkeyhere', deleted: true, displayName: 'Joe Bagadonuts', email: '*****@*****.**', iterations: 10, name: '*****@*****.**', password_scheme: 'pbkdf2', _rev: '1-ef3d54502f2cc8e8f73d8547881f0836', roles: ['deleted'], salt: 'saltgoeshere', userPrefix: 'p01', type: 'user' }; assert.equal(request.requestBody, JSON.stringify(expectedBody), 'Delete user request sent to the server'); request.ok({ 'ok': true, 'id': 'org.couchdb.user:joe@donuts.com', 'rev': '1-ef3d54502f2cc8e8f73d8547881f0836' }); }); await visit('/admin/users'); await click('button:contains(Delete):last'); await waitToAppear('.modal-dialog'); assert.dom('.alert').hasText('Are you sure you wish to delete ?', 'User is displayed for deletion'); await click('button:contains(Delete):last'); assert.equal(find('.user-email:contains(joe@donuts.com)').length, 0, 'User disappears from user list'); });