Skip to content

Commit 97a94b4

Browse files
committed
Better tests
1 parent d225b02 commit 97a94b4

File tree

5 files changed

+168
-149
lines changed

5 files changed

+168
-149
lines changed

client/tests/TestQueue/OnHoldButton.test.jsx

Lines changed: 0 additions & 75 deletions
This file was deleted.

client/tests/TestRun/OnHoldModal.test.jsx

Lines changed: 0 additions & 74 deletions
This file was deleted.

client/tests/e2e/TestQueue.e2e.test.js

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,81 @@ describe('Test Queue admin traits when reports exist', () => {
384384
).toBe(true);
385385
});
386386
});
387+
388+
it('allows admin to toggle On hold and shows pill in Status', async () => {
389+
await getPage({ role: 'admin', url: '/test-queue' }, async page => {
390+
const sectionButtonSelector = 'button#disclosure-btn-modal-dialog-0';
391+
const tableSelector =
392+
'table[aria-label="Reports for Modal Dialog Example V24.06.07 in draft phase"]';
393+
394+
await page.waitForSelector(sectionButtonSelector);
395+
await page.click(sectionButtonSelector);
396+
await page.waitForSelector(tableSelector);
397+
398+
// Work with first row in the table body
399+
const selectors = await page.$eval(tableSelector, el => {
400+
const firstRow = el.querySelector('tbody tr');
401+
const cells = firstRow.querySelectorAll('td');
402+
return {
403+
statusCellText: cells[3].innerText,
404+
actionsCellSelector: 'tbody tr td:nth-child(5)'
405+
};
406+
});
407+
408+
// Ensure not on hold initially
409+
expect(selectors.statusCellText.includes('On hold')).toBe(false);
410+
411+
// Click the toggle to put on hold
412+
await page.$eval(
413+
`${tableSelector} ${selectors.actionsCellSelector}`,
414+
el => {
415+
const btn = Array.from(el.querySelectorAll('button')).find(b =>
416+
/Put on hold/i.test(b.innerText)
417+
);
418+
if (btn) btn.click();
419+
}
420+
);
421+
422+
await page.waitForNetworkIdle();
423+
424+
// Verify pill and button label
425+
const [statusTextAfter, toggleLabelAfter] = await page.$eval(
426+
tableSelector,
427+
el => {
428+
const firstRow = el.querySelector('tbody tr');
429+
const cells = firstRow.querySelectorAll('td');
430+
const statusText = cells[3].innerText;
431+
const actionsCell = cells[4];
432+
const btn = Array.from(actionsCell.querySelectorAll('button')).find(
433+
b => /Ready for testing|Put on hold/i.test(b.innerText)
434+
);
435+
return [statusText, btn ? btn.innerText : ''];
436+
}
437+
);
438+
439+
expect(statusTextAfter.includes('On hold')).toBe(true);
440+
expect(/Ready for testing/i.test(toggleLabelAfter)).toBe(true);
441+
442+
// Toggle back to ready
443+
await page.$eval(tableSelector, el => {
444+
const firstRow = el.querySelector('tbody tr');
445+
const actionsCell = firstRow.querySelectorAll('td')[4];
446+
const btn = Array.from(actionsCell.querySelectorAll('button')).find(b =>
447+
/Ready for testing/i.test(b.innerText)
448+
);
449+
if (btn) btn.click();
450+
});
451+
await page.waitForNetworkIdle();
452+
453+
const statusTextFinal = await page.$eval(tableSelector, el => {
454+
const firstRow = el.querySelector('tbody tr');
455+
const cells = firstRow.querySelectorAll('td');
456+
return cells[3].innerText;
457+
});
458+
459+
expect(statusTextFinal.includes('On hold')).toBe(false);
460+
});
461+
});
387462
});
388463

389464
describe('Test Queue tester traits when reports exist', () => {

client/tests/e2e/TestRun.e2e.test.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,92 @@ describe('Test Run when signed in as tester', () => {
603603
});
604604
});
605605

606+
it('enforces read-only and shows on-hold modal when report is On hold', async () => {
607+
// Ensure the report is On hold as admin first, then switch to tester in same page
608+
await getPage({ role: 'admin', url: '/test-queue' }, async page => {
609+
const sectionButtonSelector = 'button#disclosure-btn-modal-dialog-0';
610+
const tableSelector =
611+
'table[aria-label="Reports for Modal Dialog Example V24.06.07 in draft phase"]';
612+
613+
await page.waitForSelector(sectionButtonSelector);
614+
await page.click(sectionButtonSelector);
615+
await page.waitForSelector(tableSelector);
616+
617+
// Toggle to On hold if not already
618+
const toggleWasClicked = await page.$eval(tableSelector, el => {
619+
const firstRow = el.querySelector('tbody tr');
620+
const actionsCell = firstRow.querySelectorAll('td')[4];
621+
const btn = Array.from(actionsCell.querySelectorAll('button')).find(b =>
622+
/Put on hold|Ready for testing/i.test(b.innerText)
623+
);
624+
if (!btn) return false;
625+
const isOnHold = /Ready for testing/i.test(btn.innerText);
626+
if (!isOnHold) {
627+
btn.click();
628+
return true;
629+
}
630+
return false;
631+
});
632+
if (toggleWasClicked) await page.waitForNetworkIdle();
633+
634+
// Verify status shows On hold
635+
const statusText = await page.$eval(tableSelector, el => {
636+
const firstRow = el.querySelector('tbody tr');
637+
const statusCell = firstRow.querySelectorAll('td')[3];
638+
return statusCell.innerText;
639+
});
640+
expect(statusText.includes('On hold')).toBe(true);
641+
642+
// Sign in as tester within same session/transaction
643+
await page.evaluate('signMeInAsTester("joe-the-tester")');
644+
await page.waitForSelector('::-p-text(Signed in)');
645+
646+
// Expand and assign self
647+
await page.waitForSelector(sectionButtonSelector);
648+
await page.click(sectionButtonSelector);
649+
await page.waitForSelector(tableSelector);
650+
await page.$eval(tableSelector, el => {
651+
// First button is Assign Yourself
652+
el.querySelector('button').click();
653+
});
654+
await page.waitForNetworkIdle();
655+
await page.waitForSelector('::-p-text(Unassign Yourself)');
656+
657+
// Start testing
658+
await page.waitForSelector('a[role="button"] ::-p-text(Start Testing)');
659+
await page.click('a[role="button"] ::-p-text(Start Testing)');
660+
await page.waitForNavigation({
661+
waitUntil: ['domcontentloaded', 'networkidle0']
662+
});
663+
664+
// Wait for Test Run to render
665+
await page.waitForSelector('h1 ::-p-text(Test 1:)');
666+
667+
// On hold modal should be visible
668+
await page.waitForSelector('::-p-text(On hold)');
669+
670+
// Submit button should be disabled
671+
await page.waitForSelector('button ::-p-text(Submit Results)');
672+
const submitDisabled = await page.$eval(
673+
'button[class="btn btn-primary"] ::-p-text(Submit Results)',
674+
el => el.closest('button').disabled
675+
);
676+
expect(submitDisabled).toBe(true);
677+
678+
// Start Over should be disabled
679+
const startOverDisabled = await page.$eval(
680+
'button ::-p-text(Start Over)',
681+
el => el.closest('button').disabled
682+
);
683+
expect(startOverDisabled).toBe(true);
684+
685+
// Close label should be present (not Save and Close)
686+
await page.waitForSelector('button ::-p-text(Close)');
687+
const hasSaveAndClose = await page.$('button ::-p-text(Save and Close)');
688+
expect(hasSaveAndClose).toBeNull();
689+
});
690+
});
691+
606692
it('focuses first assertion radio button when only top output is filled', async () => {
607693
await getPage({ role: 'tester', url: '/test-queue' }, async page => {
608694
await assignSelfAndNavigateToRun(page);

server/tests/integration/graphql.test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,7 @@ describe('graphql', () => {
576576
startedAt
577577
completedAt
578578
}
579+
onHold
579580
isRerun
580581
percentComplete
581582
metrics
@@ -756,6 +757,12 @@ describe('graphql', () => {
756757
locationOfData
757758
}
758759
}
760+
setOnHold: testPlanReport(id: 1) {
761+
__typename
762+
setOnHold(onHold: true) {
763+
locationOfData
764+
}
765+
}
759766
deleteRun: testPlanReport(id: 2) {
760767
__typename
761768
deleteTestPlanRun(userId: 2) {

0 commit comments

Comments
 (0)