Skip to content

Commit f67d64b

Browse files
committed
Merge branch 'development' into talkback-prototyping
2 parents 003d29a + fc4b299 commit f67d64b

File tree

56 files changed

+1298
-444
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1298
-444
lines changed

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1+
## [1.17.0](https://github.com/w3c/aria-at-app/compare/v1.16.0...v1.17.0) (2025-07-01)
2+
3+
4+
### Features
5+
6+
* add at versions and browser version to conflicts table ([#1445](https://github.com/w3c/aria-at-app/issues/1445)) ([5e1cae6](https://github.com/w3c/aria-at-app/commit/5e1cae6bf1db07dfc8a5cd0f55e6c776e0bfec2e))
7+
8+
9+
### Bug Fixes
10+
11+
* Allow admins to approve Candidate Reports ([#1428](https://github.com/w3c/aria-at-app/issues/1428)) ([27fe7f2](https://github.com/w3c/aria-at-app/commit/27fe7f2ac5b9e7e8d71ef46f97b0ea95ee5ab332))
12+
* Fix negative side effect phrases in test plan reports ([#1438](https://github.com/w3c/aria-at-app/issues/1438)) ([d7a7663](https://github.com/w3c/aria-at-app/commit/d7a7663348ef3be9b9379b94619ea6b63090958d))
13+
* improve feedback on results of automated report update ([#1441](https://github.com/w3c/aria-at-app/issues/1441)) ([511a73a](https://github.com/w3c/aria-at-app/commit/511a73a067fce805e484bc978a5169483046a0fb))
14+
* Improve form UI for untestable assertions ([#1446](https://github.com/w3c/aria-at-app/issues/1446)) ([f391bf8](https://github.com/w3c/aria-at-app/commit/f391bf8451f47aec7246cc16870bb413c92e8a72))
15+
* table row minimum at fix ([#1443](https://github.com/w3c/aria-at-app/issues/1443)) ([6e1709a](https://github.com/w3c/aria-at-app/commit/6e1709ae4c2911254d080032803c3b34cd8d8cad))
16+
117
## [1.16.0](https://github.com/w3c/aria-at-app/compare/v1.15.2...v1.16.0) (2025-06-16)
218

319
### Features

client/components/CandidateReview/CandidateModals/ProvideFeedbackModal/index.jsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ const ProvideFeedbackModal = ({
1616
changesRequestedIssues = [],
1717
changesRequestedGithubUrl = '',
1818
testPlan = '',
19-
username = '',
20-
isAdmin = false
19+
username = ''
2120
}) => {
2221
const [selectedRadio, setSelectedRadio] = useState('not-approved-input');
2322

@@ -71,8 +70,6 @@ const ProvideFeedbackModal = ({
7170
name="radio-feedback"
7271
id="approve-input"
7372
type="radio"
74-
disabled={isAdmin}
75-
aria-disabled={isAdmin}
7673
/>
7774
<FormCheck.Label htmlFor="approve-input">
7875
Approve
@@ -124,8 +121,7 @@ ProvideFeedbackModal.propTypes = {
124121
feedbackGithubUrl: PropTypes.string,
125122
show: PropTypes.bool,
126123
testPlan: PropTypes.string,
127-
username: PropTypes.string,
128-
isAdmin: PropTypes.bool
124+
username: PropTypes.string
129125
};
130126

131127
export default ProvideFeedbackModal;

client/components/CandidateReview/CandidateTestPlanRun/index.jsx

Lines changed: 88 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ import FailingAssertionsSummaryTable from '../../FailingAssertionsSummary/Table'
3535
import FailingAssertionsSummaryHeading from '../../FailingAssertionsSummary/Heading';
3636
import NegativeSideEffectsSummaryTable from '../../NegativeSideEffectsSummary/Table';
3737
import NegativeSideEffectsSummaryHeading from '../../NegativeSideEffectsSummary/Heading';
38+
import UntestableAssertionsSummaryTable from '../../UntestableAssertionsSummary/Table';
39+
import UntestableAssertionsSummaryHeading from '../../UntestableAssertionsSummary/Heading';
3840
import styles from './CandidateTestPlanRun.module.css';
3941
import feedbackStyles from '../FeedbackListItem/FeedbackListItem.module.css';
4042
import testRunStyles from '../../TestRun/TestRun.module.css';
@@ -52,8 +54,7 @@ const vendorReviewStatusMap = {
5254
IN_PROGRESS: 'In Progress',
5355
APPROVED: 'Approved'
5456
};
55-
const FAILING_ASSERTIONS_INDEX = -1;
56-
const NEGATIVE_SIDE_EFFECTS = -2;
57+
const SUMMARY_OF_FAILURES_INDEX = -1;
5758

5859
const CandidateTestPlanRun = () => {
5960
const { atId, testPlanVersionId } = useParams();
@@ -67,7 +68,7 @@ const CandidateTestPlanRun = () => {
6768
const [viewedTests, setViewedTests] = useState([]);
6869
const [testsLength, setTestsLength] = useState(0);
6970
const [currentTestIndex, setCurrentTestIndex] = useUrlTestIndex({
70-
minTestIndex: -2,
71+
minTestIndex: SUMMARY_OF_FAILURES_INDEX,
7172
maxTestIndex: testsLength
7273
});
7374
const [showTestNavigator, setShowTestNavigator] = useState(true);
@@ -122,7 +123,6 @@ const CandidateTestPlanRun = () => {
122123
);
123124

124125
const auth = evaluateAuth(data?.me ? data?.me : {});
125-
const { isAdmin } = auth;
126126
const { data: reviewerStatusData } = useQuery(REVIEWER_STATUS_QUERY, {
127127
variables: {
128128
userId: auth.id,
@@ -131,9 +131,22 @@ const CandidateTestPlanRun = () => {
131131
skip: !testPlanReport
132132
});
133133

134-
const isSummaryView =
135-
currentTestIndex === FAILING_ASSERTIONS_INDEX ||
136-
currentTestIndex === NEGATIVE_SIDE_EFFECTS;
134+
const isSummaryView = currentTestIndex === SUMMARY_OF_FAILURES_INDEX;
135+
136+
const shouldShowFailingAssertionsSummary = useMemo(() => {
137+
return (
138+
testPlanReport?.metrics.mustAssertionsFailedCount > 0 ||
139+
testPlanReport?.metrics.shouldAssertionsFailedCount > 0
140+
);
141+
}, [testPlanReport]);
142+
143+
const shouldShowNegativeSideEffectsSummary = useMemo(() => {
144+
return testPlanReport?.metrics.unexpectedBehaviorCount > 0;
145+
}, [testPlanReport]);
146+
147+
const shouldShowUntestableAssertionsSummary = useMemo(() => {
148+
return testPlanReport?.metrics.assertionsUntestableCount > 0;
149+
}, [testPlanReport]);
137150

138151
const isLaptopOrLarger = useMediaQuery({
139152
query: '(min-width: 792px)'
@@ -320,7 +333,7 @@ const CandidateTestPlanRun = () => {
320333
const { recommendedPhaseTargetDate } = testPlanVersion;
321334

322335
const pageTitlePrefix = isSummaryView
323-
? 'Summary of Failing Assertions'
336+
? 'Summary of Failures'
324337
: `${currentTestIndex + 1}. ${currentTest?.title}`;
325338

326339
const pageTitle = `${pageTitlePrefix} | ${testPlanVersion.title} | Candidate Review | ARIA-AT`;
@@ -410,30 +423,14 @@ const CandidateTestPlanRun = () => {
410423
const fileBugUrl = AtBugTrackerMap[at];
411424

412425
const getHeading = () => {
413-
if (currentTestIndex === FAILING_ASSERTIONS_INDEX) {
426+
if (currentTestIndex === SUMMARY_OF_FAILURES_INDEX) {
414427
return (
415428
<>
416429
<span className={testRunStyles.taskLabel}>
417430
Candidate Test Plan Review
418431
</span>
419-
<FailingAssertionsSummaryHeading
420-
metrics={testPlanReport.metrics}
421-
as="h1"
422-
/>
423-
</>
424-
);
425-
}
426432

427-
if (currentTestIndex === NEGATIVE_SIDE_EFFECTS) {
428-
return (
429-
<>
430-
<span className={testRunStyles.taskLabel}>
431-
Candidate Test Plan Review
432-
</span>
433-
<NegativeSideEffectsSummaryHeading
434-
metrics={testPlanReport.metrics}
435-
as="h1"
436-
/>
433+
<h1>Summary of Failures</h1>
437434
</>
438435
);
439436
}
@@ -579,34 +576,72 @@ const CandidateTestPlanRun = () => {
579576
};
580577

581578
const getContent = () => {
582-
if (currentTestIndex === FAILING_ASSERTIONS_INDEX) {
579+
if (currentTestIndex === SUMMARY_OF_FAILURES_INDEX) {
583580
return (
584-
<div
585-
className={
586-
failingAssertionsSummaryStyles.failingAssertionsSummaryTableContainer
587-
}
588-
>
589-
<FailingAssertionsSummaryTable
590-
testPlanReport={testPlanReports[0]}
591-
atName={at}
592-
getLinkUrl={assertion => `#${assertion.testIndex + 1}`}
593-
/>
594-
</div>
595-
);
596-
}
597-
if (currentTestIndex === NEGATIVE_SIDE_EFFECTS) {
598-
return (
599-
<div
600-
className={
601-
failingAssertionsSummaryStyles.failingAssertionsSummaryTableContainer
602-
}
603-
>
604-
<NegativeSideEffectsSummaryTable
605-
testPlanReport={testPlanReports[0]}
606-
atName={at}
607-
getLinkUrl={assertion => `#${assertion.testIndex + 1}`}
608-
/>
609-
</div>
581+
<>
582+
{shouldShowFailingAssertionsSummary && (
583+
<>
584+
<FailingAssertionsSummaryHeading
585+
metrics={testPlanReport.metrics}
586+
as="h2"
587+
/>
588+
589+
<div
590+
className={
591+
failingAssertionsSummaryStyles.failingAssertionsSummaryTableContainer
592+
}
593+
>
594+
<FailingAssertionsSummaryTable
595+
testPlanReport={testPlanReports[0]}
596+
atName={at}
597+
getLinkUrl={assertion => `#${assertion.testIndex + 1}`}
598+
/>
599+
</div>
600+
</>
601+
)}
602+
603+
{shouldShowNegativeSideEffectsSummary && (
604+
<>
605+
<NegativeSideEffectsSummaryHeading
606+
metrics={testPlanReport.metrics}
607+
as="h2"
608+
/>
609+
610+
<div
611+
className={
612+
failingAssertionsSummaryStyles.failingAssertionsSummaryTableContainer
613+
}
614+
>
615+
<NegativeSideEffectsSummaryTable
616+
testPlanReport={testPlanReports[0]}
617+
atName={at}
618+
getLinkUrl={assertion => `#${assertion.testIndex + 1}`}
619+
/>
620+
</div>
621+
</>
622+
)}
623+
624+
{shouldShowUntestableAssertionsSummary && (
625+
<>
626+
<UntestableAssertionsSummaryHeading
627+
metrics={testPlanReport.metrics}
628+
as="h2"
629+
/>
630+
631+
<div
632+
className={
633+
failingAssertionsSummaryStyles.failingAssertionsSummaryTableContainer
634+
}
635+
>
636+
<UntestableAssertionsSummaryTable
637+
testPlanReport={testPlanReports[0]}
638+
atName={at}
639+
getLinkUrl={assertion => `#${assertion.testIndex + 1}`}
640+
/>
641+
</div>
642+
</>
643+
)}
644+
</>
610645
);
611646
}
612647
return (
@@ -827,7 +862,6 @@ const CandidateTestPlanRun = () => {
827862
changesRequestedGithubUrl={changesRequestedGithubUrl}
828863
handleAction={submitApproval}
829864
handleHide={() => setFeedbackModalShowing(false)}
830-
isAdmin={isAdmin}
831865
/>
832866
)}
833867
{!!confirmationModal && confirmationModal}

client/components/ManageBotRunDialog/WithButton.jsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { Button } from 'react-bootstrap';
44
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
55
import { faRobot } from '@fortawesome/free-solid-svg-icons';
66
import ManageBotRunDialog from '.';
7-
import { useTestPlanRunIsFinished } from '../../hooks/useTestPlanRunIsFinished';
87
import { TestPlanRunPropType, UserPropType } from '../common/proptypes';
98

109
const ManageBotRunDialogWithButton = ({
@@ -14,11 +13,7 @@ const ManageBotRunDialogWithButton = ({
1413
testers,
1514
onChange
1615
}) => {
17-
const { runIsFinished } = useTestPlanRunIsFinished(testPlanRun.id);
1816
const [showDialog, setShowDialog] = useState(false);
19-
if (runIsFinished) {
20-
return null;
21-
}
2217

2318
return (
2419
<>

client/components/Reports/SummarizeTestPlanReport.jsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import FailingAssertionsSummaryTable from '../FailingAssertionsSummary/Table';
2727
import FailingAssertionsSummaryHeading from '../FailingAssertionsSummary/Heading';
2828
import NegativeSideEffectsSummaryTable from '../NegativeSideEffectsSummary/Table';
2929
import NegativeSideEffectsSummaryHeading from '../NegativeSideEffectsSummary/Heading';
30+
import UntestableAssertionsSummaryTable from '../UntestableAssertionsSummary/Table';
31+
import UntestableAssertionsSummaryHeading from '../UntestableAssertionsSummary/Heading';
3032
import styles from './SummarizeTestPlanReport.module.css';
3133
import commonStyles from '../common/styles.module.css';
3234

@@ -209,6 +211,31 @@ const SummarizeTestPlanReport = ({ testPlanVersion, testPlanReports }) => {
209211
);
210212
};
211213

214+
const renderUntestableAssertionsSummary = () => {
215+
// Use truthiness check (rather than strict equality to zero) in order to
216+
// support legacy reports whose metrics have been memoized and thus do not
217+
// include properties for untestable assertions.
218+
if (
219+
!testPlanReport.metrics.mustAssertionsUntestableCount &&
220+
!testPlanReport.metrics.shouldAssertionsUntestableCount
221+
) {
222+
return null;
223+
}
224+
225+
return (
226+
<>
227+
<UntestableAssertionsSummaryHeading metrics={testPlanReport.metrics} />
228+
<UntestableAssertionsSummaryTable
229+
testPlanReport={testPlanReport}
230+
atName={testPlanReport.at.name}
231+
getLinkUrl={assertion =>
232+
`/report/${testPlanVersion.id}/targets/${testPlanReport.id}#result-${assertion.testResultId}`
233+
}
234+
/>
235+
</>
236+
);
237+
};
238+
212239
return (
213240
<Container id="main" as="main" tabIndex="-1">
214241
<Helmet>
@@ -285,6 +312,7 @@ const SummarizeTestPlanReport = ({ testPlanVersion, testPlanReports }) => {
285312
{renderResultsForTargetTable()}
286313
{renderFailingAssertionsSummary()}
287314
{renderNegativeSideEffectsSummary()}
315+
{renderUntestableAssertionsSummary()}
288316
{testPlanReport.finalizedTestResults.map((testResult, index) => {
289317
const test = testResult.test;
290318

client/components/TestPlanReportStatusDialog/index.jsx

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,27 +42,27 @@ const TestPlanReportStatusDialog = ({
4242
return { requiredReportsCount: requiredCount, sortedStatuses: sorted };
4343
}, [testPlanReportStatuses]);
4444

45-
const [tableRowMinimumAtVersions, setTableRowMinimumAtVersions] = useState(
46-
sortedStatuses.map((status, index) => ({
47-
index,
48-
minimumAtVersion: status.minimumAtVersion
49-
}))
45+
// Track only user overrides for minimum AT versions using Map to avoid array sync issues
46+
const [minimumAtVersionOverrides, setMinimumAtVersionOverrides] = useState(
47+
new Map()
5048
);
5149

5250
const tableRowMinimumAtVersionChange = (index, newMinimumAtVersion) => {
53-
setTableRowMinimumAtVersions(prevRows =>
54-
prevRows.map(row =>
55-
row.index === index
56-
? { ...row, minimumAtVersion: newMinimumAtVersion }
57-
: row
58-
)
59-
);
51+
setMinimumAtVersionOverrides(prev => {
52+
const next = new Map(prev);
53+
next.set(index, newMinimumAtVersion);
54+
return next;
55+
});
56+
};
57+
58+
const getMinimumAtVersionForIndex = (index, status) => {
59+
return minimumAtVersionOverrides.get(index) || status.minimumAtVersion;
6060
};
6161

6262
const tableRows = sortedStatuses.map((status, index) => {
6363
const { isRequired, at, browser, exactAtVersion, testPlanReport } = status;
6464

65-
const minimumAtVersion = tableRowMinimumAtVersions[index].minimumAtVersion;
65+
const minimumAtVersion = getMinimumAtVersionForIndex(index, status);
6666

6767
const key =
6868
`${at.name}-${browser.name}-` +

0 commit comments

Comments
 (0)