Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion client/tests/e2e/snapshots/saved/_account_settings.html
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ <h2>Admin Actions</h2>
<button type="button" class="btn btn-primary">
Import Latest Test Plan Versions
</button>
<p>Date of latest test plan version: October 1, 2025 21:37 UTC</p>
<p>Date of latest test plan version: October 6, 2025 22:33 UTC</p>
</section>
</main>
</div>
Expand Down
87 changes: 73 additions & 14 deletions client/tests/e2e/snapshots/saved/_data-management.html
Original file line number Diff line number Diff line change
Expand Up @@ -276,15 +276,20 @@ <h3 class="disclosure-heading">
</option>
<option value="95">Rating Radio Group</option>
<option value="59">Rating Slider</option>
<option value="7">Select Only Combobox Example</option>
<option value="39">Select Only Combobox Example</option>
<option value="97">Switch Example</option>
<option value="98">
Switch Example Using HTML Button
</option>
<option value="99">Tabs with Automatic Activation</option>
<option value="100">Tabs with Manual Activation</option>
<option value="101">Toggle Button</option>
<option value="102">Vertical Temperature Slider</option>
<option value="99">
Switch Example Using HTML Checkbox Input
</option>
<option value="100">
Tabs with Automatic Activation
</option>
<option value="101">Tabs with Manual Activation</option>
<option value="102">Toggle Button</option>
<option value="103">Vertical Temperature Slider</option>
</select>
</div>
<div class="form-group">
Expand Down Expand Up @@ -384,7 +389,7 @@ <h2>Test Plans Status Summary</h2>
data-testid="filter-all"
aria-pressed="true"
class="filter-button btn active btn-secondary">
All Plans (39)
All Plans (40)
</button>
</li>
<li>
Expand All @@ -393,7 +398,7 @@ <h2>Test Plans Status Summary</h2>
data-testid="filter-rd"
aria-pressed="false"
class="filter-button btn btn-secondary">
R&amp;D Complete (35)
R&amp;D Complete (36)
</button>
</li>
<li>
Expand Down Expand Up @@ -427,7 +432,7 @@ <h2>Test Plans Status Summary</h2>
<div class="table-responsive">
<table
aria-label="Test Plans Status Summary Table"
aria-rowcount="39"
aria-rowcount="40"
class="data-management table table-bordered table-hover">
<thead>
<tr>
Expand Down Expand Up @@ -1197,7 +1202,7 @@ <h2>Test Plans Status Summary</h2>
<td>
<div class="phase-cell" role="list" aria-setsize="2">
<span class="styled-pill full-width auto-width"
><a href="/test-review/101"
><a href="/test-review/102"
><span
><svg
aria-hidden="true"
Expand Down Expand Up @@ -2775,6 +2780,60 @@ <h2>Test Plans Status Summary</h2>
<td><span class="none centered absolute">None Yet</span></td>
</tr>
<tr aria-rowindex="36">
<th>
<a href="/data-management/switch-checkbox"
><b>Switch Example Using HTML Checkbox Input</b></a
>
</th>
<td>
<div>
<b>JAWS</b><span>, </span><b>NVDA</b><span> and </span
><b>VoiceOver for macOS</b>
</div>
</td>
<td>
<div class="status-cell">
<span class="pill full-width rd">R&amp;D</span>
<p class="review-text">Complete <b>Oct 6, 2025</b></p>
</div>
</td>
<td>
<div class="phase-cell" role="list" aria-setsize="2">
<span class="styled-pill full-width auto-width"
><a href="/test-review/99"
><span
><svg
aria-hidden="true"
focusable="false"
data-prefix="fas"
data-icon="circle-check"
class="svg-inline--fa fa-circle-check check"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
color="var(--positive-green)">
<path
fill="currentColor"
d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM369 209L241 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L335 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z"></path></svg
><b>V25.10.06</b></span
></a
></span
><button
type="button"
class="advance-button btn btn-secondary">
Advance to Draft
</button>
</div>
</td>
<td>
<span class="none centered absolute">Not Started</span>
</td>
<td>
<span class="none centered absolute">Not Started</span>
</td>
<td><span class="none centered absolute">None Yet</span></td>
</tr>
<tr aria-rowindex="37">
<th>
<a href="/data-management/tabs-automatic-activation"
><b>Tabs with Automatic Activation</b></a
Expand All @@ -2795,7 +2854,7 @@ <h2>Test Plans Status Summary</h2>
<td>
<div class="phase-cell" role="list" aria-setsize="2">
<span class="styled-pill full-width auto-width"
><a href="/test-review/99"
><a href="/test-review/100"
><span
><svg
aria-hidden="true"
Expand Down Expand Up @@ -2828,7 +2887,7 @@ <h2>Test Plans Status Summary</h2>
</td>
<td><span class="none centered absolute">None Yet</span></td>
</tr>
<tr aria-rowindex="37">
<tr aria-rowindex="38">
<th>
<a href="/data-management/tabs-manual-activation"
><b>Tabs with Manual Activation</b></a
Expand All @@ -2849,7 +2908,7 @@ <h2>Test Plans Status Summary</h2>
<td>
<div class="phase-cell" role="list" aria-setsize="2">
<span class="styled-pill full-width auto-width"
><a href="/test-review/100"
><a href="/test-review/101"
><span
><svg
aria-hidden="true"
Expand Down Expand Up @@ -2882,7 +2941,7 @@ <h2>Test Plans Status Summary</h2>
</td>
<td><span class="none centered absolute">None Yet</span></td>
</tr>
<tr aria-rowindex="38">
<tr aria-rowindex="39">
<th>
<a href="/data-management/vertical-temperature-slider"
><b>Vertical Temperature Slider</b></a
Expand All @@ -2903,7 +2962,7 @@ <h2>Test Plans Status Summary</h2>
<td>
<div class="phase-cell" role="list" aria-setsize="2">
<span class="styled-pill full-width auto-width"
><a href="/test-review/102"
><a href="/test-review/103"
><span
><svg
aria-hidden="true"
Expand Down
27 changes: 14 additions & 13 deletions docs/adding-at-automation-version.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,18 +61,19 @@ This document describes the process for adding a new version of an AT to the ARI

## Update Aria-AT App

Note that these steps are required for both NVDA and VoiceOver

1. Update the supported versions constant in the aria-at-app:
- `AT_VERSIONS_SUPPORTED_BY_COLLECTION_JOBS` in [server/util/constants.js](https://github.com/w3c/aria-at-app/blob/development/server/util/constants.js#L4)
2. Update the relevant deployment
3. Create and deploy a new release of the aria-at-app to production
4. Log in to the ARIA-AT App as an administrator
5. Navigate to the "Test Queue" page
6. Click "Manage Assistive Technology Versions"
7. If the new AT version is not listed:
1. Click "Add New AT Version"
2. Enter the version number and available date
3. Save the new version
There are two ways to add a new automation-supported AT version to the ARIA-AT App.

Note that these steps are required for NVDA and JAWS. VoiceOver will automatically be marked as latest and automation-supported when the first bot run completes with the new version.

### Option A: Add a seeder\*\*

- Create a new seeder file in `server/seeders/` to mark the version as supported
- Go through the process of deploying the changes to the ARIA-AT App

### Option B: Use GraphQL Playground\*\*

1. Navigate to the GraphQL playground in your deployed environment
2. Use the `createAtVersion` mutation to add the new version
3. Use the `promoteAutomationSupportedVersion` mutation to mark the version as latest automation-supported

The new AT version is now fully configured and ready for use in ARIA-AT App.
11 changes: 11 additions & 0 deletions server/controllers/AutomationController.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ const saveTestResultCommon = require('../resolvers/TestResultOperations/saveTest
const {
findOrCreateAtVersion
} = require('../models/services/AtVersionService');
const {
promoteAutomationSupportedVersion
} = require('../models/services/AtVersionService');
const { getAts } = require('../models/services/AtService');
const {
getBrowsers,
Expand Down Expand Up @@ -421,6 +424,14 @@ const updateJobResults = async (req, res) => {
})
]);

const isVoiceOver = at.id === 3;
if (isVoiceOver) {
await promoteAutomationSupportedVersion({
atVersionId: atVersion.id,
transaction
});
}

const processedResponses =
convertEmptyStringsToNoOutputMessages(responses);

Expand Down
1 change: 1 addition & 0 deletions server/graphql-schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -1270,6 +1270,7 @@ const graphqlSchema = gql`
}

"""
Records information about the review of a TestPlanReport by a vendor representative.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I accidentally deleted these quotes then thought it was easier to see in my IDE with the descriptor in place

"""
type ReviewerStatus {
"""
Expand Down
42 changes: 42 additions & 0 deletions server/migrations/20251014111422-add-atversion-automation-flags.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
'use strict';

/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
const table = await queryInterface.describeTable('AtVersion');
if (!table.supportedByAutomation) {
await queryInterface.addColumn('AtVersion', 'supportedByAutomation', {
type: Sequelize.BOOLEAN,
allowNull: false,
defaultValue: false
});
}
if (!table.latestAutomationSupporting) {
await queryInterface.addColumn(
'AtVersion',
'latestAutomationSupporting',
{
type: Sequelize.BOOLEAN,
allowNull: false,
defaultValue: false
}
);
}
},

async down(queryInterface) {
try {
await queryInterface.removeColumn(
'AtVersion',
'latestAutomationSupporting'
);
} catch (e) {
console.error(e);
}
try {
await queryInterface.removeColumn('AtVersion', 'supportedByAutomation');
} catch (e) {
console.error(e);
}
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
'use strict';

/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface) {
const transaction = await queryInterface.sequelize.transaction();
try {
const [ats] = await queryInterface.sequelize.query(
'select id, name from "At"',
{ transaction }
);

const supported = {
'VoiceOver for macOS': ['13.0', '14.0', '15.0'],
NVDA: ['2025.2', '2024.4.1', '2024.1', '2023.3.3', '2023.3'],
JAWS: ['2025.2508.120']
};

for (const at of ats) {
const names = supported[at.name] || [];
if (!names.length) continue;
await queryInterface.sequelize.query(
`update "AtVersion"
set "supportedByAutomation" = true
where "atId" = :atId and name in (:names)`,
{ replacements: { atId: at.id, names }, transaction }
);

// latestAutomationSupporting should be the most recent supported version by releasedAt
const [rows] = await queryInterface.sequelize.query(
`select id from "AtVersion"
where "atId" = :atId and "supportedByAutomation" = true
order by "releasedAt" desc`,
{ replacements: { atId: at.id }, transaction }
);
if (rows.length) {
const latestId = rows[0].id;
await queryInterface.sequelize.query(
`update "AtVersion" set "latestAutomationSupporting" = false where "atId" = :atId`,
{ replacements: { atId: at.id }, transaction }
);
await queryInterface.sequelize.query(
`update "AtVersion" set "latestAutomationSupporting" = true where id = :id`,
{ replacements: { id: latestId }, transaction }
);
}
}

await transaction.commit();
} catch (e) {
await transaction.rollback();
throw e;
}
},

async down(queryInterface) {
await queryInterface.sequelize.query(
'update "AtVersion" set "supportedByAutomation" = false, "latestAutomationSupporting" = false'
);
}
};
9 changes: 8 additions & 1 deletion server/models/AtVersion.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,14 @@ module.exports = function (sequelize, DataTypes) {
defaultValue: new Date()
},
supportedByAutomation: {
type: DataTypes.VIRTUAL
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false
},
latestAutomationSupporting: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false
}
},
{
Expand Down
Loading
Loading