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
1 change: 1 addition & 0 deletions __mocks__/styleMock.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = {};
1 change: 1 addition & 0 deletions a11y-result.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"numFailedTestSuites":1,"numFailedTests":2,"numPassedTestSuites":0,"numPassedTests":1,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":3,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1771820050774,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":["Accessibility checks"],"duration":276,"failing":false,"failureDetails":[{"matcherResult":{"actual":1,"expected":0,"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m0\u001b[39m\nReceived: \u001b[31m1\u001b[39m","name":"toBe","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m0\u001b[39m\nReceived: \u001b[31m1\u001b[39m\n at Object.toBe (/home/theashutoshmishra/contributor-spotlight/contributor-spotlight/a11y.test.js:42:39)"],"fullName":"Accessibility checks ContributorCard should have no a11y violations","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1771820053032,"status":"failed","title":"ContributorCard should have no a11y violations"},{"ancestorTitles":["Accessibility checks"],"duration":93,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Accessibility checks FeaturedContributor should have no a11y violations","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1771820053317,"status":"passed","title":"FeaturedContributor should have no a11y violations"},{"ancestorTitles":["Accessibility checks"],"duration":199,"failing":false,"failureDetails":[{"matcherResult":{"actual":1,"expected":0,"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m0\u001b[39m\nReceived: \u001b[31m1\u001b[39m","name":"toBe","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m0\u001b[39m\nReceived: \u001b[31m1\u001b[39m\n at Object.toBe (/home/theashutoshmishra/contributor-spotlight/contributor-spotlight/a11y.test.js:90:39)"],"fullName":"Accessibility checks SearchResults should have no a11y violations","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1771820053411,"status":"failed","title":"SearchResults should have no a11y violations"}],"endTime":1771820053698,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAccessibility checks › ContributorCard should have no a11y violations\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\n Expected: \u001b[32m0\u001b[39m\n Received: \u001b[31m1\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 40 |\u001b[39m )\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 41 |\u001b[39m \u001b[36mconst\u001b[39m results \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m axe(container)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 42 |\u001b[39m expect(results\u001b[33m.\u001b[39mviolations\u001b[33m.\u001b[39mlength)\u001b[33m.\u001b[39mtoBe(\u001b[35m0\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 43 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 44 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 45 |\u001b[39m it(\u001b[32m'FeaturedContributor should have no a11y violations'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.toBe (\u001b[22m\u001b[2m\u001b[0m\u001b[36ma11y.test.js\u001b[39m\u001b[0m\u001b[2m:42:39)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mAccessibility checks › SearchResults should have no a11y violations\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\n Expected: \u001b[32m0\u001b[39m\n Received: \u001b[31m1\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 88 |\u001b[39m )\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 89 |\u001b[39m \u001b[36mconst\u001b[39m results \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m axe(container)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 90 |\u001b[39m expect(results\u001b[33m.\u001b[39mviolations\u001b[33m.\u001b[39mlength)\u001b[33m.\u001b[39mtoBe(\u001b[35m0\u001b[39m)\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 91 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 92 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 93 |\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.toBe (\u001b[22m\u001b[2m\u001b[0m\u001b[36ma11y.test.js\u001b[39m\u001b[0m\u001b[2m:90:39)\u001b[22m\u001b[2m\u001b[22m\n","name":"/home/theashutoshmishra/contributor-spotlight/contributor-spotlight/a11y.test.js","startTime":1771820051521,"status":"failed","summary":""}],"wasInterrupted":false}
106 changes: 106 additions & 0 deletions a11y.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
// Accessibility test script using axe-core and jest
// Run with: npx jest a11y.test.js
/* global describe, it, expect */

const { configureAxe } = require('jest-axe');

const React = require('react');
const { render } = require('@testing-library/react');
const ContributorCard =
require('./src/Components/Contributor/ContributorCard.jsx').default;
const FeaturedContributor =
require('./src/Components/Featured-contributor/FeaturedContributor.jsx').default;
const SearchResults =
require('./src/Components/Search/SearchResults.jsx').default;

const axe = configureAxe({
rules: {
// You can customize rules here
},
});

describe('Accessibility checks', () => {
it('ContributorCard should have no a11y violations', async () => {
const { container } = render(
React.createElement(ContributorCard, {
contributor: {
node: {
pageAttributes: {
name: 'Jane Doe',
image: '/avatar/jane.jpg',
location: 'Earth',
datepublished: '2024-01-01',
github: 'janedoe',
linkedin: 'janedoe',
twitter: 'janedoe',
pronouns: 'she/her',
},
fields: { slug: '/contributors/jane-doe/' },
},
},
})
);
const results = await axe(container);
if (results.violations.length > 0) {
// eslint-disable-next-line no-console
console.log('ContributorCard violations:', results.violations);
}
expect(results.violations.length).toBe(0);
});

it('FeaturedContributor should have no a11y violations', async () => {
const { container } = render(
React.createElement(FeaturedContributor, {
contributor: {
node: {
pageAttributes: {
name: 'John Smith',
image: '/avatar/john.jpg',
location: 'Mars',
datepublished: '2025-01-01',
intro: 'A great contributor!',
firstcommit: '2022-01-01',
},
fields: { slug: '/contributors/john-smith/' },
},
},
darkmode: false,
})
);
const results = await axe(container);
if (results.violations.length > 0) {
// eslint-disable-next-line no-console
console.log('FeaturedContributor violations:', results.violations);
}
expect(results.violations.length).toBe(0);
});

it('SearchResults should have no a11y violations', async () => {
const { container } = render(
React.createElement(SearchResults, {
results: [
{
item: {
id: '1',
name: 'Jane Doe',
image: '/avatar/jane.jpg',
location: 'Earth',
github: 'janedoe',
linkedin: 'janedoe',
twitter: 'janedoe',
slug: '/contributors/jane-doe/',
},
score: 0,
},
],
darkmode: false,
})
);
const results = await axe(container);
if (results.violations.length > 0) {
// eslint-disable-next-line no-console
console.log('SearchResults violations:', results.violations);
}
expect(results.violations.length).toBe(0);
});
});
6 changes: 6 additions & 0 deletions babel.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = {
presets: [
['@babel/preset-env', { targets: { node: 'current' } }],
'@babel/preset-react',
],
};
11 changes: 11 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module.exports = {
testEnvironment: 'jsdom',
transform: {
'^.+\\.[jt]sx?$': 'babel-jest',
},
moduleFileExtensions: ['js', 'jsx', 'json'],
// setupFilesAfterEnv removed for simplicity
moduleNameMapper: {
'\\.(css|less|scss|sass)$': '<rootDir>/__mocks__/styleMock.js',
},
};
Loading