Skip to content

Instantly share code, notes, and snippets.

@aeaston
aeaston / run_tests_with_retries.js
Created April 20, 2022 21:37
e2e retry blog post - update JUnit metrics example
mergedResults.numFailedTestSuites = newResults.numFailedTestSuites;
mergedResults.numFailedTests = newResults.numFailedTests;
mergedResults.numPassedTestSuites = oldResults.numPassedTestSuites + newResults.numPassedTestSuites;
mergedResults.numPassedTests = oldResults.numPassedTests + newResults.numPassedTests;
mergedResults.success = newResults.success;
@aeaston
aeaston / run_tests_with_retries.js
Created April 20, 2022 21:36
e2e retry blog post - merge JUnit test results script
async function runTestsAndRetry(jestConfig, retriesRemaining, mergedResults) {
const { results } = await runCLI(jestConfig, ['e2e/test']);
mergedResults = mergeTestResults(mergedResults, results);
// configure jest-junit for our test run
const junit = new JestJunit(
{},
{
outputDirectory: './test-results/',
@aeaston
aeaston / package.json
Last active April 20, 2022 21:29
e2e retry blog post - npm script example
"scripts": {
"test-with-retries": "node run_tests_with_retries.js"
}
@aeaston
aeaston / run_tests_with_retries.js
Last active January 13, 2023 01:10
e2e retry blog post - initial retry script
// run_tests_with_retries.js
import { runCLI } from 'jest';
import jestConfig from './jest.config';
const NUM_RETRIES = 3;
async function runTestsAndRetry(jestConfig, retriesRemaining) {
const { results } = await runCLI(jestConfig, ['e2e/test']);
// If there were no failures or we're out of retries, return
@aeaston
aeaston / my_e2e_test.test.ts
Created April 20, 2022 21:23
e2e retry blog post - example test format
describe(‘my e2e test’, () => {
// some initial steps
it(‘fills out a form and navigates to the next step’, () => { … });
// more testing
});
@aeaston
aeaston / sr_only.scss
Created September 30, 2020 19:33
Accessible Div Blog - sr-only CSS
.sr-only {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
padding: 0;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: none;
}
@aeaston
aeaston / expanded_clickable_area.js
Created September 30, 2020 19:32
Accessible Div Blog - ExpandedClickableArea
function ExpandedClickableArea(props) {
const clickableElemTypes = ['a', 'button', 'input'];
const refExpandedArea = useRef();
function handleClick(e) {
const clickableElems = [
...refExpandedArea.current.querySelectorAll('[data-expand-click-area]')
];
if (clickableElems.length !== 1) {
throw new Error(
@aeaston
aeaston / clickable_container.js
Created September 30, 2020 19:27
Accessible Div Blog - Clickable Container
function ClickableContainer(props) {
// ideally these are stored in a separate key mapping utility file
const enterKey = 13;
const spaceKey = 32;
const { children, ariaLabel, ...otherProps } = props;
function handleKeyDown(e) {
if (e.keyCode === enterKey || e.keyCode === spaceKey) {
e.preventDefault();
props.onClick(e);
@aeaston
aeaston / account_card.js
Created September 30, 2020 19:20
Accessible Div Blog - Simple onClick
function AccountCard(props) {
function handleClick(e) {
redirect(‘account’, props.account.accountId)
}
return (
<div onClick={handleClick}>
// account card content
</div>
);