diff --git a/.github/workflows/test-external-integrations.yaml b/.github/workflows/test-external-integrations.yaml index 051fa0047..75a907bc6 100644 --- a/.github/workflows/test-external-integrations.yaml +++ b/.github/workflows/test-external-integrations.yaml @@ -38,7 +38,9 @@ jobs: install: false working-directory: mon-entreprise # List here all the specs that are making external API calls: - spec: cypress/integration/mon-entreprise/english/gérer.js + spec: | + cypress/integration/mon-entreprise/english/gérer.js + cypress/integration/mon-entreprise/demande-mobilité.js record: true tag: external-mon-entreprise-e2e config: integrationFolder=cypress/integration/mon-entreprise,baseUrl=https://mon-entreprise.fr diff --git a/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js b/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js index d6599eb53..efb00751b 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js @@ -1,113 +1,131 @@ const fr = Cypress.env('language') === 'fr' -describe( - 'Formulaire demande mobilité', - { - retries: { - runMode: 3, - openMode: 0, - }, - }, - function () { - if (!fr) { - return - } - before(() => cy.visit(encodeURI('/gérer/demande-mobilité'))) - it('should not crash', () => { - cy.contains('Demande de mobilité internationale') - }) - it('should allow to complete and download', () => { - // "coordonnées" section - cy.contains('SIRET').click() - cy.focused() - .type('684 064 0011') - .tab() - .type('Deaux') - .tab() - .type('Jean') - .tab() - .type('Française') - cy.contains('sécurité sociale').click() - cy.focused().type('1 91 07 468 054 75').tab().type('1991-07-25') +const FIXTURES_FOLDER = 'cypress/fixtures' +const DEMANDE_MOBILITE_FIXTURES_FOLDER = `${FIXTURES_FOLDER}/demande-mobilité` - cy.get( - "input[name='coordonnées assuré . commune de naissance . étranger'][value='non']" - ) - .next() - .click() - .wait(500) +const writeFixtures = Cypress.env('record_http') !== undefined - cy.focused().tab().type('Pouts').wait(1500).type('{enter}') - - cy.get( - "input[name='coordonnées assuré . domicile personnel . commune . étranger'][value='non']" - ) - .next() - .click() - - cy.focused() - .tab() - .type('3 rue de la Rhumerie') - .tab() - .type('Brest') - .wait(1500) - .type('{enter}') - .tab() - .type('jean.deaux@gmail.com') - .tab() - .type('06 85 69 78 54') - .tab() - - // "activité en France" section - cy.focused() - .type('Deaux & Fils') - .tab() - .type('14 chemin des Docks') - .tab() - .type('Bre') - .wait(1500) - cy.contains('29240').click() - cy.contains('Organisme Urssaf').click() - cy.focused().type('Bretagne').tab().tab().type('Boulangerie') - - // "votre demande" section - cy.get("input[name='demande . pays unique'][value='oui']").next().click() - cy.get("input[name='demande . infrastructure sauvegardée'][value='oui']") - .next() - .click() - cy.get("input[name='demande . activité semblable'][value='oui']") - .next() - .click() - cy.get("input[name='demande . date de fin connue'][value='oui']") - .next() - .click() - cy.get('label[for="détachement . pays"]').wait(1500).click() - cy.focused() - .select('Irlande') - .tab() - .type('2020-11-06') - .tab() - .type('2021-04-09') - .tab() - .tab() - .type('Fabrications de gateaux bretons') - cy.get("input[name='détachement . base fixe'][value='non']") - .next() - .click() - cy.get( - "input[name='commentaires additionnels . commentaires'][value='non']" - ) - .next() - .click() - - // download PDF - cy.contains( - 'Je certifie l’exactitude des informations communiquées ci-dessus' - ).click() - cy.contains('Fait à').click() - cy.focused().type('Plougastel') - cy.contains('Générer la demande').click() - cy.contains('Télécharger le fichier').click() - }) +describe(`Formulaire demande mobilité (${ + writeFixtures ? 'record mode' : 'stubbed mode' +})`, function () { + if (!fr) { + return } -) + let pendingRequests = new Set() + let responses = {} + const hostnamesToRecord = ['geo.api.gouv.fr'] + + beforeEach(() => { + pendingRequests = new Set() + responses = {} + cy.setInterceptResponses( + pendingRequests, + responses, + hostnamesToRecord, + DEMANDE_MOBILITE_FIXTURES_FOLDER + ) + cy.visit(encodeURI('/gérer/demande-mobilité')) + }) + afterEach(() => { + cy.writeInterceptResponses( + pendingRequests, + responses, + DEMANDE_MOBILITE_FIXTURES_FOLDER + ) + }) + + it('should not crash', () => { + cy.contains('Demande de mobilité internationale') + }) + it('should allow to complete and download', () => { + // "coordonnées" section + cy.contains('SIRET').click() + cy.focused() + .type('684 064 0011') + .tab() + .type('Deaux') + .tab() + .type('Jean') + .tab() + .type('Française') + cy.contains('sécurité sociale').click() + cy.focused().type('1 91 07 468 054 75').tab().type('1991-07-25') + + cy.get( + "input[name='coordonnées assuré . commune de naissance . étranger'][value='non']" + ) + .next() + .click() + .wait(500) + + cy.focused().tab().type('Pouts').wait(1500).type('{enter}') + + cy.get( + "input[name='coordonnées assuré . domicile personnel . commune . étranger'][value='non']" + ) + .next() + .click() + + cy.focused() + .tab() + .type('3 rue de la Rhumerie') + .tab() + .type('Brest') + .wait(1500) + .type('{enter}') + .tab() + .type('jean.deaux@gmail.com') + .tab() + .type('06 85 69 78 54') + .tab() + + // "activité en France" section + cy.focused() + .type('Deaux & Fils') + .tab() + .type('14 chemin des Docks') + .tab() + .type('Bre') + .wait(1500) + cy.contains('29240').click() + cy.contains('Organisme Urssaf').click() + cy.focused().type('Bretagne').tab().tab().type('Boulangerie') + + // "votre demande" section + cy.get("input[name='demande . pays unique'][value='oui']").next().click() + cy.get("input[name='demande . infrastructure sauvegardée'][value='oui']") + .next() + .click() + cy.get("input[name='demande . activité semblable'][value='oui']") + .next() + .click() + cy.get("input[name='demande . date de fin connue'][value='oui']") + .next() + .click() + cy.get('label[for="détachement . pays"]').wait(1500).click() + cy.focused() + .select('Irlande') + .tab() + .type('2020-11-06') + .tab() + .type('2021-04-09') + .tab() + .tab() + .type('Fabrications de gateaux bretons') + cy.get("input[name='détachement . base fixe'][value='non']").next().click() + cy.get( + "input[name='commentaires additionnels . commentaires'][value='non']" + ) + .next() + .click() + + // download PDF + cy.contains( + 'Je certifie l’exactitude des informations communiquées ci-dessus' + ).click() + cy.contains('Fait à').click() + cy.focused().type('Plougastel') + cy.contains('Générer la demande').click() + cy.contains('Télécharger le fichier').click() + }) +}) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/english/gérer.js b/mon-entreprise/cypress/integration/mon-entreprise/english/gérer.js index 12ad73074..4f37977c0 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/english/gérer.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/english/gérer.js @@ -2,50 +2,8 @@ const fr = Cypress.env('language') === 'fr' const FIXTURES_FOLDER = 'cypress/fixtures' const GERER_FIXTURES_FOLDER = `${FIXTURES_FOLDER}/gérer` + const writeFixtures = Cypress.env('record_http') !== undefined -const stubFixtures = !writeFixtures -const setInterceptResponses = (pendingRequests, responses, hostnames) => { - if (writeFixtures) { - cy.intercept('*', (req) => { - if (!hostnames.includes(new URL(req.url).hostname)) return - pendingRequests.add(req.url) - req.on('after:response', (res) => { - pendingRequests.delete(req.url) - responses[res.url] = res.body - }) - }) - } else if (stubFixtures) { - const urlOfFilepath = (filename) => { - return atob(filename.slice(0, -'.json'.length)) - } - cy.exec(`find ${GERER_FIXTURES_FOLDER} -type f`) - .then((result) => { - return result.stdout.split('\n') - }) - .then((filepaths) => { - filepaths.forEach((filepath) => { - const shortPath = filepath.slice(FIXTURES_FOLDER.length + 1) - const filename = filepath.slice(GERER_FIXTURES_FOLDER.length + 1) - cy.intercept(urlOfFilepath(filename), { fixture: shortPath }) - }) - }) - } -} -const writeResponses = (pendingRequests, responses) => { - if (writeFixtures) { - // We need to wait on all catched requests to be fulfilled and recorded, - // otherwise the stubbed cy run might error when a request is not stubbed. - // Caveat: we assume request.url to be unique amongst recorded requests. - cy.waitUntil(() => pendingRequests.size === 0) - Object.keys(responses).map((url) => { - if (responses[url] === undefined) return - cy.writeFile( - `${GERER_FIXTURES_FOLDER}/${btoa(url)}.json`, - JSON.stringify(responses[url], null, 2) - ) - }) - } -} describe(`Manage page test (${ writeFixtures ? 'record mode' : 'stubbed mode' @@ -56,11 +14,20 @@ describe(`Manage page test (${ beforeEach(() => { pendingRequests = new Set() responses = {} - setInterceptResponses(pendingRequests, responses, hostnamesToRecord) + cy.setInterceptResponses( + pendingRequests, + responses, + hostnamesToRecord, + GERER_FIXTURES_FOLDER + ) cy.visit(fr ? encodeURI('/gérer') : '/manage') }) afterEach(() => { - writeResponses(pendingRequests, responses) + cy.writeInterceptResponses( + pendingRequests, + responses, + GERER_FIXTURES_FOLDER + ) }) it('should not crash', function () { cy.contains(fr ? 'Gérer mon activité' : 'Manage my business') diff --git a/mon-entreprise/cypress/support/commands.js b/mon-entreprise/cypress/support/commands.js index dc3166ff6..4d5d70bf7 100644 --- a/mon-entreprise/cypress/support/commands.js +++ b/mon-entreprise/cypress/support/commands.js @@ -29,3 +29,58 @@ Cypress.Commands.add('iframe', { prevSubject: 'element' }, ($iframe) => { }) }) import 'cypress-wait-until' +Cypress.Commands.add( + 'setInterceptResponses', + (pendingRequests, responses, hostnames, specFixturesFolder) => { + const FIXTURES_FOLDER = 'cypress/fixtures' + + const writeFixtures = Cypress.env('record_http') !== undefined + const stubFixtures = !writeFixtures + + if (writeFixtures) { + cy.intercept('*', (req) => { + if (!hostnames.includes(new URL(req.url).hostname)) return + pendingRequests.add(req.url) + req.on('after:response', (res) => { + pendingRequests.delete(req.url) + responses[res.url] = res.body + }) + }) + } else if (stubFixtures) { + const urlOfFilepath = (filename) => { + return atob(filename.slice(0, -'.json'.length)) + } + cy.exec(`find ${specFixturesFolder} -type f`) + .then((result) => { + return result.stdout.split('\n') + }) + .then((filepaths) => { + filepaths.forEach((filepath) => { + const shortPath = filepath.slice(FIXTURES_FOLDER.length + 1) + const filename = filepath.slice(specFixturesFolder.length + 1) + cy.intercept(urlOfFilepath(filename), { fixture: shortPath }) + }) + }) + } + } +) +Cypress.Commands.add( + 'writeInterceptResponses', + (pendingRequests, responses, specFixturesFolder) => { + const writeFixtures = Cypress.env('record_http') !== undefined + + if (writeFixtures) { + // We need to wait on all catched requests to be fulfilled and recorded, + // otherwise the stubbed cy run might error when a request is not stubbed. + // Caveat: we assume request.url to be unique amongst recorded requests. + cy.waitUntil(() => pendingRequests.size === 0) + Object.keys(responses).map((url) => { + if (responses[url] === undefined) return + cy.writeFile( + `${specFixturesFolder}/${btoa(url)}.json`, + JSON.stringify(responses[url], null, 2) + ) + }) + } + } +)