Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mock specific graphql request in cypress when running e2e tests

When running e2e tests with Cypress, my goal is to mock a specific graphql query.

Currently, I can mock all requests like this:

cy.server();
cy.route('POST', '/graphql', {
    data: {
        foo: 'bar'
    },
});

The problem is that this mocks all /graphql queries. It would be awesome if I somehow could say:

cy.route('POST', '/graphql', 'fooQuery', {
    data: {
        foo: 'bar'
    },
});

In our application, we are using Apollo Graphql - and thus all queries are named.

like image 674
DauleDK Avatar asked Dec 05 '19 10:12

DauleDK


3 Answers

With cypress 6.0 route and route2 are deprecated, suggesting the use of intercept. As written in the docs (https://docs.cypress.io/api/commands/intercept.html#Aliasing-individual-GraphQL-requests) you can mock the GraphQL requests in this way:

cy.intercept('POST', '/api', (req) => {
  if (req.body.operationName === 'operationName') {
    req.reply({ fixture: 'mockData.json'});
  }
}
like image 181
robmass Avatar answered Oct 06 '22 03:10

robmass


With cypress 5.1, using the new route2 command it is very simple to mock GraphQL requests, for example:

cy.route2('/graphql', (req) => {
  if(req.body.includes('operationName')){
    req.reply({ fixture: 'mockData.json'});
  }
});

I just added an if condition to evaluate if the body of the GraphQL request contains certain string as part of the query. If that is true, then I reply back with a custom body loaded from a fixture.

Documentation for cy.route2(): https://docs.cypress.io/api/commands/route2.html

like image 26
Antony Fuentes Avatar answered Oct 06 '22 05:10

Antony Fuentes


One way to go about it is to provide the mocked data for the graphql operations in question inside one fixture file

cypress/support/commands.js

Cypress.Commands.add('stubGraphQL', (graphQlFixture) => {
  cy.fixture(graphQlFixture).then((mockedData) => {
    cy.on('window:before:load', (win) => {
      function fetch(path, { body }) {
        const { operationName } = JSON.parse(body)
        return responseStub(mockedData[operationName])
      }
      cy.stub(win, 'fetch', fetch).withArgs("/graphql").as('graphql');
    });
  })
})


const responseStub = result => Promise.resolve({
  json: () => Promise.resolve(result),
  text: () => Promise.resolve(JSON.stringify(result)),
  ok: true,
})
//TODO how to get it to stop listening and trying to stub once the list of operations provided in fixture have been stubbed?

example fixture file cypress/fixtures/signInOperation.json (note that there are 2 operations in there and that's how you can specify which response to mock)

{
  "SIGNIN_MUTATION": {
    "data":{"signin":{"id":"ck896k87jac8w09343gs9bl5h","email":"[email protected]","name":"Sam","__typename":"User"}}
  },
  "CURRENT_USER_QUERY" : {
    "data":{"me":{"id":"ck896k87jac8w09343gs9bl5h","email":"[email protected]","name":"!!Sam's Mock","permissions":["USER"],"cart":[{"id":"ck89gebgvse9w0981bhh4a147","quantity":5,"item":{"id":"ck896py6sacox0934lqc8c4bx","price":62022,"image":"https://res.cloudinary.com/deadrobot/image/upload/v1585253000/sickfitz/ecgqu4i1wgcj41pdlbty.jpg","title":"MensShoes","description":"Men's Shoes","__typename":"Item"},"__typename":"CartItem"},{"id":"ck89gec6mb3ei0934lmyxne52","quantity":5,"item":{"id":"ck896os7oacl90934xczopgfa","price":70052,"image":"https://res.cloudinary.com/deadrobot/image/upload/v1585252932/sickfitz/i7ac6fqhsebxpmnyd2ui.jpg","title":"WomensShoes2","description":"Women's Shoes","__typename":"Item"},"__typename":"CartItem"},{"id":"ck89gl45psely0981b2bvk6q5","quantity":7,"item":{"id":"ck89ghqkpb3ng0934l67rzjxk","price":100000,"image":"https://res.cloudinary.com/deadrobot/image/upload/v1585269417/sickfitz/eecjz883y7ucshlwvsbw.jpg","title":"watch","description":"Fancy Watch","__typename":"Item"},"__typename":"CartItem"}],"__typename":"User"}}
  }
}

in your spec file

cy.stubGraphQL('signInOperation.json')
cy.visit(yourURL)
cy.get(loginButton).click()
like image 44
HRVHackers Avatar answered Oct 06 '22 04:10

HRVHackers