chore(deps): update Cypress to version 12 (#51622)

Co-authored-by: Naomi Carrigan <nhcarrigan@gmail.com>
This commit is contained in:
Oliver Eyton-Williams
2023-09-22 22:42:56 +02:00
committed by GitHub
parent cf65ad4dbb
commit c772b9884a
30 changed files with 302 additions and 499 deletions
+1 -1
View File
@@ -70,7 +70,7 @@ jobs:
sed -i 's#cypress/e2e/default/#cypress/e2e/#g' cypress.config.js
- name: Cypress run
uses: cypress-io/github-action@v4
uses: cypress-io/github-action@v6
with:
record: ${{ env.CYPRESS_RECORD_KEY != 0 }}
start: npx serve
+1 -1
View File
@@ -81,7 +81,7 @@ jobs:
sed -i 's#cypress/e2e/default/#cypress/e2e/#g' cypress.config.js
- name: Cypress run
uses: cypress-io/github-action@v4
uses: cypress-io/github-action@v6
with:
record: ${{ env.CYPRESS_RECORD_KEY != 0 }}
start: pnpm run start-ci
+1 -1
View File
@@ -142,7 +142,7 @@ jobs:
run: npm i -g pm2
- name: Cypress run
uses: cypress-io/github-action@v4
uses: cypress-io/github-action@v6
with:
record: ${{ env.CYPRESS_RECORD_KEY != 0 }}
start: pnpm run start-ci
@@ -159,7 +159,7 @@ jobs:
run: cp sample.env .env
- name: Cypress run
uses: cypress-io/github-action@v4
uses: cypress-io/github-action@v6
with:
record: ${{ env.CYPRESS_RECORD_KEY != 0 }}
start: docker compose up -d
-1
View File
@@ -12,7 +12,6 @@ module.exports = defineConfig({
projectId: 'ke77ns',
retries: { openMode: 1, runMode: 4 },
chromeWebSecurity: false,
// This is the default spec pattern, that we use on /learn proper
//
// For special ones like the third- party or the mobile app specs,
+20 -27
View File
@@ -39,29 +39,40 @@ describe('Landing page', () => {
);
cy.contains(landingPageElements.callToAction, "Get started (it's free)");
cy.get(landingPageElements.callToAction).should('have.length', 4);
});
it('Has visible header and sub-header', () => {
// it has header and sub-header'
cy.contains(landingPageElements.heading, 'Learn to code — for free.');
cy.contains('Build projects.').should('be.visible');
cy.contains('Earn certifications.').should('be.visible');
cy.contains(
'Since 2014, more than 40,000 freeCodeCamp.org ' +
'graduates have gotten jobs at tech companies including:'
).should('be.visible');
});
it('Has 5 brand logos', () => {
// it has 5 brand logos
cy.get('.logo-row').children().its('length').should('eq', 5);
});
it('Has `as seens as` section', () => {
cy.contains('Build projects.').should('be.visible');
cy.get('.big-heading').siblings().get('svg');
// it has logos of news publications
cy.get('.big-heading').contains('As seen in').siblings().get('svg');
// it has only current certifications
cy.get(landingPageElements.curriculumBtns).its('length').should('eq', 15);
cy.wrap(superBlocks).each((cert: LandingPageLogs) => {
cy.get(landingPageElements.curriculumBtns).contains(cert);
});
// it has testimonials
cy.get(landingPageElements.testimonials)
.children()
.its('length')
.should('eq', 3);
// it has FAQ section
cy.get(landingPageElements.faq).its('length').should('eq', 9);
});
it('Has a visible large image on large viewports', function () {
cy.visit('/');
cy.viewport(1200, 660)
.get(landingPageElements.landingPageImage)
.should('be.visible');
@@ -70,22 +81,4 @@ describe('Landing page', () => {
.get(landingPageElements.landingPageImage)
.should('not.exist');
});
it('Has links to all superblocks', function () {
cy.get(landingPageElements.curriculumBtns).its('length').should('eq', 15);
cy.wrap(superBlocks).each((cert: LandingPageLogs) => {
cy.get(landingPageElements.curriculumBtns).contains(cert);
});
});
it('Has 3 testimonial cards', function () {
cy.get(landingPageElements.testimonials)
.children()
.its('length')
.should('eq', 3);
});
it('Has FAQ section', function () {
cy.get(landingPageElements.faq).its('length').should('eq', 9);
});
});
@@ -4,33 +4,25 @@ const location =
'/learn/responsive-web-design/basic-html-and-html5/say-hello-to-html-elements';
describe('Challenge with editor', function () {
before(() => {
it('the shortcut "Ctrl + S" saves the code', () => {
cy.visit(location);
});
it('renders seed code without localStorage', () => {
// reloading without saving
const editorContents = `<h1>Hello</h1>`;
cy.get(selectors.class.reactMonacoEditor)
cy.get(selectors.class.reactMonacoEditor, { timeout: 10000 })
.as('editor')
.contains(editorContents);
cy.get('@editor').click().focused().type(`{movetoend}<h1>Hello World</h1>`);
cy.reload();
cy.get('@editor', { timeout: 10000 }).contains(editorContents);
});
cy.get('@editor').contains(editorContents);
it('renders code from localStorage after "Ctrl + S"', () => {
const editorContents = `<h1>Hello</h1>`;
cy.get(selectors.class.reactMonacoEditor)
.as('editor')
.contains(editorContents);
// reloading after saving
cy.get('@editor')
.click()
.focused()
.type(`{movetoend}<h1>Hello World</h1>{ctrl+s}`);
cy.contains("Saved! Your code was saved to your browser's local storage.");
cy.reload();
cy.get('@editor', { timeout: 10000 }).contains(
'<h1>Hello</h1><h1>Hello World</h1>'
);
cy.get('@editor').contains('<h1>Hello</h1><h1>Hello World</h1>');
});
});
@@ -20,7 +20,7 @@ describe('CodeAlly cert challenge', function () {
describe('after completing the project', function () {
before(() => {
cy.task('seed', ['certified-user']);
cy.login();
cy.login('certified-user');
cy.visit(
'/learn/relational-database/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database'
);
@@ -25,26 +25,20 @@ describe('failed update flushing', function () {
cy.login();
});
beforeEach(() => {
cy.preserveSession();
});
it('should resubmit failed updates, check they are stored, then flush', () => {
store.set(failedUpdatesKey, failedUpdates);
cy.request('http://localhost:3000/user/get-session-user')
.its('body.user.developmentuser.completedChallenges')
.then((completedChallenges: ChallengeData[]) => {
const completedIds: string[] = getCompletedIds(completedChallenges);
failedUpdates.forEach(failedUpdate => {
expect(completedIds).not.to.include(failedUpdate.payload.id);
});
});
.then(
(completedChallenges: ChallengeData[]) =>
expect(completedChallenges).to.be.empty
);
cy.intercept('http://localhost:3000/modern-challenge-completed').as(
'completed'
);
cy.wrap(store.get(failedUpdatesKey)).should('deep.equal', failedUpdates);
cy.reload();
cy.visit('/');
cy.wait('@completed');
// if we don't wait for both requests to complete, we have a race condition
cy.wait('@completed');
@@ -11,11 +11,10 @@ const editorElements = {
describe('multifileCertProjects', function () {
before(() => {
cy.task('seed');
cy.login();
});
beforeEach(() => {
cy.preserveSession();
cy.login();
cy.visit(
'learn/2022/responsive-web-design/build-a-tribute-page-project/build-a-tribute-page'
);
@@ -11,16 +11,15 @@ const selectors = {
};
describe('Challenge with multifile editor', () => {
before(() => {
beforeEach(() => {
cy.visit(location);
});
it('renders the file tab buttons', () => {
it('renders correctly', () => {
// it renders the file tab buttons
cy.get(selectors.monacoTabs).contains('index.html');
cy.get(selectors.monacoTabs).contains('styles.css');
});
it('checks for correct text at different widths', () => {
// it checks for correct text at different widths
cy.viewport(768, 660);
cy.get(selectors.checkLowerJawButton).contains(
'Check Your Code (Ctrl + Enter)'
@@ -43,10 +42,7 @@ describe('Challenge with multifile editor', () => {
cy.get('[data-cy=failing-test-feedback]').should('not.exist');
});
// Page will change after this test. If your test requires page used in previous
// tests make sure it is above this one
it('prompts unauthenticated user to sign in to save progress', () => {
cy.visit(location);
cy.focused()
.click()
.type('{end}{enter}<meta charset="UTF-8" />')
@@ -58,23 +54,17 @@ describe('Challenge with multifile editor', () => {
cy.get(selectors.signInButton).should('not.exist');
});
it(
'focuses on the submit button after tests passed',
{ browser: '!firefox' },
() => {
cy.visit(location);
cy.focused().click().type('{end}{enter}<meta charset="UTF-8" />');
cy.get(selectors.checkLowerJawButton).should('not.be.focused');
cy.get(selectors.checkLowerJawButton).click();
cy.get(selectors.submitLowerJawButton).should('be.focused');
}
);
it('focuses on the submit button after tests passed', () => {
cy.focused().click().type('{end}{enter}<meta charset="UTF-8" />');
cy.get(selectors.checkLowerJawButton).should('not.be.focused');
cy.get(selectors.checkLowerJawButton).click();
cy.get(selectors.submitLowerJawButton).should('be.focused');
});
it(
'brings back the check button after reset',
{ browser: '!firefox' },
{ browser: '!chrome' }, // TODO: seems to be a bug in Chrome, try again when a new version is released
() => {
cy.visit(location);
cy.focused().click().type('{end}{enter}<meta charset="UTF-8" />');
cy.get(selectors.checkLowerJawButton).should('not.be.focused');
cy.get(selectors.checkLowerJawButton).click();
@@ -92,16 +82,11 @@ describe('Challenge with multifile editor', () => {
}
);
it(
'checks hotkeys when instruction is focused',
{ browser: '!firefox' },
() => {
cy.reload();
cy.focused().type('{end}{enter}<meta charset="UTF-8" />');
cy.get(selectors.instructionContainer)
.click('topRight')
.trigger('keydown', { ctrlKey: true, keyCode: 13 }); // keyCode : 13 enter key
cy.get(selectors.submitLowerJawButton).should('not.be.focused');
}
);
it('checks hotkeys when instruction is focused', () => {
cy.focused().type('{end}{enter}<meta charset="UTF-8" />');
cy.get(selectors.instructionContainer)
.click('topRight')
.trigger('keydown', { ctrlKey: true, keyCode: 13 }); // keyCode : 13 enter key
cy.get(selectors.submitLowerJawButton).should('not.be.focused');
});
});
@@ -45,11 +45,10 @@ display: none;
describe('submitting a challenge', () => {
before(() => {
cy.task('seed');
cy.login();
});
beforeEach(() => {
cy.preserveSession();
cy.login();
});
it('in the middle of a block should take you to the next challenge', () => {
+10 -20
View File
@@ -27,7 +27,7 @@ const runningOutput = '// running tests';
const finishedOutput = '// tests completed';
describe('Classic challenge', function () {
before(() => {
beforeEach(() => {
cy.visit(outputLocations.index);
});
@@ -42,13 +42,11 @@ describe('Classic challenge', function () {
it('shows test output when the tests are run', () => {
// first wait for the editor to load
cy.get(outputSelectors.editor, { timeout: 15000 });
cy.get(outputSelectors.runTestsButton)
.click()
.then(() => {
cy.get(selectors.dataCy.outputText)
.contains(runningOutput)
.contains(finishedOutput);
});
cy.get(outputSelectors.runTestsButton).click();
cy.get(selectors.dataCy.outputText)
.contains(runningOutput)
.contains(finishedOutput);
});
it('shows test output when the tests are triggered by the keyboard', () => {
@@ -63,19 +61,14 @@ describe('Classic challenge', function () {
});
describe('jQuery challenge', function () {
before(() => {
cy.visit(outputLocations.jQuery);
});
it('renders the default output text', () => {
cy.visit(outputLocations.jQuery);
cy.title().should(
'eq',
'jQuery: Target HTML Elements with Selectors Using jQuery | freeCodeCamp.org'
);
cy.get(selectors.dataCy.outputText).contains(defaultOutput);
});
it('should not show a reference error', () => {
cy.wait(5000);
cy.get(selectors.dataCy.outputText).should(
'not.contain',
@@ -85,12 +78,10 @@ describe('jQuery challenge', function () {
});
describe('Custom output for JavaScript objects', function () {
beforeEach(() => {
it('Set and map objects', () => {
cy.visit(outputLocations.js);
focusEditor().type('{ctrl}a').clear();
});
it('Set object', () => {
focusEditor().type('{ctrl}a').clear();
focusEditor().type(
'const set = new Set();{enter}set.add(1);{enter}set.add("set");{enter}set.add(10);{enter}console.log(set);'
);
@@ -98,9 +89,8 @@ describe('Custom output for JavaScript objects', function () {
'contain',
'Set(3) {1, set, 10}'
);
});
it('Map object', () => {
focusEditor().type('{ctrl}a').clear();
focusEditor().type(
'const map = new Map();{enter}map.set("first", 1);{enter}map.set("second", 2);{enter}map.set("other", "map");{enter}console.log(map);'
);
@@ -1,19 +1,14 @@
describe('Help Button', () => {
it('should be visible', () => {
it('should show three menus on challenges without videos', () => {
cy.visit(
'/learn/responsive-web-design/basic-html-and-html5/say-hello-to-html-elements'
);
cy.get('#get-help-dropdown').scrollIntoView().should('be.visible');
});
it('should toggle the dropdown menu', () => {
cy.get('#get-help-dropdown').scrollIntoView().click();
cy.get('.tool-panel-group [role="menu"]')
.scrollIntoView()
.should('be.visible');
});
// it should toggle the dropdown menu
cy.get('#get-help-dropdown').click();
cy.get('.tool-panel-group [role="menu"]').should('be.visible');
it('should render three links when video is available', () => {
// it should render three links when video is available
cy.get('.tool-panel-group [role="menu"]')
.children()
.should('have.length', 3);
@@ -28,7 +23,8 @@ describe('Help Button', () => {
cy.visit(
'/learn/front-end-development-libraries/bootstrap/apply-the-default-bootstrap-button-style'
);
cy.get('#get-help-dropdown').scrollIntoView().click();
cy.get('#get-help-dropdown').click();
cy.get('.tool-panel-group [role="menu"]')
.children()
.should('have.length', 2);
@@ -9,35 +9,20 @@ const navBarselectors = {
};
describe('Navbar when logged out', () => {
beforeEach(() => {
it('should have the sign in button on landing and /learn', () => {
cy.visit('/');
cy.viewport(1200, 660);
cy.contains('Learn to code — for free.').should('exist');
});
it('Should have a "Sign in" button', () => {
cy.contains("[data-test-label='landing-small-cta']", 'Sign in');
});
cy.contains(navBarselectors.smallCallToAction, 'Sign in');
it(
'Should have `Sign in` link on landing and learn pages' +
' when not signed in',
() => {
cy.contains(navBarselectors.smallCallToAction, 'Sign in');
cy.get(navBarselectors.menuButton).click();
cy.get(navBarselectors.navigationLinks).contains('Curriculum').click();
cy.contains(navBarselectors.smallCallToAction, 'Sign in');
}
);
cy.visit('/learn');
cy.contains(navBarselectors.smallCallToAction, 'Sign in');
});
});
describe('Navbar Logged in', () => {
beforeEach(() => {
cy.login();
cy.visit('/');
cy.viewport(1200, 660);
cy.contains('Learn to code — for free.')
.should('exist')
.then(() => cy.login());
});
it('Should render properly', () => {
@@ -13,19 +13,13 @@ const clear = () => {
};
describe('Search bar optimized', () => {
before(() => {
beforeEach(() => {
cy.visit('/');
});
beforeEach(() => {
clear();
});
it('Should render properly', () => {
it('Should render without hits', () => {
cy.get('[data-cy=ais-SearchBox]').should('be.visible');
});
it('Should not display hits', () => {
search('freeCodeCamp');
cy.get('[data-cy=ais-Hits-list]').should('not.exist');
});
@@ -45,19 +39,12 @@ describe('Search bar optimized', () => {
});
describe('Search bar', () => {
before(() => {
beforeEach(() => {
cy.visit('/learn');
});
beforeEach(() => {
clear();
});
it('Should render properly', () => {
it('Should render with hits', () => {
cy.get('.ais-SearchBox').should('be.visible');
});
it('Should accept input and display hits', () => {
search('freeCodeCamp');
cy.get('[data-cy=ais-Hits-list]')
@@ -107,7 +94,7 @@ describe('Search bar', () => {
cy.get('.ais-SearchBox-form').submit();
cy.location().should(loc => {
expect(loc.pathname).to.eq('/learn/');
expect(loc.pathname).to.match(/^\/learn/);
});
});
});
@@ -1,6 +1,5 @@
describe('Donate page', () => {
before(() => {
cy.clearCookies();
cy.task('seed');
cy.login();
});
@@ -17,7 +16,7 @@ describe('Donate page', () => {
'25--5-clock'
];
it('Should be able to submit projects', () => {
it('Should be possible to submit projects', () => {
const submitProject = (str: string) => {
cy.visit(
`/learn/front-end-development-libraries/front-end-development-libraries-projects/build-a-${str}`
@@ -33,9 +32,8 @@ describe('Donate page', () => {
};
projects.forEach(project => submitProject(project));
});
it('Should have a pop up modal', () => {
// pop up modal
cy.contains(
'Nicely done. You just completed Front End Development Libraries Projects.'
);
@@ -36,6 +36,8 @@ describe('Default Navigation Menu', () => {
});
it('should close the menu and focus on the Menu button when the Esc key is pressed while the navigation menu is expanded and an item in the menu is focused', () => {
cy.visit('/learn');
cy.get(navigationItems['toggle-button']).should('be.visible').click();
cy.get(navigationItems['navigation-list']).contains('Curriculum').focus();
cy.focused().type('{esc}');
cy.get(navigationItems['navigation-list']).should('not.be.visible');
@@ -45,9 +47,9 @@ describe('Default Navigation Menu', () => {
describe('Authenticated Navigation Menu', () => {
before(() => {
cy.clearCookies();
cy.task('seed');
cy.login();
cy.visit('/');
cy.get(navigationItems['toggle-button']).should('be.visible').click();
});
it('should show default avatar.', () => {
@@ -67,11 +69,11 @@ describe('Authenticated Navigation Menu', () => {
describe('Authenticated User Sign Out', () => {
before(() => {
cy.clearCookies();
cy.task('seed');
});
beforeEach(() => {
cy.login();
cy.visit('/');
cy.get(navigationItems['toggle-button']).should('be.visible').click();
});
it('should sign out user', () => {
@@ -93,18 +95,15 @@ describe('Authenticated User Sign Out', () => {
describe('Donor Navigation Menu', () => {
before(() => {
cy.clearCookies();
cy.task('seed', ['--donor']);
});
it('should show donor avatar border and thank you message.', () => {
cy.login();
cy.visit('/donate');
});
it('should show donor avatar border.', () => {
cy.get(navigationItems['avatar-container']).should(
'have.class',
'gold-border'
);
});
it('should show thank you message.', () => {
cy.get(navigationItems['navigation-list']).contains('Thanks for donating');
});
});
+49 -51
View File
@@ -24,62 +24,60 @@ const superBlockNames = [
'Project Euler'
];
describe('Learn Landing page (not logged in)', () => {
it('Should render', () => {
cy.visit(learnUrl.index);
cy.title().should(
'eq',
'Learn to Code — For Free — Coding Courses for Busy People'
);
// TODO: None of the tests in this spec test behaviour and would be better as a
// unit tests.
describe('Learn Landing page', () => {
before(() => {
cy.task('seed');
});
describe('for signed out user', () => {
it('should render', () => {
cy.visit(learnUrl.index);
it('Has the correct heading for an unauthenticated User', () => {
cy.visit(learnUrl.index);
cy.contains('h1', "Welcome to freeCodeCamp's curriculum.");
});
it('Should render a curriculum map', () => {
cy.document().then(document => {
const superBlocks = document.querySelectorAll<HTMLAnchorElement>(
`${challengerSelector.curriculumMap} > ul > li > a`
cy.title().should(
'eq',
'Learn to Code — For Free — Coding Courses for Busy People'
);
expect(superBlocks).to.have.length(15);
superBlocks.forEach((superBlock, idx) => {
expect(superBlock.innerText).to.have.string(superBlockNames[idx]);
cy.contains('h1', "Welcome to freeCodeCamp's curriculum.");
cy.document().then(document => {
const superBlocks = document.querySelectorAll<HTMLAnchorElement>(
`${challengerSelector.curriculumMap} > ul > li > a`
);
expect(superBlocks).to.have.length(15);
superBlocks.forEach((superBlock, idx) => {
expect(superBlock.innerText).to.have.string(superBlockNames[idx]);
});
});
// quotes are only shown to logged in users
cy.get('blockquote').should('not.exist');
});
});
describe('for signed in user', () => {
it('should render', () => {
cy.login();
cy.visit(learnUrl.index);
cy.title().should(
'eq',
'Learn to Code — For Free — Coding Courses for Busy People'
);
cy.contains('h1', 'Welcome back, Development User.');
// quote
cy.get('blockquote').within(() => {
cy.get('q').should('be.visible');
});
// quote author
cy.get('blockquote').within(() => {
cy.get('cite').should('be.visible');
});
});
});
});
describe('Quotes', () => {
beforeEach(() => {
cy.login();
});
it('Should show a quote', () => {
cy.get('blockquote').within(() => {
cy.get('q').should('be.visible');
});
});
it('Should show quote author', () => {
cy.get('blockquote').within(() => {
cy.get('cite').should('be.visible');
});
});
});
describe('Superblocks and Blocks', () => {
beforeEach(() => {
cy.login();
});
it('Has all superblocks visible', () => {
cy.wrap(superBlockNames.slice(1)).each((name: string) => {
cy.contains(name).should('be.visible');
});
});
});
@@ -60,18 +60,13 @@ const warningMessage =
'experience.';
describe('Basic Css Introduction page', function () {
it('renders', () => {
it('renders a warning about browser extensions links to the lessons ', () => {
cy.visit(locations.index);
cy.title().should('eq', 'Basic CSS | freeCodeCamp.org');
});
it('renders a warning user about extensions', () => {
cy.visit(locations.index);
cy.get(selectors.warningMessage).contains(warningMessage);
});
it('renders a lesson index', () => {
lessonNames.forEach(name => {
cy.get(selectors.tableOfContents).contains('a', name);
});
@@ -8,10 +8,6 @@ describe('Certification intro page', () => {
cy.login();
});
beforeEach(() => {
cy.preserveSession();
});
it('Should render and toggle correctly', () => {
cy.visit('/learn/2022/responsive-web-design');
cy.title().should(
+30 -111
View File
@@ -6,14 +6,14 @@ const elements = {
fccLogo: "[data-cy='freeCodeCamp-logo']",
msLogo: "[data-cy='microsoft-logo']",
issueDate: "[data-cy='issue-date']",
quincySign: "[data-cy='quincy-signature']",
msSign: "[data-cy='microsoft-signature']",
quincySignature: "[data-cy='quincy-signature']",
msSignature: "[data-cy='microsoft-signature']",
solutionWidget: "[data-cy='solution-widget']"
};
const verifyRwdUrl =
const responsiveWebDesignUrl =
'https://freecodecamp.org/certification/certifieduser/responsive-web-design';
const verifyCSharpUrl =
const cSharpUrl =
'https://freecodecamp.org/certification/certifieduser/foundational-c-sharp-with-microsoft';
describe('A certification,', function () {
@@ -22,54 +22,23 @@ describe('A certification,', function () {
});
describe('while viewing your Responsive Web Design Certification,', function () {
before(() => {
cy.login();
it('should render the expected components', () => {
cy.login('certified-user');
cy.visit(rwdCert);
});
it('should render a donate section', () => {
cy.get('.donation-section').should('exist');
});
it('should have a freeCodeCamp logo', () => {
cy.get(elements.fccLogo).should('exist');
});
it('should not have a Microsoft logo', () => {
cy.get('.donation-section').should('be.visible');
cy.get(elements.fccLogo).should('be.visible');
cy.get(elements.msLogo).should('not.exist');
});
it('should be issued with the submission date', () => {
// This is intended to work in UTC. If running locally, this may fail due
// to timezone differences.
const issued = `Developer Certification on August 3, 2018`;
cy.get(elements.issueDate).should('include.text', issued);
});
it('should be issued with the number of hours undertaken', () => {
const hours = '300 hours';
cy.get('.information-container').should('include.text', hours);
});
it('should have a QR code', () => {
cy.get('.qr-code').should('exist');
});
it("should have Quincy's signature", () => {
cy.get(elements.quincySign).should('exist');
});
it('should not have a Microsoft signature', () => {
cy.get(elements.msSign).should('not.exist');
});
it('should have the freeCodeCamp ribbon', () => {
cy.get('.ribbon').should('exist');
});
it('should have a link to the certification', () => {
cy.get('.verify').should('include.text', verifyRwdUrl);
});
it('should render a LinkedIn button', function () {
cy.get('.information-container').should('include.text', '300 hours');
cy.get('.qr-code').should('be.visible');
cy.get(elements.quincySignature).should('be.visible');
cy.get(elements.msSignature).should('not.exist');
cy.get('.ribbon').should('be.visible');
cy.get('.verify').should('include.text', responsiveWebDesignUrl);
cy.contains('Add this certification to my LinkedIn profile')
.should('have.attr', 'href')
.and(
@@ -77,69 +46,37 @@ describe('A certification,', function () {
// eslint-disable-next-line max-len
/https:\/\/www\.linkedin\.com\/profile\/add\?startTask=CERTIFICATION_NAME&name=Responsive%20Web%20Design&organizationId=4831032&issueYear=\d\d\d\d&issueMonth=\d\d?&certUrl=https:\/\/freecodecamp\.org\/certification\/certifieduser\/responsive-web-design/
);
});
it('should render a Twitter button', function () {
cy.contains('Share this certification on Twitter').should(
'have.attr',
'href',
'https://twitter.com/intent/tweet?text=I just earned the Responsive%20Web%20Design certification @freeCodeCamp! Check it out here: https://freecodecamp.org/certification/certifieduser/responsive-web-design'
);
});
it('should render the solution widget', () => {
cy.get(elements.solutionWidget).should('exist');
cy.get(elements.solutionWidget).should('be.visible');
});
});
describe('while viewing your Foundational C# with Microsoft Certification,', function () {
before(() => {
it('should render the expected components', () => {
cy.login();
cy.visit(cSharpCert);
});
it('should render a donate section', () => {
cy.get('.donation-section').should('exist');
});
it('should have a freeCodeCamp logo', () => {
cy.get('.donation-section').should('be.visible');
cy.get(elements.fccLogo).should('exist');
});
it('should have a Microsoft logo', () => {
cy.get(elements.msLogo).should('exist');
});
it('should be issued with the submission date', () => {
// This is intended to work in UTC. If running locally, this may fail due
// to timezone differences.
const issued = `Developer Certification on September 18, 2023`;
cy.get(elements.issueDate).should('include.text', issued);
});
it('should not show the number of hours undertaken', () => {
// MS certification do not include hours to complete
cy.get('.information-container').should('not.include.text', 'hours');
});
it('should not have a QR code', () => {
cy.get('.qr-code').should('not.exist');
});
it("should have Quincy's signature", () => {
cy.get(elements.quincySign).should('exist');
});
it('should have a Microsoft signature', () => {
cy.get(elements.msSign).should('exist');
});
it('should not have the freeCodeCamp ribbon', () => {
cy.get(elements.quincySignature).should('be.visible');
cy.get(elements.msSignature).should('exist');
cy.get('.ribbon').should('not.exist');
});
cy.get('.verify').should('include.text', cSharpUrl);
it('should have a link to the certification', () => {
cy.get('.verify').should('include.text', verifyCSharpUrl);
});
it('should render a LinkedIn button', function () {
cy.contains('Add this certification to my LinkedIn profile')
.should('have.attr', 'href')
.and(
@@ -147,47 +84,29 @@ describe('A certification,', function () {
// eslint-disable-next-line max-len
/https:\/\/www\.linkedin\.com\/profile\/add\?startTask=CERTIFICATION_NAME&name=Foundational%20C%23%20with%20Microsoft&organizationId=4831032&issueYear=\d\d\d\d&issueMonth=\d\d?&certUrl=https:\/\/freecodecamp\.org\/certification\/certifieduser\/foundational-c-sharp-with-microsoft/
);
});
it('should render a Twitter button', function () {
cy.contains('Share this certification on Twitter').should(
'have.attr',
'href',
'https://twitter.com/intent/tweet?text=I just earned the Foundational%20C%23%20with%20Microsoft certification @freeCodeCamp! Check it out here: https://freecodecamp.org/certification/certifieduser/foundational-c-sharp-with-microsoft'
);
});
it('should render the solution widget', () => {
cy.get(elements.solutionWidget).should('exist');
cy.get(elements.solutionWidget).should('be.visible');
});
});
describe("while viewing someone else's Responsive Web Design Certification,", function () {
before(() => {
it('should only render public components', () => {
cy.visit(rwdCert);
});
it('should not render a donate section', () => {
cy.get('.donation-section').should('not.exist');
});
it('should display certificate', function () {
cy.contains('successfully completed').should('exist');
cy.contains('Responsive Web Design').should('exist');
});
it('should not render a LinkedIn button', function () {
cy.contains('successfully completed');
cy.contains('Responsive Web Design');
cy.contains('Add this certification to my LinkedIn profile').should(
'not.exist'
);
});
it('should not render a Twitter button', function () {
cy.contains('Share this certification on Twitter').should('not.exist');
});
it('should render the solution widget', () => {
cy.get(elements.solutionWidget).should('exist');
cy.get(elements.solutionWidget).should('be.visible');
});
});
});
+8 -14
View File
@@ -12,6 +12,8 @@ const social = {
const scripts = {
mathjax: {
// TODO: figure out why this is in the head in dev and in the body in prod.
// presumably an issue with gatsby-ssr.js vs gatsby-browser.js
selector: 'body script[id="mathjax"]',
src: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js?config=TeX-AMS_HTML'
}
@@ -19,46 +21,38 @@ const scripts = {
describe('The Document Metadata', () => {
describe('landing page', () => {
before(() => {
it('has correct <meta> tags', () => {
cy.visit('/');
});
it('has correct <meta> for description', () => {
cy.get('head meta[name="description"]').should(
'have.attr',
'content',
'Learn to Code — For Free'
);
});
it('has correct <meta> for og title', () => {
cy.get('head meta[name="og:title"]').should(
'have.attr',
'content',
'freeCodeCamp.org'
);
});
it('has correct <meta> for og description', () => {
cy.get('head meta[name="og:description"]').should(
'have.attr',
'content',
social.description
);
});
it('has correct <meta> for twitter title', () => {
cy.get('head meta[name="twitter:title"]').should(
'have.attr',
'content',
'freeCodeCamp.org'
);
});
it('has correct <meta>for twitter description', () => {
cy.get('head meta[name="twitter:description"]').should(
'have.attr',
'content',
social.description
);
});
it('should not have mathjax body script', () => {
cy.get(scripts.mathjax.selector).should('not.exist');
});
});
+6 -13
View File
@@ -1,40 +1,33 @@
describe('Top contributor in user profile', () => {
before(() => {
cy.clearCookies();
cy.task('seed', ['--top-contributor']);
cy.login('top-contributor');
});
after(() => {
cy.task('seed');
});
beforeEach(() => {
cy.login();
cy.contains('Profile').click({ force: true });
it('Should show `Top Contributor` information', () => {
// It it does 404, but still shows the profile.
cy.visit('/developmentuser', { failOnStatusCode: false });
// The following line is only required if you want to test it in development
// cy.contains('Preview custom 404 page').click();
});
it('Should show `Top Contributor` text with badge', () => {
cy.contains('Top Contributor')
.parent()
.within(() => {
cy.contains('Top Contributor').should('be.visible');
cy.get('svg').should('be.visible');
});
});
// eslint-disable-next-line max-len
it('Should take user to `Top Contributor` page when `Top Contributor` gets clicked', () => {
// it should have a link to the news article
cy.contains('Top Contributor').should(
'have.attr',
'href',
'https://www.freecodecamp.org/news/freecodecamp-top-contributors/'
);
});
it('Should show years when it was achieved', () => {
// the years obtained should be visible
cy.contains('2017, 2018 and 2019').should('be.visible');
});
});
+1 -1
View File
@@ -5,7 +5,7 @@ describe('Public profile certifications', () => {
});
beforeEach(() => {
cy.login();
cy.login('certified-user');
});
it('Should show claimed certifications if the username has all lowercase characters', () => {
@@ -6,7 +6,6 @@ describe('Privacy terms', () => {
cy.intercept('PUT', '/update-privacy-terms', () => {
privacyTermsUpdated = true;
}).as('updatePrivacyTerms');
// Seed dev user with `acceptedPrivacyTerms` unset
cy.task('seed', ['--unset-privacy-terms']);
// Go to the homepage and log in manually so we can assert the following:
@@ -35,7 +34,6 @@ describe('Privacy terms', () => {
cy.intercept('PUT', '/update-privacy-terms', () => {
privacyTermsUpdated = true;
}).as('updatePrivacyTerms');
// Seed dev user with `acceptedPrivacyTerms` unset
cy.task('seed', ['--unset-privacy-terms']);
// Go to the homepage and log in manually so we can assert the following:
+1 -1
View File
@@ -1,7 +1,7 @@
describe('Donate page', () => {
it('Donation ', () => {
cy.task('seed', ['certified-user']);
cy.login();
cy.login('certified-user');
cy.visit('/donate');
cy.get('.donation-elements', { timeout: 10000 }).within(() => {
cy.fillElementsInput('cardNumber', '4242424242424242');
+6 -16
View File
@@ -1,16 +1,9 @@
const login = () => {
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
cy.visit(`${Cypress.env('API_LOCATION')}/signin`);
cy.contains('Welcome back');
};
const preserveSession = () => {
Cypress.Cookies.preserveOnce(
'jwt_access_token',
'csrf_token',
'_csrf',
'connect.sid'
);
const login = (user?: string) => {
cy.session(user ?? 'new-user', () => {
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
cy.visit(`${Cypress.env('API_LOCATION')}/signin`);
cy.contains('Welcome back');
});
};
const setPrivacyTogglesToPublic = () => {
@@ -53,8 +46,6 @@ const resetUsername = () => {
Cypress.Commands.add('login', login);
Cypress.Commands.add('preserveSession', preserveSession);
Cypress.Commands.add('setPrivacyTogglesToPublic', setPrivacyTogglesToPublic);
Cypress.Commands.add('goToSettings', goToSettings);
@@ -67,7 +58,6 @@ Cypress.Commands.add('resetUsername', resetUsername);
declare namespace Cypress {
interface Chainable {
login: typeof login;
preserveSession: typeof preserveSession;
setPrivacyTogglesToPublic: typeof setPrivacyTogglesToPublic;
goToSettings: typeof goToSettings;
typeUsername(username: string): Chainable<JQuery<HTMLElement>>;
+2 -2
View File
@@ -102,7 +102,7 @@
"@babel/preset-env": "7.22.20",
"@babel/preset-react": "7.22.15",
"@babel/preset-typescript": "7.22.15",
"@testing-library/cypress": "8.0.7",
"@testing-library/cypress": "9.0.0",
"@testing-library/dom": "8.20.1",
"@testing-library/jest-dom": "5.17.0",
"@testing-library/user-event": "13.5.0",
@@ -115,7 +115,7 @@
"babel-jest": "29.7.0",
"babel-plugin-transform-imports": "2.0.0",
"cross-env": "7.0.3",
"cypress": "11.2.0",
"cypress": "12.17.4",
"cypress-plugin-stripe-elements": "1.0.2",
"cypress-plugin-tab": "1.0.5",
"docsify-cli": "4.4.4",
+106 -102
View File
@@ -28,8 +28,8 @@ importers:
specifier: 7.22.15
version: 7.22.15(@babel/core@7.22.20)
'@testing-library/cypress':
specifier: 8.0.7
version: 8.0.7(cypress@11.2.0)
specifier: 9.0.0
version: 9.0.0(cypress@12.17.4)
'@testing-library/dom':
specifier: 8.20.1
version: 8.20.1
@@ -67,8 +67,8 @@ importers:
specifier: 7.0.3
version: 7.0.3
cypress:
specifier: 11.2.0
version: 11.2.0
specifier: 12.17.4
version: 12.17.4
cypress-plugin-stripe-elements:
specifier: 1.0.2
version: 1.0.2
@@ -2997,7 +2997,7 @@ packages:
'@babel/traverse': 7.22.20
'@babel/types': 7.22.19
convert-source-map: 1.9.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
@@ -3291,7 +3291,7 @@ packages:
'@babel/core': 7.22.20
'@babel/helper-compilation-targets': 7.22.15
'@babel/helper-plugin-utils': 7.22.5
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
lodash.debounce: 4.0.8
resolve: 1.22.4
transitivePeerDependencies:
@@ -6677,7 +6677,7 @@ packages:
'@babel/helper-split-export-declaration': 7.22.6
'@babel/parser': 7.22.16
'@babel/types': 7.22.19
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@@ -7020,7 +7020,7 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
ajv: 6.12.6
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
espree: 9.6.1
globals: 13.21.0
ignore: 5.2.4
@@ -7510,7 +7510,7 @@ packages:
engines: {node: '>=10.10.0'}
dependencies:
'@humanwhocodes/object-schema': 1.2.1
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
@@ -7591,7 +7591,7 @@ packages:
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
'@jest/types': 29.6.3
'@types/node': 20.5.9
'@types/node': 18.17.17
chalk: 4.1.2
jest-message-util: 29.7.0
jest-util: 29.7.0
@@ -7657,14 +7657,14 @@ packages:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
'@types/node': 20.5.9
'@types/node': 18.17.17
ansi-escapes: 4.3.2
chalk: 4.1.2
ci-info: 3.8.0
exit: 0.1.2
graceful-fs: 4.2.11
jest-changed-files: 29.7.0
jest-config: 29.7.0(@types/node@20.5.9)(ts-node@10.9.1)
jest-config: 29.7.0(@types/node@18.17.17)(ts-node@10.9.1)
jest-haste-map: 29.7.0
jest-message-util: 29.7.0
jest-regex-util: 29.6.3
@@ -7702,7 +7702,7 @@ packages:
dependencies:
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
'@types/node': 20.5.9
'@types/node': 18.17.17
jest-mock: 29.7.0
dev: true
@@ -7747,7 +7747,7 @@ packages:
dependencies:
'@jest/types': 29.6.3
'@sinonjs/fake-timers': 10.3.0
'@types/node': 20.5.9
'@types/node': 18.17.17
jest-message-util: 29.7.0
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -7827,7 +7827,7 @@ packages:
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
'@jridgewell/trace-mapping': 0.3.19
'@types/node': 20.5.9
'@types/node': 18.17.17
chalk: 4.1.2
collect-v8-coverage: 1.0.2
exit: 0.1.2
@@ -8016,7 +8016,7 @@ packages:
dependencies:
'@types/istanbul-lib-coverage': 2.0.4
'@types/istanbul-reports': 3.0.1
'@types/node': 20.5.9
'@types/node': 18.17.17
'@types/yargs': 15.0.15
chalk: 4.1.2
dev: true
@@ -8050,7 +8050,7 @@ packages:
'@jest/schemas': 29.6.3
'@types/istanbul-lib-coverage': 2.0.4
'@types/istanbul-reports': 3.0.1
'@types/node': 20.5.9
'@types/node': 18.17.17
'@types/yargs': 17.0.24
chalk: 4.1.2
@@ -10820,15 +10820,15 @@ packages:
dependencies:
defer-to-connect: 2.0.1
/@testing-library/cypress@8.0.7(cypress@11.2.0):
resolution: {integrity: sha512-3HTV725rOS+YHve/gD9coZp/UcPK5xhr4H0GMnq/ni6USdtzVtSOG9WBFtd8rYnrXk8rrGD+0toRFYouJNIG0Q==}
/@testing-library/cypress@9.0.0(cypress@12.17.4):
resolution: {integrity: sha512-c1XiCGeHGGTWn0LAU12sFUfoX3qfId5gcSE2yHode+vsyHDWraxDPALjVnHd4/Fa3j4KBcc5k++Ccy6A9qnkMA==}
engines: {node: '>=12', npm: '>=6'}
peerDependencies:
cypress: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0
cypress: ^12.0.0
dependencies:
'@babel/runtime': 7.22.11
'@testing-library/dom': 8.20.1
cypress: 11.2.0
cypress: 12.17.4
dev: true
/@testing-library/dom@7.31.2:
@@ -11165,7 +11165,7 @@ packages:
/@types/graceful-fs@4.1.6:
resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==}
dependencies:
'@types/node': 20.5.9
'@types/node': 18.17.17
/@types/hast@2.3.5:
resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==}
@@ -11273,7 +11273,7 @@ packages:
/@types/keyv@3.1.4:
resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
dependencies:
'@types/node': 20.5.9
'@types/node': 18.17.17
/@types/loadable__component@5.13.5:
resolution: {integrity: sha512-YMpOC3hkzuLKi0ZBRn1LFglw4cDP70cGeQ9ZXBh5mYCLo+dJtw+DflNTx55VGl7BQ3MATiS+VNd8apEtaQcl5w==}
@@ -11506,7 +11506,7 @@ packages:
/@types/responselike@1.0.0:
resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
dependencies:
'@types/node': 20.5.9
'@types/node': 18.17.17
/@types/retry@0.12.0:
resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==}
@@ -11712,7 +11712,7 @@ packages:
resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==}
requiresBuild: true
dependencies:
'@types/node': 20.5.9
'@types/node': 18.17.17
dev: true
optional: true
@@ -11760,7 +11760,7 @@ packages:
'@typescript-eslint/scope-manager': 5.62.0
'@typescript-eslint/type-utils': 5.62.0(eslint@8.49.0)(typescript@4.9.5)
'@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@4.9.5)
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
eslint: 8.49.0
graphemer: 1.4.0
ignore: 5.2.4
@@ -11849,7 +11849,7 @@ packages:
'@typescript-eslint/scope-manager': 5.62.0
'@typescript-eslint/types': 5.62.0
'@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5)
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
eslint: 8.49.0
typescript: 4.9.5
transitivePeerDependencies:
@@ -11881,7 +11881,7 @@ packages:
dependencies:
'@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5)
'@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@4.9.5)
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
eslint: 8.49.0
tsutils: 3.21.0(typescript@4.9.5)
typescript: 4.9.5
@@ -11952,7 +11952,7 @@ packages:
dependencies:
'@typescript-eslint/types': 5.62.0
'@typescript-eslint/visitor-keys': 5.62.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
semver: 7.5.4
@@ -15512,11 +15512,6 @@ packages:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
/commander@5.1.0:
resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
engines: {node: '>= 6'}
dev: true
/commander@6.2.1:
resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
engines: {node: '>= 6'}
@@ -16405,15 +16400,15 @@ packages:
ally.js: 1.4.1
dev: true
/cypress@11.2.0:
resolution: {integrity: sha512-u61UGwtu7lpsNWLUma/FKNOsrjcI6wleNmda/TyKHe0dOBcVjbCPlp1N6uwFZ0doXev7f/91YDpU9bqDCFeBLA==}
engines: {node: '>=12.0.0'}
/cypress@12.17.4:
resolution: {integrity: sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==}
engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0}
hasBin: true
requiresBuild: true
dependencies:
'@cypress/request': 2.88.12
'@cypress/xvfb': 1.2.4(supports-color@8.1.1)
'@types/node': 14.18.56
'@types/node': 16.18.46
'@types/sinonjs__fake-timers': 8.1.1
'@types/sizzle': 2.3.3
arch: 2.2.0
@@ -16425,7 +16420,7 @@ packages:
check-more-types: 2.24.0
cli-cursor: 3.1.0
cli-table3: 0.6.3
commander: 5.1.0
commander: 6.2.1
common-tags: 1.8.2
dayjs: 1.11.9
debug: 4.3.4(supports-color@8.1.1)
@@ -16446,6 +16441,7 @@ packages:
minimist: 1.2.8
ospath: 1.2.2
pretty-bytes: 5.6.0
process: 0.11.10
proxy-from-env: 1.0.0
request-progress: 3.0.0
semver: 7.5.4
@@ -16546,6 +16542,16 @@ packages:
ms: 2.0.0
dev: false
/debug@3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
dependencies:
ms: 2.1.3
/debug@3.2.7(supports-color@5.5.0):
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies:
@@ -16580,6 +16586,17 @@ packages:
ms: 2.1.2
dev: true
/debug@4.3.4:
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
dependencies:
ms: 2.1.2
/debug@4.3.4(supports-color@8.1.1):
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
engines: {node: '>=6.0'}
@@ -17038,7 +17055,7 @@ packages:
/docsify-server-renderer@4.13.1:
resolution: {integrity: sha512-XNJeCK3zp+mVO7JZFn0bH4hNBAMMC1MbuCU7CBsjLHYn4NHrjIgCBGmylzEan3/4Qm6kbSzQx8XzUK5T7GQxHw==}
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
docsify: 4.13.1
node-fetch: 2.7.0
resolve-pathname: 3.0.0
@@ -17803,7 +17820,7 @@ packages:
/eslint-import-resolver-node@0.3.9:
resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
dependencies:
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7
is-core-module: 2.13.0
resolve: 1.22.4
transitivePeerDependencies:
@@ -17816,10 +17833,10 @@ packages:
eslint: '*'
eslint-plugin-import: '*'
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
enhanced-resolve: 5.15.0
eslint: 8.49.0
eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.49.0)
eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.49.0)
eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.49.0)
get-tsconfig: 4.7.0
globby: 13.2.2
@@ -17883,13 +17900,41 @@ packages:
optional: true
dependencies:
'@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@4.9.5)
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7
eslint: 8.49.0
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.1)(eslint@8.49.0)
transitivePeerDependencies:
- supports-color
/eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.49.0):
resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
eslint: '*'
eslint-import-resolver-node: '*'
eslint-import-resolver-typescript: '*'
eslint-import-resolver-webpack: '*'
peerDependenciesMeta:
'@typescript-eslint/parser':
optional: true
eslint:
optional: true
eslint-import-resolver-node:
optional: true
eslint-import-resolver-typescript:
optional: true
eslint-import-resolver-webpack:
optional: true
dependencies:
'@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@4.9.5)
debug: 3.2.7
eslint: 8.49.0
eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.1)(eslint@8.49.0)
transitivePeerDependencies:
- supports-color
/eslint-plugin-filenames-simple@0.8.0(eslint@8.49.0):
resolution: {integrity: sha512-8+uBzNBE5gSUMQv7bmMBiOD26eKzD4/5flPtD5Vl3dzZLXotSwXK3W7ZZqKQfU0Qyoborh+LqbN76EfmbBcU8A==}
engines: {node: ^14.17.0 || ^16.0.0 || ^18.0.0}
@@ -17992,7 +18037,7 @@ packages:
array.prototype.findlastindex: 1.2.2
array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1
debug: 3.2.7(supports-color@8.1.1)
debug: 3.2.7
doctrine: 2.1.0
eslint: 8.49.0
eslint-import-resolver-node: 0.3.9
@@ -18054,7 +18099,7 @@ packages:
'@es-joy/jsdoccomment': 0.39.4
are-docs-informative: 0.0.2
comment-parser: 1.3.1
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
escape-string-regexp: 4.0.0
eslint: 8.49.0
esquery: 1.5.0
@@ -18349,7 +18394,7 @@ packages:
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
doctrine: 3.0.0
escape-string-regexp: 4.0.0
eslint-scope: 7.2.2
@@ -19289,7 +19334,7 @@ packages:
debug:
optional: true
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
/for-each@0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
@@ -22331,7 +22376,7 @@ packages:
resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
engines: {node: '>=10'}
dependencies:
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
istanbul-lib-coverage: 3.2.0
source-map: 0.6.1
transitivePeerDependencies:
@@ -22445,7 +22490,7 @@ packages:
'@jest/expect': 29.7.0
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
'@types/node': 20.5.9
'@types/node': 18.17.17
chalk: 4.1.2
co: 4.6.0
dedent: 1.5.1
@@ -22606,47 +22651,6 @@ packages:
- supports-color
dev: true
/jest-config@29.7.0(@types/node@20.5.9)(ts-node@10.9.1):
resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
peerDependencies:
'@types/node': '*'
ts-node: '>=9.0.0'
peerDependenciesMeta:
'@types/node':
optional: true
ts-node:
optional: true
dependencies:
'@babel/core': 7.22.20
'@jest/test-sequencer': 29.7.0
'@jest/types': 29.6.3
'@types/node': 20.5.9
babel-jest: 29.7.0(@babel/core@7.22.20)
chalk: 4.1.2
ci-info: 3.8.0
deepmerge: 4.3.1
glob: 7.2.3
graceful-fs: 4.2.11
jest-circus: 29.7.0
jest-environment-node: 29.7.0
jest-get-type: 29.6.3
jest-regex-util: 29.6.3
jest-resolve: 29.7.0
jest-runner: 29.7.0
jest-util: 29.7.0
jest-validate: 29.7.0
micromatch: 4.0.5
parse-json: 5.2.0
pretty-format: 29.7.0
slash: 3.0.0
strip-json-comments: 3.1.1
ts-node: 10.9.1(@types/node@18.17.17)(typescript@4.9.5)
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
dev: true
/jest-diff@25.5.0:
resolution: {integrity: sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==}
engines: {node: '>= 8.3'}
@@ -22791,7 +22795,7 @@ packages:
'@jest/environment': 29.7.0
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
'@types/node': 20.5.9
'@types/node': 18.17.17
jest-mock: 29.7.0
jest-util: 29.7.0
dev: true
@@ -22863,7 +22867,7 @@ packages:
dependencies:
'@jest/types': 29.6.3
'@types/graceful-fs': 4.1.6
'@types/node': 20.5.9
'@types/node': 18.17.17
anymatch: 3.1.3
fb-watchman: 2.0.2
graceful-fs: 4.2.11
@@ -23043,7 +23047,7 @@ packages:
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
'@jest/types': 29.6.3
'@types/node': 20.5.9
'@types/node': 18.17.17
jest-util: 29.7.0
dev: true
@@ -23184,7 +23188,7 @@ packages:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
'@types/node': 20.5.9
'@types/node': 18.17.17
chalk: 4.1.2
emittery: 0.13.1
graceful-fs: 4.2.11
@@ -23245,7 +23249,7 @@ packages:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
'@types/node': 20.5.9
'@types/node': 18.17.17
chalk: 4.1.2
cjs-module-lexer: 1.2.3
collect-v8-coverage: 1.0.2
@@ -23378,7 +23382,7 @@ packages:
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
'@jest/types': 29.6.3
'@types/node': 20.5.9
'@types/node': 18.17.17
chalk: 4.1.2
ci-info: 3.8.0
graceful-fs: 4.2.11
@@ -23389,7 +23393,7 @@ packages:
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
'@jest/types': 29.6.3
'@types/node': 20.5.9
'@types/node': 18.17.17
chalk: 4.1.2
ci-info: 3.8.0
graceful-fs: 4.2.11
@@ -23469,7 +23473,7 @@ packages:
dependencies:
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
'@types/node': 20.5.9
'@types/node': 18.17.17
ansi-escapes: 4.3.2
chalk: 4.1.2
emittery: 0.13.1
@@ -23506,7 +23510,7 @@ packages:
resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
'@types/node': 20.5.9
'@types/node': 18.17.17
jest-util: 29.7.0
merge-stream: 2.0.0
supports-color: 8.1.1
@@ -24057,7 +24061,7 @@ packages:
cli-truncate: 3.1.0
colorette: 2.0.20
commander: 9.5.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
execa: 6.1.0
lilconfig: 2.0.6
listr2: 5.0.8
@@ -31518,7 +31522,7 @@ packages:
arg: 5.0.2
bluebird: 3.7.2
check-more-types: 2.24.0
debug: 4.3.4(supports-color@8.1.1)
debug: 4.3.4
execa: 5.1.1
lazy-ass: 1.6.0
ps-tree: 1.2.0