diff --git a/packages/react-router/test-app/cypress.config.ts b/packages/react-router/test-app/cypress.config.ts new file mode 100644 index 0000000000..b2ec230fb0 --- /dev/null +++ b/packages/react-router/test-app/cypress.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'cypress'; + +export default defineConfig({ + video: false, + pageLoadTimeout: 6000000000, + screenshotOnRunFailure: false, + defaultCommandTimeout: 10000, + fixturesFolder: 'tests/e2e/fixtures', + screenshotsFolder: 'tests/e2e/screenshots', + videosFolder: 'tests/e2e/videos', + e2e: { + // We've imported your old cypress plugins here. + // You may want to clean this up later by importing these. + setupNodeEvents(on, config) { + return require('./tests/e2e/plugins/index.js')(on, config) + }, + baseUrl: "http://localhost:3000", + specPattern: 'tests/e2e/specs/**/*.cy.{js,jsx,ts,tsx}', + supportFile: 'tests/e2e/support/index.js', + }, +}) diff --git a/packages/react-router/test-app/cypress.json b/packages/react-router/test-app/cypress.json deleted file mode 100644 index 257aee8742..0000000000 --- a/packages/react-router/test-app/cypress.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "pageLoadTimeout": 6000000000, - "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1", - "viewportWidth": 375, - "viewportHeight": 812, - "video": false, - "screenshotOnRunFailure": false -} diff --git a/packages/react-router/test-app/cypress/examples/actions.spec.js b/packages/react-router/test-app/cypress/examples/actions.spec.js deleted file mode 100644 index 031a136067..0000000000 --- a/packages/react-router/test-app/cypress/examples/actions.spec.js +++ /dev/null @@ -1,291 +0,0 @@ -/// - -context('Actions', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/actions'); - }); - - // https://on.cypress.io/interacting-with-elements - - it('.type() - type into a DOM element', () => { - // https://on.cypress.io/type - cy.get('.action-email') - .type('fake@email.com') - .should('have.value', 'fake@email.com') - - // .type() with special character sequences - .type('{leftarrow}{rightarrow}{uparrow}{downarrow}') - .type('{del}{selectall}{backspace}') - - // .type() with key modifiers - .type('{alt}{option}') //these are equivalent - .type('{ctrl}{control}') //these are equivalent - .type('{meta}{command}{cmd}') //these are equivalent - .type('{shift}') - - // Delay each keypress by 0.1 sec - .type('slow.typing@email.com', { delay: 100 }) - .should('have.value', 'slow.typing@email.com'); - - cy.get('.action-disabled') - // Ignore error checking prior to type - // like whether the input is visible or disabled - .type('disabled error checking', { force: true }) - .should('have.value', 'disabled error checking'); - }); - - it('.focus() - focus on a DOM element', () => { - // https://on.cypress.io/focus - cy.get('.action-focus') - .focus() - .should('have.class', 'focus') - .prev() - .should('have.attr', 'style', 'color: orange;'); - }); - - it('.blur() - blur off a DOM element', () => { - // https://on.cypress.io/blur - cy.get('.action-blur') - .type('About to blur') - .blur() - .should('have.class', 'error') - .prev() - .should('have.attr', 'style', 'color: red;'); - }); - - it('.clear() - clears an input or textarea element', () => { - // https://on.cypress.io/clear - cy.get('.action-clear') - .type('Clear this text') - .should('have.value', 'Clear this text') - .clear() - .should('have.value', ''); - }); - - it('.submit() - submit a form', () => { - // https://on.cypress.io/submit - cy.get('.action-form').find('[type="text"]').type('HALFOFF'); - cy.get('.action-form').submit().next().should('contain', 'Your form has been submitted!'); - }); - - it('.click() - click on a DOM element', () => { - // https://on.cypress.io/click - cy.get('.action-btn').click(); - - // You can click on 9 specific positions of an element: - // ----------------------------------- - // | topLeft top topRight | - // | | - // | | - // | | - // | left center right | - // | | - // | | - // | | - // | bottomLeft bottom bottomRight | - // ----------------------------------- - - // clicking in the center of the element is the default - cy.get('#action-canvas').click(); - - cy.get('#action-canvas').click('topLeft'); - cy.get('#action-canvas').click('top'); - cy.get('#action-canvas').click('topRight'); - cy.get('#action-canvas').click('left'); - cy.get('#action-canvas').click('right'); - cy.get('#action-canvas').click('bottomLeft'); - cy.get('#action-canvas').click('bottom'); - cy.get('#action-canvas').click('bottomRight'); - - // .click() accepts an x and y coordinate - // that controls where the click occurs :) - - cy.get('#action-canvas') - .click(80, 75) // click 80px on x coord and 75px on y coord - .click(170, 75) - .click(80, 165) - .click(100, 185) - .click(125, 190) - .click(150, 185) - .click(170, 165); - - // click multiple elements by passing multiple: true - cy.get('.action-labels>.label').click({ multiple: true }); - - // Ignore error checking prior to clicking - cy.get('.action-opacity>.btn').click({ force: true }); - }); - - it('.dblclick() - double click on a DOM element', () => { - // https://on.cypress.io/dblclick - - // Our app has a listener on 'dblclick' event in our 'scripts.js' - // that hides the div and shows an input on double click - cy.get('.action-div').dblclick().should('not.be.visible'); - cy.get('.action-input-hidden').should('be.visible'); - }); - - it('.rightclick() - right click on a DOM element', () => { - // https://on.cypress.io/rightclick - - // Our app has a listener on 'contextmenu' event in our 'scripts.js' - // that hides the div and shows an input on right click - cy.get('.rightclick-action-div').rightclick().should('not.be.visible'); - cy.get('.rightclick-action-input-hidden').should('be.visible'); - }); - - it('.check() - check a checkbox or radio element', () => { - // https://on.cypress.io/check - - // By default, .check() will check all - // matching checkbox or radio elements in succession, one after another - cy.get('.action-checkboxes [type="checkbox"]').not('[disabled]').check().should('be.checked'); - - cy.get('.action-radios [type="radio"]').not('[disabled]').check().should('be.checked'); - - // .check() accepts a value argument - cy.get('.action-radios [type="radio"]').check('radio1').should('be.checked'); - - // .check() accepts an array of values - cy.get('.action-multiple-checkboxes [type="checkbox"]') - .check(['checkbox1', 'checkbox2']) - .should('be.checked'); - - // Ignore error checking prior to checking - cy.get('.action-checkboxes [disabled]').check({ force: true }).should('be.checked'); - - cy.get('.action-radios [type="radio"]').check('radio3', { force: true }).should('be.checked'); - }); - - it('.uncheck() - uncheck a checkbox element', () => { - // https://on.cypress.io/uncheck - - // By default, .uncheck() will uncheck all matching - // checkbox elements in succession, one after another - cy.get('.action-check [type="checkbox"]').not('[disabled]').uncheck().should('not.be.checked'); - - // .uncheck() accepts a value argument - cy.get('.action-check [type="checkbox"]') - .check('checkbox1') - .uncheck('checkbox1') - .should('not.be.checked'); - - // .uncheck() accepts an array of values - cy.get('.action-check [type="checkbox"]') - .check(['checkbox1', 'checkbox3']) - .uncheck(['checkbox1', 'checkbox3']) - .should('not.be.checked'); - - // Ignore error checking prior to unchecking - cy.get('.action-check [disabled]').uncheck({ force: true }).should('not.be.checked'); - }); - - it('.select() - select an option in a element', () => { - // https://on.cypress.io/select - - // at first, no option should be selected - cy.get('.action-select').should('have.value', '--Select a fruit--'); - - // Select option(s) with matching text content - cy.get('.action-select').select('apples'); - // confirm the apples were selected - // note that each value starts with "fr-" in our HTML - cy.get('.action-select').should('have.value', 'fr-apples'); - - cy.get('.action-select-multiple') - .select(['apples', 'oranges', 'bananas']) - // when getting multiple values, invoke "val" method first - .invoke('val') - .should('deep.equal', ['fr-apples', 'fr-oranges', 'fr-bananas']); - - // Select option(s) with matching value - cy.get('.action-select') - .select('fr-bananas') - // can attach an assertion right away to the element - .should('have.value', 'fr-bananas'); - - cy.get('.action-select-multiple') - .select(['fr-apples', 'fr-oranges', 'fr-bananas']) - .invoke('val') - .should('deep.equal', ['fr-apples', 'fr-oranges', 'fr-bananas']); - // assert the selected values include oranges - cy.get('.action-select-multiple').invoke('val').should('include', 'fr-oranges'); - }); - - it('.scrollIntoView() - scroll an element into view', () => { - // https://on.cypress.io/scrollintoview - - // normally all of these buttons are hidden, - // because they're not within - // the viewable area of their parent - // (we need to scroll to see them) - cy.get('#scroll-horizontal button').should('not.be.visible'); - - // scroll the button into view, as if the user had scrolled - cy.get('#scroll-horizontal button').scrollIntoView().should('be.visible'); - - cy.get('#scroll-vertical button').should('not.be.visible'); - - // Cypress handles the scroll direction needed - cy.get('#scroll-vertical button').scrollIntoView().should('be.visible'); - - cy.get('#scroll-both button').should('not.be.visible'); - - // Cypress knows to scroll to the right and down - cy.get('#scroll-both button').scrollIntoView().should('be.visible'); - }); - - it('.trigger() - trigger an event on a DOM element', () => { - // https://on.cypress.io/trigger - - // To interact with a range input (slider) - // we need to set its value & trigger the - // event to signal it changed - - // Here, we invoke jQuery's val() method to set - // the value and trigger the 'change' event - cy.get('.trigger-input-range') - .invoke('val', 25) - .trigger('change') - .get('input[type=range]') - .siblings('p') - .should('have.text', '25'); - }); - - it('cy.scrollTo() - scroll the window or element to a position', () => { - // https://on.cypress.io/scrollTo - - // You can scroll to 9 specific positions of an element: - // ----------------------------------- - // | topLeft top topRight | - // | | - // | | - // | | - // | left center right | - // | | - // | | - // | | - // | bottomLeft bottom bottomRight | - // ----------------------------------- - - // if you chain .scrollTo() off of cy, we will - // scroll the entire window - cy.scrollTo('bottom'); - - cy.get('#scrollable-horizontal').scrollTo('right'); - - // or you can scroll to a specific coordinate: - // (x axis, y axis) in pixels - cy.get('#scrollable-vertical').scrollTo(250, 250); - - // or you can scroll to a specific percentage - // of the (width, height) of the element - cy.get('#scrollable-both').scrollTo('75%', '25%'); - - // control the easing of the scroll (default is 'swing') - cy.get('#scrollable-vertical').scrollTo('center', { easing: 'linear' }); - - // control the duration of the scroll (in ms) - cy.get('#scrollable-both').scrollTo('center', { duration: 2000 }); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/aliasing.spec.js b/packages/react-router/test-app/cypress/examples/aliasing.spec.js deleted file mode 100644 index b93c129865..0000000000 --- a/packages/react-router/test-app/cypress/examples/aliasing.spec.js +++ /dev/null @@ -1,36 +0,0 @@ -/// - -context('Aliasing', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/aliasing'); - }); - - it('.as() - alias a DOM element for later use', () => { - // https://on.cypress.io/as - - // Alias a DOM element for use later - // We don't have to traverse to the element - // later in our code, we reference it with @ - - cy.get('.as-table').find('tbody>tr').first().find('td').first().find('button').as('firstBtn'); - - // when we reference the alias, we place an - // @ in front of its name - cy.get('@firstBtn').click(); - - cy.get('@firstBtn').should('have.class', 'btn-success').and('contain', 'Changed'); - }); - - it('.as() - alias a route for later use', () => { - // Alias the route to wait for its response - cy.server(); - cy.route('GET', 'comments/*').as('getComment'); - - // we have code that gets a comment when - // the button is clicked in scripts.js - cy.get('.network-btn').click(); - - // https://on.cypress.io/wait - cy.wait('@getComment').its('status').should('eq', 200); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/assertions.spec.js b/packages/react-router/test-app/cypress/examples/assertions.spec.js deleted file mode 100644 index 391082151d..0000000000 --- a/packages/react-router/test-app/cypress/examples/assertions.spec.js +++ /dev/null @@ -1,168 +0,0 @@ -/// - -context('Assertions', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/assertions'); - }); - - describe('Implicit Assertions', () => { - it('.should() - make an assertion about the current subject', () => { - // https://on.cypress.io/should - cy.get('.assertion-table') - .find('tbody tr:last') - .should('have.class', 'success') - .find('td') - .first() - // checking the text of the element in various ways - .should('have.text', 'Column content') - .should('contain', 'Column content') - .should('have.html', 'Column content') - // chai-jquery uses "is()" to check if element matches selector - .should('match', 'td') - // to match text content against a regular expression - // first need to invoke jQuery method text() - // and then match using regular expression - .invoke('text') - .should('match', /column content/i); - - // a better way to check element's text content against a regular expression - // is to use "cy.contains" - // https://on.cypress.io/contains - cy.get('.assertion-table') - .find('tbody tr:last') - // finds first element with text content matching regular expression - .contains('td', /column content/i) - .should('be.visible'); - - // for more information about asserting element's text - // see https://on.cypress.io/using-cypress-faq#How-do-I-get-an-element’s-text-contents - }); - - it('.and() - chain multiple assertions together', () => { - // https://on.cypress.io/and - cy.get('.assertions-link') - .should('have.class', 'active') - .and('have.attr', 'href') - .and('include', 'cypress.io'); - }); - }); - - describe('Explicit Assertions', () => { - // https://on.cypress.io/assertions - it('expect - make an assertion about a specified subject', () => { - // We can use Chai's BDD style assertions - expect(true).to.be.true; - const o = { foo: 'bar' }; - - expect(o).to.equal(o); - expect(o).to.deep.equal({ foo: 'bar' }); - // matching text using regular expression - expect('FooBar').to.match(/bar$/i); - }); - - it('pass your own callback function to should()', () => { - // Pass a function to should that can have any number - // of explicit assertions within it. - // The ".should(cb)" function will be retried - // automatically until it passes all your explicit assertions or times out. - cy.get('.assertions-p') - .find('p') - .should(($p) => { - // https://on.cypress.io/$ - // return an array of texts from all of the p's - // @ts-ignore TS6133 unused variable - const texts = $p.map((i, el) => Cypress.$(el).text()); - - // jquery map returns jquery object - // and .get() convert this to simple array - const paragraphs = texts.get(); - - // array should have length of 3 - expect(paragraphs, 'has 3 paragraphs').to.have.length(3); - - // use second argument to expect(...) to provide clear - // message with each assertion - expect(paragraphs, 'has expected text in each paragraph').to.deep.eq([ - 'Some text from first p', - 'More text from second p', - 'And even more text from third p', - ]); - }); - }); - - it('finds element by class name regex', () => { - cy.get('.docs-header') - .find('div') - // .should(cb) callback function will be retried - .should(($div) => { - expect($div).to.have.length(1); - - const className = $div[0].className; - - expect(className).to.match(/heading-/); - }) - // .then(cb) callback is not retried, - // it either passes or fails - .then(($div) => { - expect($div, 'text content').to.have.text('Introduction'); - }); - }); - - it('can throw any error', () => { - cy.get('.docs-header') - .find('div') - .should(($div) => { - if ($div.length !== 1) { - // you can throw your own errors - throw new Error('Did not find 1 element'); - } - - const className = $div[0].className; - - if (!className.match(/heading-/)) { - throw new Error(`Could not find class "heading-" in ${className}`); - } - }); - }); - - it('matches unknown text between two elements', () => { - /** - * Text from the first element. - * @type {string} - */ - let text; - - /** - * Normalizes passed text, - * useful before comparing text with spaces and different capitalization. - * @param {string} s Text to normalize - */ - const normalizeText = (s) => s.replace(/\s/g, '').toLowerCase(); - - cy.get('.two-elements') - .find('.first') - .then(($first) => { - // save text from the first element - text = normalizeText($first.text()); - }); - - cy.get('.two-elements') - .find('.second') - .should(($div) => { - // we can massage text before comparing - const secondText = normalizeText($div.text()); - - expect(secondText, 'second text').to.equal(text); - }); - }); - - it('assert - assert shape of an object', () => { - const person = { - name: 'Joe', - age: 20, - }; - - assert.isObject(person, 'value is object'); - }); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/connectors.spec.js b/packages/react-router/test-app/cypress/examples/connectors.spec.js deleted file mode 100644 index cf62028144..0000000000 --- a/packages/react-router/test-app/cypress/examples/connectors.spec.js +++ /dev/null @@ -1,96 +0,0 @@ -/// - -context('Connectors', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/connectors'); - }); - - it('.each() - iterate over an array of elements', () => { - // https://on.cypress.io/each - cy.get('.connectors-each-ul>li').each(($el, index, $list) => { - console.log($el, index, $list); - }); - }); - - it('.its() - get properties on the current subject', () => { - // https://on.cypress.io/its - cy.get('.connectors-its-ul>li') - // calls the 'length' property yielding that value - .its('length') - .should('be.gt', 2); - }); - - it('.invoke() - invoke a function on the current subject', () => { - // our div is hidden in our script.js - // $('.connectors-div').hide() - - // https://on.cypress.io/invoke - cy.get('.connectors-div') - .should('be.hidden') - // call the jquery method 'show' on the 'div.container' - .invoke('show') - .should('be.visible'); - }); - - it('.spread() - spread an array as individual args to callback function', () => { - // https://on.cypress.io/spread - const arr = ['foo', 'bar', 'baz']; - - cy.wrap(arr).spread((foo, bar, baz) => { - expect(foo).to.eq('foo'); - expect(bar).to.eq('bar'); - expect(baz).to.eq('baz'); - }); - }); - - describe('.then()', () => { - it('invokes a callback function with the current subject', () => { - // https://on.cypress.io/then - cy.get('.connectors-list > li').then(($lis) => { - expect($lis, '3 items').to.have.length(3); - expect($lis.eq(0), 'first item').to.contain('Walk the dog'); - expect($lis.eq(1), 'second item').to.contain('Feed the cat'); - expect($lis.eq(2), 'third item').to.contain('Write JavaScript'); - }); - }); - - it('yields the returned value to the next command', () => { - cy.wrap(1) - .then((num) => { - expect(num).to.equal(1); - - return 2; - }) - .then((num) => { - expect(num).to.equal(2); - }); - }); - - it('yields the original subject without return', () => { - cy.wrap(1) - .then((num) => { - expect(num).to.equal(1); - // note that nothing is returned from this callback - }) - .then((num) => { - // this callback receives the original unchanged value 1 - expect(num).to.equal(1); - }); - }); - - it('yields the value yielded by the last Cypress command inside', () => { - cy.wrap(1) - .then((num) => { - expect(num).to.equal(1); - // note how we run a Cypress command - // the result yielded by this Cypress command - // will be passed to the second ".then" - cy.wrap(2); - }) - .then((num) => { - // this callback receives the value yielded by "cy.wrap(2)" - expect(num).to.equal(2); - }); - }); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/cookies.spec.js b/packages/react-router/test-app/cypress/examples/cookies.spec.js deleted file mode 100644 index 87b2e5b9d2..0000000000 --- a/packages/react-router/test-app/cypress/examples/cookies.spec.js +++ /dev/null @@ -1,79 +0,0 @@ -/// - -context('Cookies', () => { - beforeEach(() => { - Cypress.Cookies.debug(true); - - cy.visit('https://example.cypress.io/commands/cookies'); - - // clear cookies again after visiting to remove - // any 3rd party cookies picked up such as cloudflare - cy.clearCookies(); - }); - - it('cy.getCookie() - get a browser cookie', () => { - // https://on.cypress.io/getcookie - cy.get('#getCookie .set-a-cookie').click(); - - // cy.getCookie() yields a cookie object - cy.getCookie('token').should('have.property', 'value', '123ABC'); - }); - - it('cy.getCookies() - get browser cookies', () => { - // https://on.cypress.io/getcookies - cy.getCookies().should('be.empty'); - - cy.get('#getCookies .set-a-cookie').click(); - - // cy.getCookies() yields an array of cookies - cy.getCookies() - .should('have.length', 1) - .should((cookies) => { - // each cookie has these properties - expect(cookies[0]).to.have.property('name', 'token'); - expect(cookies[0]).to.have.property('value', '123ABC'); - expect(cookies[0]).to.have.property('httpOnly', false); - expect(cookies[0]).to.have.property('secure', false); - expect(cookies[0]).to.have.property('domain'); - expect(cookies[0]).to.have.property('path'); - }); - }); - - it('cy.setCookie() - set a browser cookie', () => { - // https://on.cypress.io/setcookie - cy.getCookies().should('be.empty'); - - cy.setCookie('foo', 'bar'); - - // cy.getCookie() yields a cookie object - cy.getCookie('foo').should('have.property', 'value', 'bar'); - }); - - it('cy.clearCookie() - clear a browser cookie', () => { - // https://on.cypress.io/clearcookie - cy.getCookie('token').should('be.null'); - - cy.get('#clearCookie .set-a-cookie').click(); - - cy.getCookie('token').should('have.property', 'value', '123ABC'); - - // cy.clearCookies() yields null - cy.clearCookie('token').should('be.null'); - - cy.getCookie('token').should('be.null'); - }); - - it('cy.clearCookies() - clear browser cookies', () => { - // https://on.cypress.io/clearcookies - cy.getCookies().should('be.empty'); - - cy.get('#clearCookies .set-a-cookie').click(); - - cy.getCookies().should('have.length', 1); - - // cy.clearCookies() yields null - cy.clearCookies(); - - cy.getCookies().should('be.empty'); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/cypress_api.spec.js b/packages/react-router/test-app/cypress/examples/cypress_api.spec.js deleted file mode 100644 index c622a7b095..0000000000 --- a/packages/react-router/test-app/cypress/examples/cypress_api.spec.js +++ /dev/null @@ -1,225 +0,0 @@ -/// - -context('Cypress.Commands', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api'); - }); - - // https://on.cypress.io/custom-commands - - it('.add() - create a custom command', () => { - Cypress.Commands.add( - 'console', - { - prevSubject: true, - }, - (subject, method) => { - // the previous subject is automatically received - // and the commands arguments are shifted - - // allow us to change the console method used - method = method || 'log'; - - // log the subject to the console - // @ts-ignore TS7017 - console[method]('The subject is', subject); - - // whatever we return becomes the new subject - // we don't want to change the subject so - // we return whatever was passed in - return subject; - } - ); - - // @ts-ignore TS2339 - cy.get('button') - .console('info') - .then(($button) => { - // subject is still $button - }); - }); -}); - -context('Cypress.Cookies', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api'); - }); - - // https://on.cypress.io/cookies - it('.debug() - enable or disable debugging', () => { - Cypress.Cookies.debug(true); - - // Cypress will now log in the console when - // cookies are set or cleared - cy.setCookie('fakeCookie', '123ABC'); - cy.clearCookie('fakeCookie'); - cy.setCookie('fakeCookie', '123ABC'); - cy.clearCookie('fakeCookie'); - cy.setCookie('fakeCookie', '123ABC'); - }); - - it('.preserveOnce() - preserve cookies by key', () => { - // normally cookies are reset after each test - cy.getCookie('fakeCookie').should('not.be.ok'); - - // preserving a cookie will not clear it when - // the next test starts - cy.setCookie('lastCookie', '789XYZ'); - Cypress.Cookies.preserveOnce('lastCookie'); - }); - - it('.defaults() - set defaults for all cookies', () => { - // now any cookie with the name 'session_id' will - // not be cleared before each new test runs - Cypress.Cookies.defaults({ - whitelist: 'session_id', - }); - }); -}); - -context('Cypress.Server', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api'); - }); - - // Permanently override server options for - // all instances of cy.server() - - // https://on.cypress.io/cypress-server - it('.defaults() - change default config of server', () => { - Cypress.Server.defaults({ - delay: 0, - force404: false, - }); - }); -}); - -context('Cypress.arch', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api'); - }); - - it('Get CPU architecture name of underlying OS', () => { - // https://on.cypress.io/arch - expect(Cypress.arch).to.exist; - }); -}); - -context('Cypress.config()', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api'); - }); - - it('Get and set configuration options', () => { - // https://on.cypress.io/config - let myConfig = Cypress.config(); - - expect(myConfig).to.have.property('animationDistanceThreshold', 5); - expect(myConfig).to.have.property('baseUrl', null); - expect(myConfig).to.have.property('defaultCommandTimeout', 4000); - expect(myConfig).to.have.property('requestTimeout', 5000); - expect(myConfig).to.have.property('responseTimeout', 30000); - expect(myConfig).to.have.property('viewportHeight', 660); - expect(myConfig).to.have.property('viewportWidth', 1000); - expect(myConfig).to.have.property('pageLoadTimeout', 60000); - expect(myConfig).to.have.property('waitForAnimations', true); - - expect(Cypress.config('pageLoadTimeout')).to.eq(60000); - - // this will change the config for the rest of your tests! - Cypress.config('pageLoadTimeout', 20000); - - expect(Cypress.config('pageLoadTimeout')).to.eq(20000); - - Cypress.config('pageLoadTimeout', 60000); - }); -}); - -context('Cypress.dom', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api'); - }); - - // https://on.cypress.io/dom - it('.isHidden() - determine if a DOM element is hidden', () => { - let hiddenP = Cypress.$('.dom-p p.hidden').get(0); - let visibleP = Cypress.$('.dom-p p.visible').get(0); - - // our first paragraph has css class 'hidden' - expect(Cypress.dom.isHidden(hiddenP)).to.be.true; - expect(Cypress.dom.isHidden(visibleP)).to.be.false; - }); -}); - -context('Cypress.env()', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api'); - }); - - // We can set environment variables for highly dynamic values - - // https://on.cypress.io/environment-variables - it('Get environment variables', () => { - // https://on.cypress.io/env - // set multiple environment variables - Cypress.env({ - host: 'veronica.dev.local', - api_server: 'http://localhost:8888/v1/', - }); - - // get environment variable - expect(Cypress.env('host')).to.eq('veronica.dev.local'); - - // set environment variable - Cypress.env('api_server', 'http://localhost:8888/v2/'); - expect(Cypress.env('api_server')).to.eq('http://localhost:8888/v2/'); - - // get all environment variable - expect(Cypress.env()).to.have.property('host', 'veronica.dev.local'); - expect(Cypress.env()).to.have.property('api_server', 'http://localhost:8888/v2/'); - }); -}); - -context('Cypress.log', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api'); - }); - - it('Control what is printed to the Command Log', () => { - // https://on.cypress.io/cypress-log - }); -}); - -context('Cypress.platform', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api'); - }); - - it('Get underlying OS name', () => { - // https://on.cypress.io/platform - expect(Cypress.platform).to.be.exist; - }); -}); - -context('Cypress.version', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api'); - }); - - it('Get current version of Cypress being run', () => { - // https://on.cypress.io/version - expect(Cypress.version).to.be.exist; - }); -}); - -context('Cypress.spec', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api'); - }); - - it('Get current spec information', () => { - // https://on.cypress.io/spec - // wrap the object so we can inspect it easily by clicking in the command log - cy.wrap(Cypress.spec).should('include.keys', ['name', 'relative', 'absolute']); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/files.spec.js b/packages/react-router/test-app/cypress/examples/files.spec.js deleted file mode 100644 index c270f1ac63..0000000000 --- a/packages/react-router/test-app/cypress/examples/files.spec.js +++ /dev/null @@ -1,114 +0,0 @@ -/// - -/// JSON fixture file can be loaded directly using -// the built-in JavaScript bundler -// @ts-ignore -const requiredExample = require('../../fixtures/example'); - -context('Files', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/files'); - }); - - beforeEach(() => { - // load example.json fixture file and store - // in the test context object - cy.fixture('example.json').as('example'); - }); - - it('cy.fixture() - load a fixture', () => { - // https://on.cypress.io/fixture - - // Instead of writing a response inline you can - // use a fixture file's content. - - cy.server(); - cy.fixture('example.json').as('comment'); - // when application makes an Ajax request matching "GET comments/*" - // Cypress will intercept it and reply with object - // from the "comment" alias - cy.route('GET', 'comments/*', '@comment').as('getComment'); - - // we have code that gets a comment when - // the button is clicked in scripts.js - cy.get('.fixture-btn').click(); - - cy.wait('@getComment') - .its('responseBody') - .should('have.property', 'name') - .and('include', 'Using fixtures to represent data'); - - // you can also just write the fixture in the route - cy.route('GET', 'comments/*', 'fixture:example.json').as('getComment'); - - // we have code that gets a comment when - // the button is clicked in scripts.js - cy.get('.fixture-btn').click(); - - cy.wait('@getComment') - .its('responseBody') - .should('have.property', 'name') - .and('include', 'Using fixtures to represent data'); - - // or write fx to represent fixture - // by default it assumes it's .json - cy.route('GET', 'comments/*', 'fx:example').as('getComment'); - - // we have code that gets a comment when - // the button is clicked in scripts.js - cy.get('.fixture-btn').click(); - - cy.wait('@getComment') - .its('responseBody') - .should('have.property', 'name') - .and('include', 'Using fixtures to represent data'); - }); - - it('cy.fixture() or require - load a fixture', function () { - // we are inside the "function () { ... }" - // callback and can use test context object "this" - // "this.example" was loaded in "beforeEach" function callback - expect(this.example, 'fixture in the test context').to.deep.equal(requiredExample); - - // or use "cy.wrap" and "should('deep.equal', ...)" assertion - // @ts-ignore - cy.wrap(this.example, 'fixture vs require').should('deep.equal', requiredExample); - }); - - it('cy.readFile() - read file contents', () => { - // https://on.cypress.io/readfile - - // You can read a file and yield its contents - // The filePath is relative to your project's root. - cy.readFile('cypress.json').then((json) => { - expect(json).to.be.an('object'); - }); - }); - - it('cy.writeFile() - write to a file', () => { - // https://on.cypress.io/writefile - - // You can write to a file - - // Use a response from a request to automatically - // generate a fixture file for use later - cy.request('https://jsonplaceholder.cypress.io/users').then((response) => { - cy.writeFile('cypress/fixtures/users.json', response.body); - }); - cy.fixture('users').should((users) => { - expect(users[0].name).to.exist; - }); - - // JavaScript arrays and objects are stringified - // and formatted into text. - cy.writeFile('cypress/fixtures/profile.json', { - id: 8739, - name: 'Jane', - email: 'jane@example.com', - }); - - cy.fixture('profile').should((profile) => { - expect(profile.name).to.eq('Jane'); - }); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/local_storage.spec.js b/packages/react-router/test-app/cypress/examples/local_storage.spec.js deleted file mode 100644 index 1946c4d07a..0000000000 --- a/packages/react-router/test-app/cypress/examples/local_storage.spec.js +++ /dev/null @@ -1,58 +0,0 @@ -/// - -context('Local Storage', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/local-storage'); - }); - // Although local storage is automatically cleared - // in between tests to maintain a clean state - // sometimes we need to clear the local storage manually - - it('cy.clearLocalStorage() - clear all data in local storage', () => { - // https://on.cypress.io/clearlocalstorage - cy.get('.ls-btn') - .click() - .should(() => { - expect(localStorage.getItem('prop1')).to.eq('red'); - expect(localStorage.getItem('prop2')).to.eq('blue'); - expect(localStorage.getItem('prop3')).to.eq('magenta'); - }); - - // clearLocalStorage() yields the localStorage object - cy.clearLocalStorage().should((ls) => { - expect(ls.getItem('prop1')).to.be.null; - expect(ls.getItem('prop2')).to.be.null; - expect(ls.getItem('prop3')).to.be.null; - }); - - // Clear key matching string in Local Storage - cy.get('.ls-btn') - .click() - .should(() => { - expect(localStorage.getItem('prop1')).to.eq('red'); - expect(localStorage.getItem('prop2')).to.eq('blue'); - expect(localStorage.getItem('prop3')).to.eq('magenta'); - }); - - cy.clearLocalStorage('prop1').should((ls) => { - expect(ls.getItem('prop1')).to.be.null; - expect(ls.getItem('prop2')).to.eq('blue'); - expect(ls.getItem('prop3')).to.eq('magenta'); - }); - - // Clear keys matching regex in Local Storage - cy.get('.ls-btn') - .click() - .should(() => { - expect(localStorage.getItem('prop1')).to.eq('red'); - expect(localStorage.getItem('prop2')).to.eq('blue'); - expect(localStorage.getItem('prop3')).to.eq('magenta'); - }); - - cy.clearLocalStorage(/prop1|2/).should((ls) => { - expect(ls.getItem('prop1')).to.be.null; - expect(ls.getItem('prop2')).to.be.null; - expect(ls.getItem('prop3')).to.eq('magenta'); - }); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/location.spec.js b/packages/react-router/test-app/cypress/examples/location.spec.js deleted file mode 100644 index a53c901152..0000000000 --- a/packages/react-router/test-app/cypress/examples/location.spec.js +++ /dev/null @@ -1,32 +0,0 @@ -/// - -context('Location', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/location'); - }); - - it('cy.hash() - get the current URL hash', () => { - // https://on.cypress.io/hash - cy.hash().should('be.empty'); - }); - - it('cy.location() - get window.location', () => { - // https://on.cypress.io/location - cy.location().should((location) => { - expect(location.hash).to.be.empty; - expect(location.href).to.eq('https://example.cypress.io/commands/location'); - expect(location.host).to.eq('example.cypress.io'); - expect(location.hostname).to.eq('example.cypress.io'); - expect(location.origin).to.eq('https://example.cypress.io'); - expect(location.pathname).to.eq('/commands/location'); - expect(location.port).to.eq(''); - expect(location.protocol).to.eq('https:'); - expect(location.search).to.be.empty; - }); - }); - - it('cy.url() - get the current URL', () => { - // https://on.cypress.io/url - cy.url().should('eq', 'https://example.cypress.io/commands/location'); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/misc.spec.js b/packages/react-router/test-app/cypress/examples/misc.spec.js deleted file mode 100644 index 99c89df4e6..0000000000 --- a/packages/react-router/test-app/cypress/examples/misc.spec.js +++ /dev/null @@ -1,86 +0,0 @@ -/// - -context('Misc', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/misc'); - }); - - it('.end() - end the command chain', () => { - // https://on.cypress.io/end - - // cy.end is useful when you want to end a chain of commands - // and force Cypress to re-query from the root element - cy.get('.misc-table').within(() => { - // ends the current chain and yields null - cy.contains('Cheryl').click().end(); - - // queries the entire table again - cy.contains('Charles').click(); - }); - }); - - it('cy.exec() - execute a system command', () => { - // execute a system command. - // so you can take actions necessary for - // your test outside the scope of Cypress. - // https://on.cypress.io/exec - - // we can use Cypress.platform string to - // select appropriate command - // https://on.cypress/io/platform - cy.log(`Platform ${Cypress.platform} architecture ${Cypress.arch}`); - - // on CircleCI Windows build machines we have a failure to run bash shell - // https://github.com/cypress-io/cypress/issues/5169 - // so skip some of the tests by passing flag "--env circle=true" - const isCircleOnWindows = Cypress.platform === 'win32' && Cypress.env('circle'); - - if (isCircleOnWindows) { - return; - } - - cy.exec('echo Jane Lane').its('stdout').should('contain', 'Jane Lane'); - - if (Cypress.platform === 'win32') { - cy.exec('print cypress.json').its('stderr').should('be.empty'); - } else { - cy.exec('cat cypress.json').its('stderr').should('be.empty'); - - cy.exec('pwd').its('code').should('eq', 0); - } - }); - - it('cy.focused() - get the DOM element that has focus', () => { - // https://on.cypress.io/focused - cy.get('.misc-form').find('#name').click(); - cy.focused().should('have.id', 'name'); - - cy.get('.misc-form').find('#description').click(); - cy.focused().should('have.id', 'description'); - }); - - context('Cypress.Screenshot', function () { - it('cy.screenshot() - take a screenshot', () => { - // https://on.cypress.io/screenshot - cy.screenshot('my-image'); - }); - - it('Cypress.Screenshot.defaults() - change default config of screenshots', function () { - Cypress.Screenshot.defaults({ - blackout: ['.foo'], - capture: 'viewport', - clip: { x: 0, y: 0, width: 200, height: 200 }, - scale: false, - disableTimersAndAnimations: true, - screenshotOnRunFailure: true, - beforeScreenshot() {}, - afterScreenshot() {}, - }); - }); - }); - - it('cy.wrap() - wrap an object', () => { - // https://on.cypress.io/wrap - cy.wrap({ foo: 'bar' }).should('have.property', 'foo').and('include', 'bar'); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/navigation.spec.js b/packages/react-router/test-app/cypress/examples/navigation.spec.js deleted file mode 100644 index 8a66ac41c3..0000000000 --- a/packages/react-router/test-app/cypress/examples/navigation.spec.js +++ /dev/null @@ -1,56 +0,0 @@ -/// - -context('Navigation', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io'); - cy.get('.navbar-nav').contains('Commands').click(); - cy.get('.dropdown-menu').contains('Navigation').click(); - }); - - it("cy.go() - go back or forward in the browser's history", () => { - // https://on.cypress.io/go - - cy.location('pathname').should('include', 'navigation'); - - cy.go('back'); - cy.location('pathname').should('not.include', 'navigation'); - - cy.go('forward'); - cy.location('pathname').should('include', 'navigation'); - - // clicking back - cy.go(-1); - cy.location('pathname').should('not.include', 'navigation'); - - // clicking forward - cy.go(1); - cy.location('pathname').should('include', 'navigation'); - }); - - it('cy.reload() - reload the page', () => { - // https://on.cypress.io/reload - cy.reload(); - - // reload the page without using the cache - cy.reload(true); - }); - - it('cy.visit() - visit a remote url', () => { - // https://on.cypress.io/visit - - // Visit any sub-domain of your current domain - - // Pass options to the visit - cy.visit('https://example.cypress.io/commands/navigation', { - timeout: 50000, // increase total time for the visit to resolve - onBeforeLoad(contentWindow) { - // contentWindow is the remote page's window object - expect(typeof contentWindow === 'object').to.be.true; - }, - onLoad(contentWindow) { - // contentWindow is the remote page's window object - expect(typeof contentWindow === 'object').to.be.true; - }, - }); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/network_requests.spec.js b/packages/react-router/test-app/cypress/examples/network_requests.spec.js deleted file mode 100644 index 67bbae3f06..0000000000 --- a/packages/react-router/test-app/cypress/examples/network_requests.spec.js +++ /dev/null @@ -1,194 +0,0 @@ -/// - -context('Network Requests', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/network-requests'); - }); - - // Manage AJAX / XHR requests in your app - - it('cy.server() - control behavior of network requests and responses', () => { - // https://on.cypress.io/server - - cy.server().should((server) => { - // the default options on server - // you can override any of these options - expect(server.delay).to.eq(0); - expect(server.method).to.eq('GET'); - expect(server.status).to.eq(200); - expect(server.headers).to.be.null; - expect(server.response).to.be.null; - expect(server.onRequest).to.be.undefined; - expect(server.onResponse).to.be.undefined; - expect(server.onAbort).to.be.undefined; - - // These options control the server behavior - // affecting all requests - - // pass false to disable existing route stubs - expect(server.enable).to.be.true; - // forces requests that don't match your routes to 404 - expect(server.force404).to.be.false; - // whitelists requests from ever being logged or stubbed - expect(server.whitelist).to.be.a('function'); - }); - - cy.server({ - method: 'POST', - delay: 1000, - status: 422, - response: {}, - }); - - // any route commands will now inherit the above options - // from the server. anything we pass specifically - // to route will override the defaults though. - }); - - it('cy.request() - make an XHR request', () => { - // https://on.cypress.io/request - cy.request('https://jsonplaceholder.cypress.io/comments').should((response) => { - expect(response.status).to.eq(200); - expect(response.body).to.have.length(500); - expect(response).to.have.property('headers'); - expect(response).to.have.property('duration'); - }); - }); - - it('cy.request() - verify response using BDD syntax', () => { - cy.request('https://jsonplaceholder.cypress.io/comments').then((response) => { - // https://on.cypress.io/assertions - expect(response).property('status').to.equal(200); - expect(response).property('body').to.have.length(500); - expect(response).to.include.keys('headers', 'duration'); - }); - }); - - it('cy.request() with query parameters', () => { - // will execute request - // https://jsonplaceholder.cypress.io/comments?postId=1&id=3 - cy.request({ - url: 'https://jsonplaceholder.cypress.io/comments', - qs: { - postId: 1, - id: 3, - }, - }) - .its('body') - .should('be.an', 'array') - .and('have.length', 1) - .its('0') // yields first element of the array - .should('contain', { - postId: 1, - id: 3, - }); - }); - - it('cy.request() - pass result to the second request', () => { - // first, let's find out the userId of the first user we have - cy.request('https://jsonplaceholder.cypress.io/users?_limit=1') - .its('body') // yields the response object - .its('0') // yields the first element of the returned list - // the above two commands its('body').its('0') - // can be written as its('body.0') - // if you do not care about TypeScript checks - .then((user) => { - expect(user).property('id').to.be.a('number'); - // make a new post on behalf of the user - cy.request('POST', 'https://jsonplaceholder.cypress.io/posts', { - userId: user.id, - title: 'Cypress Test Runner', - body: 'Fast, easy and reliable testing for anything that runs in a browser.', - }); - }) - // note that the value here is the returned value of the 2nd request - // which is the new post object - .then((response) => { - expect(response).property('status').to.equal(201); // new entity created - expect(response).property('body').to.contain({ - id: 101, // there are already 100 posts, so new entity gets id 101 - title: 'Cypress Test Runner', - }); - // we don't know the user id here - since it was in above closure - // so in this test just confirm that the property is there - expect(response.body).property('userId').to.be.a('number'); - }); - }); - - it('cy.request() - save response in the shared test context', () => { - // https://on.cypress.io/variables-and-aliases - cy.request('https://jsonplaceholder.cypress.io/users?_limit=1') - .its('body') - .its('0') // yields the first element of the returned list - .as('user') // saves the object in the test context - .then(function () { - // NOTE đŸ‘€ - // By the time this callback runs the "as('user')" command - // has saved the user object in the test context. - // To access the test context we need to use - // the "function () { ... }" callback form, - // otherwise "this" points at a wrong or undefined object! - cy.request('POST', 'https://jsonplaceholder.cypress.io/posts', { - userId: this.user.id, - title: 'Cypress Test Runner', - body: 'Fast, easy and reliable testing for anything that runs in a browser.', - }) - .its('body') - .as('post'); // save the new post from the response - }) - .then(function () { - // When this callback runs, both "cy.request" API commands have finished - // and the test context has "user" and "post" objects set. - // Let's verify them. - expect(this.post, 'post has the right user id').property('userId').to.equal(this.user.id); - }); - }); - - it('cy.route() - route responses to matching requests', () => { - // https://on.cypress.io/route - - let message = 'whoa, this comment does not exist'; - - cy.server(); - - // Listen to GET to comments/1 - cy.route('GET', 'comments/*').as('getComment'); - - // we have code that gets a comment when - // the button is clicked in scripts.js - cy.get('.network-btn').click(); - - // https://on.cypress.io/wait - cy.wait('@getComment').its('status').should('eq', 200); - - // Listen to POST to comments - cy.route('POST', '/comments').as('postComment'); - - // we have code that posts a comment when - // the button is clicked in scripts.js - cy.get('.network-post').click(); - cy.wait('@postComment').should((xhr) => { - expect(xhr.requestBody).to.include('email'); - expect(xhr.requestHeaders).to.have.property('Content-Type'); - expect(xhr.responseBody).to.have.property('name', 'Using POST in cy.route()'); - }); - - // Stub a response to PUT comments/ **** - cy.route({ - method: 'PUT', - url: 'comments/*', - status: 404, - response: { error: message }, - delay: 500, - }).as('putComment'); - - // we have code that puts a comment when - // the button is clicked in scripts.js - cy.get('.network-put').click(); - - cy.wait('@putComment'); - - // our 404 statusCode logic in scripts.js executed - cy.get('.network-put-comment').should('contain', message); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/querying.spec.js b/packages/react-router/test-app/cypress/examples/querying.spec.js deleted file mode 100644 index f1a7fced84..0000000000 --- a/packages/react-router/test-app/cypress/examples/querying.spec.js +++ /dev/null @@ -1,102 +0,0 @@ -/// - -context('Querying', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/querying'); - }); - - // The most commonly used query is 'cy.get()', you can - // think of this like the '$' in jQuery - - it('cy.get() - query DOM elements', () => { - // https://on.cypress.io/get - - cy.get('#query-btn').should('contain', 'Button'); - - cy.get('.query-btn').should('contain', 'Button'); - - cy.get('#querying .well>button:first').should('contain', 'Button'); - // ↲ - // Use CSS selectors just like jQuery - - cy.get('[data-test-id="test-example"]').should('have.class', 'example'); - - // 'cy.get()' yields jQuery object, you can get its attribute - // by invoking `.attr()` method - cy.get('[data-test-id="test-example"]') - .invoke('attr', 'data-test-id') - .should('equal', 'test-example'); - - // or you can get element's CSS property - cy.get('[data-test-id="test-example"]').invoke('css', 'position').should('equal', 'static'); - - // or use assertions directly during 'cy.get()' - // https://on.cypress.io/assertions - cy.get('[data-test-id="test-example"]') - .should('have.attr', 'data-test-id', 'test-example') - .and('have.css', 'position', 'static'); - }); - - it('cy.contains() - query DOM elements with matching content', () => { - // https://on.cypress.io/contains - cy.get('.query-list').contains('bananas').should('have.class', 'third'); - - // we can pass a regexp to `.contains()` - cy.get('.query-list').contains(/^b\w+/).should('have.class', 'third'); - - cy.get('.query-list').contains('apples').should('have.class', 'first'); - - // passing a selector to contains will - // yield the selector containing the text - cy.get('#querying').contains('ul', 'oranges').should('have.class', 'query-list'); - - cy.get('.query-button').contains('Save Form').should('have.class', 'btn'); - }); - - it('.within() - query DOM elements within a specific element', () => { - // https://on.cypress.io/within - cy.get('.query-form').within(() => { - cy.get('input:first').should('have.attr', 'placeholder', 'Email'); - cy.get('input:last').should('have.attr', 'placeholder', 'Password'); - }); - }); - - it('cy.root() - query the root DOM element', () => { - // https://on.cypress.io/root - - // By default, root is the document - cy.root().should('match', 'html'); - - cy.get('.query-ul').within(() => { - // In this within, the root is now the ul DOM element - cy.root().should('have.class', 'query-ul'); - }); - }); - - it('best practices - selecting elements', () => { - // https://on.cypress.io/best-practices#Selecting-Elements - cy.get('[data-cy=best-practices-selecting-elements]').within(() => { - // Worst - too generic, no context - cy.get('button').click(); - - // Bad. Coupled to styling. Highly subject to change. - cy.get('.btn.btn-large').click(); - - // Average. Coupled to the `name` attribute which has HTML semantics. - cy.get('[name=submission]').click(); - - // Better. But still coupled to styling or JS event listeners. - cy.get('#main').click(); - - // Slightly better. Uses an ID but also ensures the element - // has an ARIA role attribute - cy.get('#main[role=button]').click(); - - // Much better. But still coupled to text content that may change. - cy.contains('Submit').click(); - - // Best. Insulated from all changes. - cy.get('[data-cy=submit]').click(); - }); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/spies_stubs_clocks.spec.js b/packages/react-router/test-app/cypress/examples/spies_stubs_clocks.spec.js deleted file mode 100644 index c3037bf69e..0000000000 --- a/packages/react-router/test-app/cypress/examples/spies_stubs_clocks.spec.js +++ /dev/null @@ -1,92 +0,0 @@ -/// - -context('Spies, Stubs, and Clock', () => { - it('cy.spy() - wrap a method in a spy', () => { - // https://on.cypress.io/spy - cy.visit('https://example.cypress.io/commands/spies-stubs-clocks'); - - const obj = { - foo() {}, - }; - - const spy = cy.spy(obj, 'foo').as('anyArgs'); - - obj.foo(); - - expect(spy).to.be.called; - }); - - it('cy.spy() retries until assertions pass', () => { - cy.visit('https://example.cypress.io/commands/spies-stubs-clocks'); - - const obj = { - /** - * Prints the argument passed - * @param x {any} - */ - foo(x) { - console.log('obj.foo called with', x); - }, - }; - - cy.spy(obj, 'foo').as('foo'); - - setTimeout(() => { - obj.foo('first'); - }, 500); - - setTimeout(() => { - obj.foo('second'); - }, 2500); - - cy.get('@foo').should('have.been.calledTwice'); - }); - - it('cy.stub() - create a stub and/or replace a function with stub', () => { - // https://on.cypress.io/stub - cy.visit('https://example.cypress.io/commands/spies-stubs-clocks'); - - const obj = { - /** - * prints both arguments to the console - * @param a {string} - * @param b {string} - */ - foo(a, b) { - console.log('a', a, 'b', b); - }, - }; - - const stub = cy.stub(obj, 'foo').as('foo'); - - obj.foo('foo', 'bar'); - - expect(stub).to.be.called; - }); - - it('cy.clock() - control time in the browser', () => { - // https://on.cypress.io/clock - - // create the date in UTC so its always the same - // no matter what local timezone the browser is running in - const now = new Date(Date.UTC(2017, 2, 14)).getTime(); - - cy.clock(now); - cy.visit('https://example.cypress.io/commands/spies-stubs-clocks'); - cy.get('#clock-div').click().should('have.text', '1489449600'); - }); - - it('cy.tick() - move time in the browser', () => { - // https://on.cypress.io/tick - - // create the date in UTC so its always the same - // no matter what local timezone the browser is running in - const now = new Date(Date.UTC(2017, 2, 14)).getTime(); - - cy.clock(now); - cy.visit('https://example.cypress.io/commands/spies-stubs-clocks'); - cy.get('#tick-div').click().should('have.text', '1489449600'); - cy.tick(10000); // 10 seconds passed - cy.get('#tick-div').click().should('have.text', '1489449610'); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/traversal.spec.js b/packages/react-router/test-app/cypress/examples/traversal.spec.js deleted file mode 100644 index 9134054614..0000000000 --- a/packages/react-router/test-app/cypress/examples/traversal.spec.js +++ /dev/null @@ -1,97 +0,0 @@ -/// - -context('Traversal', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/traversal'); - }); - - it('.children() - get child DOM elements', () => { - // https://on.cypress.io/children - cy.get('.traversal-breadcrumb').children('.active').should('contain', 'Data'); - }); - - it('.closest() - get closest ancestor DOM element', () => { - // https://on.cypress.io/closest - cy.get('.traversal-badge').closest('ul').should('have.class', 'list-group'); - }); - - it('.eq() - get a DOM element at a specific index', () => { - // https://on.cypress.io/eq - cy.get('.traversal-list>li').eq(1).should('contain', 'siamese'); - }); - - it('.filter() - get DOM elements that match the selector', () => { - // https://on.cypress.io/filter - cy.get('.traversal-nav>li').filter('.active').should('contain', 'About'); - }); - - it('.find() - get descendant DOM elements of the selector', () => { - // https://on.cypress.io/find - cy.get('.traversal-pagination').find('li').find('a').should('have.length', 7); - }); - - it('.first() - get first DOM element', () => { - // https://on.cypress.io/first - cy.get('.traversal-table td').first().should('contain', '1'); - }); - - it('.last() - get last DOM element', () => { - // https://on.cypress.io/last - cy.get('.traversal-buttons .btn').last().should('contain', 'Submit'); - }); - - it('.next() - get next sibling DOM element', () => { - // https://on.cypress.io/next - cy.get('.traversal-ul').contains('apples').next().should('contain', 'oranges'); - }); - - it('.nextAll() - get all next sibling DOM elements', () => { - // https://on.cypress.io/nextall - cy.get('.traversal-next-all').contains('oranges').nextAll().should('have.length', 3); - }); - - it('.nextUntil() - get next sibling DOM elements until next el', () => { - // https://on.cypress.io/nextuntil - cy.get('#veggies').nextUntil('#nuts').should('have.length', 3); - }); - - it('.not() - remove DOM elements from set of DOM elements', () => { - // https://on.cypress.io/not - cy.get('.traversal-disabled .btn').not('[disabled]').should('not.contain', 'Disabled'); - }); - - it('.parent() - get parent DOM element from DOM elements', () => { - // https://on.cypress.io/parent - cy.get('.traversal-mark').parent().should('contain', 'Morbi leo risus'); - }); - - it('.parents() - get parent DOM elements from DOM elements', () => { - // https://on.cypress.io/parents - cy.get('.traversal-cite').parents().should('match', 'blockquote'); - }); - - it('.parentsUntil() - get parent DOM elements from DOM elements until el', () => { - // https://on.cypress.io/parentsuntil - cy.get('.clothes-nav').find('.active').parentsUntil('.clothes-nav').should('have.length', 2); - }); - - it('.prev() - get previous sibling DOM element', () => { - // https://on.cypress.io/prev - cy.get('.birds').find('.active').prev().should('contain', 'Lorikeets'); - }); - - it('.prevAll() - get all previous sibling DOM elements', () => { - // https://on.cypress.io/prevAll - cy.get('.fruits-list').find('.third').prevAll().should('have.length', 2); - }); - - it('.prevUntil() - get all previous sibling DOM elements until el', () => { - // https://on.cypress.io/prevUntil - cy.get('.foods-list').find('#nuts').prevUntil('#veggies').should('have.length', 3); - }); - - it('.siblings() - get all sibling DOM elements', () => { - // https://on.cypress.io/siblings - cy.get('.traversal-pills .active').siblings().should('have.length', 2); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/utilities.spec.js b/packages/react-router/test-app/cypress/examples/utilities.spec.js deleted file mode 100644 index 7d522947e6..0000000000 --- a/packages/react-router/test-app/cypress/examples/utilities.spec.js +++ /dev/null @@ -1,131 +0,0 @@ -/// - -context('Utilities', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/utilities'); - }); - - it('Cypress._ - call a lodash method', () => { - // https://on.cypress.io/_ - cy.request('https://jsonplaceholder.cypress.io/users').then((response) => { - let ids = Cypress._.chain(response.body).map('id').take(3).value(); - - expect(ids).to.deep.eq([1, 2, 3]); - }); - }); - - it('Cypress.$ - call a jQuery method', () => { - // https://on.cypress.io/$ - let $li = Cypress.$('.utility-jquery li:first'); - - cy.wrap($li).should('not.have.class', 'active').click().should('have.class', 'active'); - }); - - it('Cypress.Blob - blob utilities and base64 string conversion', () => { - // https://on.cypress.io/blob - cy.get('.utility-blob').then(($div) => - // https://github.com/nolanlawson/blob-util#imgSrcToDataURL - // get the dataUrl string for the javascript-logo - Cypress.Blob.imgSrcToDataURL( - 'https://example.cypress.io/assets/img/javascript-logo.png', - undefined, - 'anonymous' - ).then((dataUrl) => { - // create an element and set its src to the dataUrl - let img = Cypress.$('', { src: dataUrl }); - - // need to explicitly return cy here since we are initially returning - // the Cypress.Blob.imgSrcToDataURL promise to our test - // append the image - $div.append(img); - - cy.get('.utility-blob img').click().should('have.attr', 'src', dataUrl); - }) - ); - }); - - it('Cypress.minimatch - test out glob patterns against strings', () => { - // https://on.cypress.io/minimatch - let matching = Cypress.minimatch('/users/1/comments', '/users/*/comments', { - matchBase: true, - }); - - expect(matching, 'matching wildcard').to.be.true; - - matching = Cypress.minimatch('/users/1/comments/2', '/users/*/comments', { - matchBase: true, - }); - expect(matching, 'comments').to.be.false; - - // ** matches against all downstream path segments - matching = Cypress.minimatch('/foo/bar/baz/123/quux?a=b&c=2', '/foo/**', { - matchBase: true, - }); - expect(matching, 'comments').to.be.true; - - // whereas * matches only the next path segment - - matching = Cypress.minimatch('/foo/bar/baz/123/quux?a=b&c=2', '/foo/*', { - matchBase: false, - }); - expect(matching, 'comments').to.be.false; - }); - - it('Cypress.moment() - format or parse dates using a moment method', () => { - // https://on.cypress.io/moment - const time = Cypress.moment('2014-04-25T19:38:53.196Z').utc().format('h:mm A'); - - expect(time).to.be.a('string'); - - cy.get('.utility-moment').contains('3:38 PM').should('have.class', 'badge'); - - // the time in the element should be between 3pm and 5pm - const start = Cypress.moment('3:00 PM', 'LT'); - const end = Cypress.moment('5:00 PM', 'LT'); - - cy.get('.utility-moment .badge').should(($el) => { - // parse American time like "3:38 PM" - const m = Cypress.moment($el.text().trim(), 'LT'); - - // display hours + minutes + AM|PM - const f = 'h:mm A'; - - expect( - m.isBetween(start, end), - `${m.format(f)} should be between ${start.format(f)} and ${end.format(f)}` - ).to.be.true; - }); - }); - - it('Cypress.Promise - instantiate a bluebird promise', () => { - // https://on.cypress.io/promise - let waited = false; - - /** - * @return Bluebird - */ - function waitOneSecond() { - // return a promise that resolves after 1 second - // @ts-ignore TS2351 (new Cypress.Promise) - return new Cypress.Promise((resolve, reject) => { - setTimeout(() => { - // set waited to true - waited = true; - - // resolve with 'foo' string - resolve('foo'); - }, 1000); - }); - } - - cy.then(() => - // return a promise to cy.then() that - // is awaited until it resolves - // @ts-ignore TS7006 - waitOneSecond().then((str) => { - expect(str).to.eq('foo'); - expect(waited).to.be.true; - }) - ); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/viewport.spec.js b/packages/react-router/test-app/cypress/examples/viewport.spec.js deleted file mode 100644 index 21293a3221..0000000000 --- a/packages/react-router/test-app/cypress/examples/viewport.spec.js +++ /dev/null @@ -1,59 +0,0 @@ -/// - -context('Viewport', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/viewport'); - }); - - it('cy.viewport() - set the viewport size and dimension', () => { - // https://on.cypress.io/viewport - - cy.get('#navbar').should('be.visible'); - cy.viewport(320, 480); - - // the navbar should have collapse since our screen is smaller - cy.get('#navbar').should('not.be.visible'); - cy.get('.navbar-toggle').should('be.visible').click(); - cy.get('.nav').find('a').should('be.visible'); - - // lets see what our app looks like on a super large screen - cy.viewport(2999, 2999); - - // cy.viewport() accepts a set of preset sizes - // to easily set the screen to a device's width and height - - // We added a cy.wait() between each viewport change so you can see - // the change otherwise it is a little too fast to see :) - - cy.viewport('macbook-15'); - cy.wait(200); - cy.viewport('macbook-13'); - cy.wait(200); - cy.viewport('macbook-11'); - cy.wait(200); - cy.viewport('ipad-2'); - cy.wait(200); - cy.viewport('ipad-mini'); - cy.wait(200); - cy.viewport('iphone-6+'); - cy.wait(200); - cy.viewport('iphone-6'); - cy.wait(200); - cy.viewport('iphone-5'); - cy.wait(200); - cy.viewport('iphone-4'); - cy.wait(200); - cy.viewport('iphone-3'); - cy.wait(200); - - // cy.viewport() accepts an orientation for all presets - // the default orientation is 'portrait' - cy.viewport('ipad-2', 'portrait'); - cy.wait(200); - cy.viewport('iphone-4', 'landscape'); - cy.wait(200); - - // The viewport will be reset back to the default dimensions - // in between tests (the default can be set in cypress.json) - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/waiting.spec.js b/packages/react-router/test-app/cypress/examples/waiting.spec.js deleted file mode 100644 index 768dabeaa9..0000000000 --- a/packages/react-router/test-app/cypress/examples/waiting.spec.js +++ /dev/null @@ -1,33 +0,0 @@ -/// - -context('Waiting', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/waiting'); - }); - // BE CAREFUL of adding unnecessary wait times. - // https://on.cypress.io/best-practices#Unnecessary-Waiting - - // https://on.cypress.io/wait - it('cy.wait() - wait for a specific amount of time', () => { - cy.get('.wait-input1').type('Wait 1000ms after typing'); - cy.wait(1000); - cy.get('.wait-input2').type('Wait 1000ms after typing'); - cy.wait(1000); - cy.get('.wait-input3').type('Wait 1000ms after typing'); - cy.wait(1000); - }); - - it('cy.wait() - wait for a specific route', () => { - cy.server(); - - // Listen to GET to comments/1 - cy.route('GET', 'comments/*').as('getComment'); - - // we have code that gets a comment when - // the button is clicked in scripts.js - cy.get('.network-btn').click(); - - // wait for GET comments/1 - cy.wait('@getComment').its('status').should('eq', 200); - }); -}); diff --git a/packages/react-router/test-app/cypress/examples/window.spec.js b/packages/react-router/test-app/cypress/examples/window.spec.js deleted file mode 100644 index 2deea94b83..0000000000 --- a/packages/react-router/test-app/cypress/examples/window.spec.js +++ /dev/null @@ -1,22 +0,0 @@ -/// - -context('Window', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/window'); - }); - - it('cy.window() - get the global window object', () => { - // https://on.cypress.io/window - cy.window().should('have.property', 'top'); - }); - - it('cy.document() - get the document object', () => { - // https://on.cypress.io/document - cy.document().should('have.property', 'charset').and('eq', 'UTF-8'); - }); - - it('cy.title() - get the title', () => { - // https://on.cypress.io/title - cy.title().should('include', 'Kitchen Sink'); - }); -}); diff --git a/packages/react-router/test-app/package-lock.json b/packages/react-router/test-app/package-lock.json index 9be0f6a5f9..60cd0370c1 100644 --- a/packages/react-router/test-app/package-lock.json +++ b/packages/react-router/test-app/package-lock.json @@ -34,7 +34,7 @@ "devDependencies": { "@capacitor/cli": "3.2.4", "concurrently": "^6.3.0", - "cypress": "^8.5.0", + "cypress": "^10.9.0", "serve": "^14.0.1", "wait-on": "^6.0.0", "webpack-cli": "^4.9.1" @@ -1888,18 +1888,6 @@ "node": ">=12.4.0" } }, - "node_modules/@capacitor/cli/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@capacitor/cli/node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -4580,9 +4568,9 @@ } }, "node_modules/@types/sinonjs__fake-timers": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz", - "integrity": "sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", "dev": true }, "node_modules/@types/sizzle": { @@ -4803,17 +4791,6 @@ "node": ">= 4" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -5061,17 +5038,6 @@ "node": ">=0.12.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -6630,6 +6596,30 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -7623,17 +7613,6 @@ "webpack": "^5.0.0" } }, - "node_modules/css-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/css-loader/node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -7984,31 +7963,32 @@ "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "node_modules/cypress": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.7.0.tgz", - "integrity": "sha512-b1bMC3VQydC6sXzBMFnSqcvwc9dTZMgcaOzT0vpSD+Gq1yFc+72JDWi55sfUK5eIeNLAtWOGy1NNb6UlhMvB+Q==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.9.0.tgz", + "integrity": "sha512-MjIWrRpc+bQM9U4kSSdATZWZ2hUqHGFEQTF7dfeZRa4MnalMtc88FIE49USWP2ZVtfy5WPBcgfBX+YorFqGElA==", "dev": true, "hasInstallScript": true, "dependencies": { - "@cypress/request": "^2.88.6", + "@cypress/request": "^2.88.10", "@cypress/xvfb": "^1.2.4", "@types/node": "^14.14.31", - "@types/sinonjs__fake-timers": "^6.0.2", + "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", + "buffer": "^5.6.0", "cachedir": "^2.3.0", "chalk": "^4.1.0", "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.0", + "cli-table3": "~0.6.1", "commander": "^5.1.0", "common-tags": "^1.8.0", "dayjs": "^1.10.4", "debug": "^4.3.2", "enquirer": "^2.3.6", - "eventemitter2": "^6.4.3", + "eventemitter2": "6.4.7", "execa": "4.1.0", "executable": "^4.1.1", "extract-zip": "2.0.1", @@ -8021,16 +8001,15 @@ "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.5", + "minimist": "^1.2.6", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", "proxy-from-env": "1.0.0", - "ramda": "~0.27.1", "request-progress": "^3.0.0", + "semver": "^7.3.2", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", - "url": "^0.11.0", "yauzl": "^2.10.0" }, "bin": { @@ -8125,6 +8104,21 @@ "node": ">=8" } }, + "node_modules/cypress/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cypress/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -9665,9 +9659,9 @@ } }, "node_modules/eventemitter2": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.5.tgz", - "integrity": "sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==", + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", "dev": true }, "node_modules/eventemitter3": { @@ -10467,17 +10461,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -11356,6 +11339,26 @@ "node": ">=4" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/immer": { "version": "9.0.15", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz", @@ -14719,17 +14722,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-snapshot/node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -16205,6 +16197,17 @@ "tslib": "^2.0.3" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -17595,17 +17598,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/postcss-loader/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -18480,12 +18472,6 @@ "performance-now": "^2.1.0" } }, - "node_modules/ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", - "dev": true - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -19364,17 +19350,6 @@ "node": ">=8.9.0" } }, - "node_modules/react-scripts/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/react-scripts/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -21822,32 +21797,6 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "deprecated": "Please see https://github.com/lydell/urix#deprecated" }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - }, - "node_modules/url/node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -24447,15 +24396,6 @@ "xml2js": "^0.4.23" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -26493,9 +26433,9 @@ } }, "@types/sinonjs__fake-timers": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz", - "integrity": "sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", "dev": true }, "@types/sizzle": { @@ -26672,14 +26612,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -26824,14 +26756,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -27978,6 +27902,16 @@ "node-int64": "^0.4.0" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -28702,14 +28636,6 @@ "semver": "^7.3.5" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -28947,30 +28873,31 @@ "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "cypress": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.7.0.tgz", - "integrity": "sha512-b1bMC3VQydC6sXzBMFnSqcvwc9dTZMgcaOzT0vpSD+Gq1yFc+72JDWi55sfUK5eIeNLAtWOGy1NNb6UlhMvB+Q==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.9.0.tgz", + "integrity": "sha512-MjIWrRpc+bQM9U4kSSdATZWZ2hUqHGFEQTF7dfeZRa4MnalMtc88FIE49USWP2ZVtfy5WPBcgfBX+YorFqGElA==", "dev": true, "requires": { - "@cypress/request": "^2.88.6", + "@cypress/request": "^2.88.10", "@cypress/xvfb": "^1.2.4", "@types/node": "^14.14.31", - "@types/sinonjs__fake-timers": "^6.0.2", + "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", + "buffer": "^5.6.0", "cachedir": "^2.3.0", "chalk": "^4.1.0", "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.0", + "cli-table3": "~0.6.1", "commander": "^5.1.0", "common-tags": "^1.8.0", "dayjs": "^1.10.4", "debug": "^4.3.2", "enquirer": "^2.3.6", - "eventemitter2": "^6.4.3", + "eventemitter2": "6.4.7", "execa": "4.1.0", "executable": "^4.1.1", "extract-zip": "2.0.1", @@ -28983,16 +28910,15 @@ "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.5", + "minimist": "^1.2.6", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", "proxy-from-env": "1.0.0", - "ramda": "~0.27.1", "request-progress": "^3.0.0", + "semver": "^7.3.2", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", - "url": "^0.11.0", "yauzl": "^2.10.0" }, "dependencies": { @@ -29059,6 +28985,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -30173,9 +30108,9 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "eventemitter2": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.5.tgz", - "integrity": "sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==", + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", "dev": true }, "eventemitter3": { @@ -30766,14 +30701,6 @@ "resolve-from": "^4.0.0" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -31411,6 +31338,12 @@ "harmony-reflect": "^1.4.6" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "immer": { "version": "9.0.15", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz", @@ -33885,14 +33818,6 @@ "pretty-format": "^27.5.1" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, "pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -35010,6 +34935,14 @@ "tslib": "^2.0.3" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -35919,14 +35852,6 @@ "resolve-from": "^4.0.0" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -36484,12 +36409,6 @@ "performance-now": "^2.1.0" } }, - "ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", - "dev": true - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -37091,14 +37010,6 @@ "json5": "^2.1.2" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -38926,30 +38837,6 @@ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "dev": true - } - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/packages/react-router/test-app/package.json b/packages/react-router/test-app/package.json index 63ff754cec..a2da68eb72 100644 --- a/packages/react-router/test-app/package.json +++ b/packages/react-router/test-app/package.json @@ -31,6 +31,7 @@ "build": "react-scripts build", "test": "cypress open", "cypress": "node_modules/.bin/cypress run --headless --browser chrome", + "cypress.open": "cypress open", "e2e": "concurrently \"serve -s build -l 3000\" \"wait-on http-get://localhost:3000 && npm run cypress\" --kill-others --success first", "sync": "sh ./scripts/sync.sh" }, @@ -55,7 +56,7 @@ "devDependencies": { "@capacitor/cli": "3.2.4", "concurrently": "^6.3.0", - "cypress": "^8.5.0", + "cypress": "^10.9.0", "serve": "^14.0.1", "wait-on": "^6.0.0", "webpack-cli": "^4.9.1" diff --git a/packages/react-router/test-app/cypress/fixtures/example.json b/packages/react-router/test-app/tests/e2e/fixtures/example.json similarity index 100% rename from packages/react-router/test-app/cypress/fixtures/example.json rename to packages/react-router/test-app/tests/e2e/fixtures/example.json diff --git a/packages/react-router/test-app/cypress/plugins/index.js b/packages/react-router/test-app/tests/e2e/plugins/index.js similarity index 100% rename from packages/react-router/test-app/cypress/plugins/index.js rename to packages/react-router/test-app/tests/e2e/plugins/index.js diff --git a/packages/react-router/test-app/cypress/integration/dynamic-ionpage-classnames.js b/packages/react-router/test-app/tests/e2e/specs/dynamic-ionpage-classnames.cy.js similarity index 100% rename from packages/react-router/test-app/cypress/integration/dynamic-ionpage-classnames.js rename to packages/react-router/test-app/tests/e2e/specs/dynamic-ionpage-classnames.cy.js diff --git a/packages/react-router/test-app/cypress/integration/dynamic-routes.spec.js b/packages/react-router/test-app/tests/e2e/specs/dynamic-routes.cy.js similarity index 100% rename from packages/react-router/test-app/cypress/integration/dynamic-routes.spec.js rename to packages/react-router/test-app/tests/e2e/specs/dynamic-routes.cy.js diff --git a/packages/react-router/test-app/cypress/integration/dynamic-tabs.spec.js b/packages/react-router/test-app/tests/e2e/specs/dynamic-tabs.cy.js similarity index 100% rename from packages/react-router/test-app/cypress/integration/dynamic-tabs.spec.js rename to packages/react-router/test-app/tests/e2e/specs/dynamic-tabs.cy.js diff --git a/packages/react-router/test-app/cypress/integration/multiple-tabs.spec.js b/packages/react-router/test-app/tests/e2e/specs/multiple-tabs.cy.js similarity index 100% rename from packages/react-router/test-app/cypress/integration/multiple-tabs.spec.js rename to packages/react-router/test-app/tests/e2e/specs/multiple-tabs.cy.js diff --git a/packages/react-router/test-app/cypress/integration/nested-outlets.spec.js b/packages/react-router/test-app/tests/e2e/specs/nested-outlets.cy.js similarity index 100% rename from packages/react-router/test-app/cypress/integration/nested-outlets.spec.js rename to packages/react-router/test-app/tests/e2e/specs/nested-outlets.cy.js diff --git a/packages/react-router/test-app/cypress/integration/outlet-ref.spec.js b/packages/react-router/test-app/tests/e2e/specs/outlet-ref.cy.js similarity index 100% rename from packages/react-router/test-app/cypress/integration/outlet-ref.spec.js rename to packages/react-router/test-app/tests/e2e/specs/outlet-ref.cy.js diff --git a/packages/react-router/test-app/cypress/integration/refs.spec.js b/packages/react-router/test-app/tests/e2e/specs/refs.cy.js similarity index 100% rename from packages/react-router/test-app/cypress/integration/refs.spec.js rename to packages/react-router/test-app/tests/e2e/specs/refs.cy.js diff --git a/packages/react-router/test-app/cypress/integration/replace-actions.spec.js b/packages/react-router/test-app/tests/e2e/specs/replace-actions.cy.js similarity index 100% rename from packages/react-router/test-app/cypress/integration/replace-actions.spec.js rename to packages/react-router/test-app/tests/e2e/specs/replace-actions.cy.js diff --git a/packages/react-router/test-app/cypress/integration/routing.spec.js b/packages/react-router/test-app/tests/e2e/specs/routing.cy.js similarity index 100% rename from packages/react-router/test-app/cypress/integration/routing.spec.js rename to packages/react-router/test-app/tests/e2e/specs/routing.cy.js diff --git a/packages/react-router/test-app/cypress/integration/swipe-to-go-back.js b/packages/react-router/test-app/tests/e2e/specs/swipe-to-go-back.cy.js similarity index 86% rename from packages/react-router/test-app/cypress/integration/swipe-to-go-back.js rename to packages/react-router/test-app/tests/e2e/specs/swipe-to-go-back.cy.js index f5b4ac8925..94fb3367cc 100644 --- a/packages/react-router/test-app/cypress/integration/swipe-to-go-back.js +++ b/packages/react-router/test-app/tests/e2e/specs/swipe-to-go-back.cy.js @@ -1,4 +1,5 @@ const port = 3000; +const IOS_MODE = 'ionic:mode=ios'; describe('Swipe To Go Back', () => { /* @@ -6,7 +7,7 @@ describe('Swipe To Go Back', () => { */ it('should swipe and abort', () => { - cy.visit(`http://localhost:${port}/swipe-to-go-back`); + cy.visit(`http://localhost:${port}/swipe-to-go-back?${IOS_MODE}`); cy.ionPageVisible('main'); cy.ionNav('ion-item', 'Details'); @@ -19,7 +20,7 @@ describe('Swipe To Go Back', () => { }); it('should swipe and go back', () => { - cy.visit(`http://localhost:${port}/swipe-to-go-back`); + cy.visit(`http://localhost:${port}/swipe-to-go-back?${IOS_MODE}`); cy.ionPageVisible('main'); cy.ionNav('ion-item', 'Details'); @@ -31,7 +32,7 @@ describe('Swipe To Go Back', () => { }); it('should swipe and abort within a tab', () => { - cy.visit(`http://localhost:${port}/tabs/tab1`); + cy.visit(`http://localhost:${port}/tabs/tab1?${IOS_MODE}`); cy.ionPageVisible('tab1'); cy.get('#child-one').click(); @@ -45,7 +46,7 @@ describe('Swipe To Go Back', () => { }); it('should swipe and go back within a tab', () => { - cy.visit(`http://localhost:${port}/tabs/tab1`); + cy.visit(`http://localhost:${port}/tabs/tab1?${IOS_MODE}`); cy.ionPageVisible('tab1'); cy.get('#child-one').click(); @@ -59,7 +60,7 @@ describe('Swipe To Go Back', () => { }); it('should swipe and go back to correct tab after switching tabs', () => { - cy.visit(`http://localhost:${port}`); + cy.visit(`http://localhost:${port}?${IOS_MODE}`); cy.ionPageVisible('home'); cy.get('#go-to-tabs').click(); @@ -90,7 +91,7 @@ describe('Swipe To Go Back', () => { }); it('should be able to swipe back from child tab page after visiting', () => { - cy.visit(`http://localhost:${port}/tabs/tab1`); + cy.visit(`http://localhost:${port}/tabs/tab1?${IOS_MODE}`); cy.ionPageVisible('tab1'); cy.get('#child-one').click(); @@ -122,7 +123,7 @@ describe('Swipe To Go Back', () => { }) it('should not swipe to go back to the same view you are on', () => { - cy.visit(`http://localhost:${port}`); + cy.visit(`http://localhost:${port}?${IOS_MODE}`); cy.ionPageVisible('home'); cy.ionSwipeToGoBack(false); @@ -130,7 +131,7 @@ describe('Swipe To Go Back', () => { }) it('should not hide a parameterized page when swiping and aborting', () => { - cy.visit(`http://localhost:${port}/params/0`); + cy.visit(`http://localhost:${port}/params/0?${IOS_MODE}`); cy.ionPageVisible('params-0'); cy.get('#next-page').click(); diff --git a/packages/react-router/test-app/cypress/integration/tab-context.js b/packages/react-router/test-app/tests/e2e/specs/tab-context.cy.js similarity index 100% rename from packages/react-router/test-app/cypress/integration/tab-context.js rename to packages/react-router/test-app/tests/e2e/specs/tab-context.cy.js diff --git a/packages/react-router/test-app/cypress/integration/tabs.js b/packages/react-router/test-app/tests/e2e/specs/tabs.cy.js similarity index 100% rename from packages/react-router/test-app/cypress/integration/tabs.js rename to packages/react-router/test-app/tests/e2e/specs/tabs.cy.js diff --git a/packages/react-router/test-app/cypress/support/commands.js b/packages/react-router/test-app/tests/e2e/support/commands.js similarity index 100% rename from packages/react-router/test-app/cypress/support/commands.js rename to packages/react-router/test-app/tests/e2e/support/commands.js diff --git a/packages/react-router/test-app/cypress/support/index.js b/packages/react-router/test-app/tests/e2e/support/index.js similarity index 100% rename from packages/react-router/test-app/cypress/support/index.js rename to packages/react-router/test-app/tests/e2e/support/index.js