ismail c5f76b3855
Some checks are pending
Build and Push Docker Image / build (push) Waiting to run
updates
2026-05-11 14:45:30 +03:00

365 lines
16 KiB
Markdown

# Instructions
- Following Playwright test failed.
- Explain why, be concise, respect Playwright best practices.
- Provide a snippet of code with the fix, if possible.
# Test info
- Name: workflows/px-employee-creates.spec.ts >> PX Employee Creates Tests >> create QI project
- Location: e2e/tests/workflows/px-employee-creates.spec.ts:128:7
# Error details
```
Error: expect(received).toBeTruthy()
Received: false
```
# Page snapshot
```yaml
- generic [ref=e2]:
- complementary [ref=e3]:
- generic [ref=e4]:
- img "Al Hammadi" [ref=e6]
- img "Al Hammadi" [ref=e8]
- navigation [ref=e9]:
- link [ref=e10] [cursor=pointer]:
- /url: /analytics/dashboard/
- img [ref=e11]
- link [ref=e16] [cursor=pointer]:
- /url: /
- img [ref=e17]
- button [ref=e20] [cursor=pointer]:
- img [ref=e21]
- link [ref=e22] [cursor=pointer]:
- /url: /complaints/
- img [ref=e23]
- link [ref=e26] [cursor=pointer]:
- /url: /inquiries/
- img [ref=e27]
- link [ref=e30] [cursor=pointer]:
- /url: /observations/
- img [ref=e31]
- button [ref=e35] [cursor=pointer]:
- img [ref=e36]
- link [ref=e40] [cursor=pointer]:
- /url: /appreciation/
- img [ref=e41]
- link [ref=e43] [cursor=pointer]:
- /url: /suggestions/?feedback_type=suggestion
- img [ref=e44]
- button [ref=e47] [cursor=pointer]:
- img [ref=e48]
- button [ref=e52] [cursor=pointer]:
- img [ref=e53]
- link [ref=e58] [cursor=pointer]:
- /url: /organizations/departments/
- img [ref=e59]
- link [ref=e63] [cursor=pointer]:
- /url: /organizations/patients/
- img [ref=e64]
- button [ref=e68] [cursor=pointer]:
- img [ref=e69]
- button [ref=e74] [cursor=pointer]:
- img [ref=e75]
- button [ref=e82] [cursor=pointer]:
- img [ref=e83]
- link [ref=e86] [cursor=pointer]:
- /url: /notifications/send-sms/
- img [ref=e87]
- link [ref=e89] [cursor=pointer]:
- /url: /config/
- img [ref=e90]
- link [ref=e93] [cursor=pointer]:
- /url: /config/deleted/
- img [ref=e94]
- link [ref=e97] [cursor=pointer]:
- /url: /accounts/acknowledgements/my-acknowledgements/
- img [ref=e98]
- button [ref=e104] [cursor=pointer]:
- img [ref=e105]
- button [ref=e108] [cursor=pointer]:
- img [ref=e109]
- button [ref=e114] [cursor=pointer]:
- img [ref=e115]
- generic [ref=e118]:
- link "🇬🇧" [ref=e119] [cursor=pointer]:
- /url: /core/set-language/?language=en
- generic [ref=e120]: 🇬🇧
- link "🇸🇦" [ref=e121] [cursor=pointer]:
- /url: /core/set-language/?language=ar
- generic [ref=e122]: 🇸🇦
- generic [ref=e123]:
- banner [ref=e124]:
- generic [ref=e125]:
- heading "Good morning, E2E! ☀️" [level=2] [ref=e126]
- paragraph [ref=e127]: Welcome to PX360 Patient Experience Management
- generic [ref=e128]:
- generic [ref=e129]:
- img [ref=e130]
- textbox "Search..." [ref=e133]
- button "10" [ref=e135] [cursor=pointer]:
- img [ref=e136]
- generic [ref=e139]: "10"
- generic [ref=e140]:
- link "🇬🇧 English" [ref=e141] [cursor=pointer]:
- /url: /core/set-language/?language=en
- generic [ref=e142]: 🇬🇧
- generic [ref=e143]: English
- link "🇸🇦 Arabic" [ref=e144] [cursor=pointer]:
- /url: /core/set-language/?language=ar
- generic [ref=e145]: 🇸🇦
- generic [ref=e146]: Arabic
- button "E2E Hospital Admin Hospital Admin E" [ref=e148] [cursor=pointer]:
- generic [ref=e149]:
- generic [ref=e150]: E2E Hospital Admin
- generic [ref=e151]: Hospital Admin
- generic [ref=e152]: E
- img [ref=e153]
- main [ref=e155]:
- link "Back to Projects" [ref=e157] [cursor=pointer]:
- /url: /projects/
- img [ref=e158]
- generic [ref=e160]: Back to Projects
- generic [ref=e163]:
- heading "Create QI Project" [level=1] [ref=e164]:
- img [ref=e165]
- text: Create QI Project
- paragraph [ref=e166]: Start a new quality improvement initiative
- generic [ref=e167]:
- heading "Project Information" [level=2] [ref=e168]
- generic [ref=e169]:
- generic [ref=e170]:
- generic [ref=e171]:
- generic [ref=e172]: Project Name *
- textbox "Project Name *" [ref=e173]:
- /placeholder: Project name
- text: E2E QI Project 1778178889237
- generic [ref=e174]:
- text: Project Name (Arabic)
- textbox "Project Name (Arabic)" [ref=e175]:
- /placeholder: اسم المشروع
- generic [ref=e176]:
- generic [ref=e177]: Description *
- textbox "Description *" [ref=e178]:
- /placeholder: Describe the project objectives and scope...
- text: E2E QI project test 1778178889661. Please ignore.
- paragraph [ref=e179]: Describe the project objectives and scope
- generic [ref=e181]:
- text: Department
- combobox "Department" [ref=e182]:
- option "---------" [selected]
- option "Academic Education and Training Affairs"
- option "Accidents & Emergency"
- option "Anesthesia & OR Department"
- option "Business Development"
- option "Community Engagement"
- option "Contact Center Department"
- option "Continuous Medical Education Managment"
- option "Corporate Administration"
- option "Corporate Communication Department"
- option "Critical Care Department"
- option "Dental Department"
- option "Dermatology Department"
- option "Emergency Department"
- option "Executive Administration"
- option "FAMILY MEDICINE DEPARTMENT"
- option "Facility Management & Maintenance"
- option "Finance Department"
- option "Financial Collection & Claims Department"
- option "Food Services Department"
- option "Housekeeping & Hospitality Department"
- option "Human Resource"
- option "Infection Control"
- option "Information Technology"
- option "Innovation Communication Management"
- option "Inpatient Department"
- option "Internal Audit"
- option "Internal Medicine"
- option "Laboratory and Blood Bank"
- option "Laundry Department"
- option "Legal Affairs Department"
- option "Marketing Department"
- option "Medical Administration"
- option "Medical Ancillary Services"
- option "Medical Approvals Department"
- option "Medical Records Department"
- option "Nursing Department"
- option "OB/Gyne Department"
- option "ONCOLOGY"
- option "Ophthalmology Department"
- option "Outpatient Department"
- option "Patient Affairs Department"
- option "Patient Relations & Patient Experience Department"
- option "Pediatric Department"
- option "Pharmacy Department"
- option "Pharmacy Warehouse AlAziziyah"
- option "Porter Department"
- option "Radiology Department"
- option "Security Department"
- option "Senior Management Offices"
- option "Supply Chain"
- option "Support Services"
- option "Surgeries Department"
- option "TRANSFORMATION AND CHANGE MANAGEMENT"
- option "Talent Acquisition Department"
- option "Transportation Department"
- generic [ref=e183]:
- generic [ref=e184]:
- text: Project Lead
- combobox "Project Lead" [ref=e185]:
- option "---------" [selected]
- option "E2E PX Employee (e2e-px-employee@px360.test)"
- option "SHAHAD MOSLEH K ALANAZI (sh@gmail.com)"
- option "ZEENATH ABBONU KUNHIBI (ZEENATH@hh.med.sa)"
- paragraph [ref=e186]: This field is required.
- generic [ref=e187]:
- generic [ref=e188]: Status *
- combobox "Status *" [ref=e189]:
- option "Active"
- option "Inactive"
- option "Pending" [selected]
- option "Completed"
- option "Cancelled"
- generic [ref=e190]:
- text: Team Members
- listbox "Team Members" [ref=e191]:
- option "E2E PX Employee (e2e-px-employee@px360.test)" [ref=e192]
- option "SHAHAD MOSLEH K ALANAZI (sh@gmail.com)" [ref=e193]
- option "ZEENATH ABBONU KUNHIBI (ZEENATH@hh.med.sa)" [ref=e194]
- paragraph [ref=e195]: Hold Ctrl/Cmd to select multiple team members
- generic [ref=e196]:
- generic [ref=e197]:
- text: Start Date
- textbox "Start Date" [ref=e198]
- generic [ref=e199]:
- text: Target Completion Date
- textbox "Target Completion Date" [ref=e200]
- generic [ref=e201]:
- button "Create Project" [ref=e202] [cursor=pointer]:
- img [ref=e203]
- text: Create Project
- link "Cancel" [ref=e207] [cursor=pointer]:
- /url: /projects/
- img [ref=e208]
- text: Cancel
- contentinfo [ref=e211]:
- paragraph [ref=e212]:
- text: Powered by
- link "tenhal.sa" [ref=e213] [cursor=pointer]:
- /url: https://tenhal.sa
```
# Test source
```ts
49 | await page.waitForTimeout(800);
50 | });
51 |
52 | test('create observation via internal form', async ({ page }) => {
53 | const auth = new RoleAuthHelper(page);
54 | await auth.login('px_employee');
55 | await page.waitForTimeout(800);
56 |
57 | const obsId = await createObsInternal(page);
58 | expect(obsId).toBeTruthy();
59 | await page.waitForTimeout(800);
60 | });
61 |
62 | test('create inquiry via internal form', async ({ page }) => {
63 | const auth = new RoleAuthHelper(page);
64 | await auth.login('px_employee');
65 | await page.waitForTimeout(800);
66 |
67 | await page.goto('/inquiries/new/');
68 | await page.waitForLoadState('domcontentloaded');
69 | await page.waitForTimeout(2500);
70 |
71 | const subjectField = page.locator('input[name="subject"], #id_subject');
72 | if (await subjectField.count() > 0) { await subjectField.fill(`E2E Emp Inquiry ${Date.now()}`); await page.waitForTimeout(400); }
73 | const msgField = page.locator('textarea[name="message"], #id_message');
74 | if (await msgField.count() > 0) { await msgField.fill(`E2E employee inquiry test ${Date.now()}. Please ignore.`); await page.waitForTimeout(400); }
75 | const categoryField = page.locator('select[name="category"], #id_category');
76 | if (await categoryField.count() > 0) { await categoryField.selectOption({ index: 1 }); await page.waitForTimeout(400); }
77 |
78 | await submitContentForm(page);
79 |
80 | const url = page.url();
81 | const ok = url.match(/\/inquiries\/[0-9a-f-]+\/?$/) || !url.includes('/new/');
82 | expect(ok).toBeTruthy();
83 | await page.waitForTimeout(800);
84 | });
85 |
86 | test('create suggestion via internal form', async ({ page }) => {
87 | const auth = new RoleAuthHelper(page);
88 | await auth.login('px_employee');
89 | await page.waitForTimeout(800);
90 |
91 | await page.goto('/suggestions/create/');
92 | await page.waitForLoadState('domcontentloaded');
93 | await page.waitForTimeout(2500);
94 |
95 | const pageText = (await page.textContent('body')) || '';
96 | if (pageText.includes('Page not found') || pageText.includes('404')) { test.skip(); return; }
97 |
98 | const contactName = page.locator('input[name="contact_name"], #id_contact_name');
99 | if (await contactName.count() > 0) { await contactName.fill('E2E Test User'); await page.waitForTimeout(300); }
100 | const contactPhone = page.locator('input[name="contact_phone"], #id_contact_phone');
101 | if (await contactPhone.count() > 0) { await contactPhone.fill('0501112233'); await page.waitForTimeout(300); }
102 | const msgField = page.locator('textarea[name="message"], #id_message');
103 | if (await msgField.count() > 0) { await msgField.fill(`E2E employee suggestion test ${Date.now()}. Please ignore.`); await page.waitForTimeout(300); }
104 | const hospField = page.locator('select[name="hospital"], #id_hospital');
105 | if (await hospField.count() > 0) {
106 | const hasValue = await hospField.inputValue();
107 | if (!hasValue) { await hospField.selectOption(HOSPITAL_ID); await page.waitForTimeout(300); }
108 | }
109 |
110 | await submitContentForm(page);
111 | expect(page.url()).not.toContain('/create/');
112 | await page.waitForTimeout(800);
113 | });
114 |
115 | test('create appreciation via public API', async ({ page }) => {
116 | const resp = await page.request.post('/appreciation/public/submit/', {
117 | data: {
118 | contact_name: `E2E Test ${Date.now()}`,
119 | contact_phone: '0504445566',
120 | message: `E2E employee appreciation test ${Date.now()}. Great work!`,
121 | hospital: HOSPITAL_ID,
122 | },
123 | });
124 | expect([200, 201].includes(resp.status())).toBeTruthy();
125 | await page.waitForTimeout(800);
126 | });
127 |
128 | test('create QI project', async ({ page }) => {
129 | const auth = new RoleAuthHelper(page);
130 | await auth.login('hospital_admin');
131 | await page.waitForTimeout(800);
132 |
133 | await page.goto('/projects/create/');
134 | await page.waitForLoadState('domcontentloaded');
135 | await page.waitForTimeout(2500);
136 |
137 | const pageText = (await page.textContent('body')) || '';
138 | if (pageText.includes('Page not found') || pageText.includes('403') || pageText.includes('404')) { test.skip(); return; }
139 |
140 | const nameField = page.locator('input[name="name"], #id_name');
141 | if (await nameField.count() > 0) { await nameField.fill(`E2E QI Project ${Date.now()}`); await page.waitForTimeout(400); }
142 | const descField = page.locator('textarea[name="description"], #id_description');
143 | if (await descField.count() > 0) { await descField.fill(`E2E QI project test ${Date.now()}. Please ignore.`); await page.waitForTimeout(400); }
144 |
145 | await submitContentForm(page);
146 |
147 | const url = page.url();
148 | const ok = url.match(/\/projects\/[0-9a-f-]+\/?$/) || !url.includes('/create/');
> 149 | expect(ok).toBeTruthy();
| ^ Error: expect(received).toBeTruthy()
150 | await page.waitForTimeout(800);
151 | });
152 | });
153 |
```