/// context("Network Requests", () => { beforeEach(() => { cy.visit("https://example.cypress.io/commands/network-requests"); }); // Manage HTTP requests in your app 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); // the server sometimes gets an extra comment posted from another machine // which gets returned as 1 extra object expect(response.body).to.have.property("length").and.be.oneOf([500, 501]); 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.property("length").and.be.oneOf([500, 501]); 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({ title: "Cypress Test Runner" }); // we don't know the exact post id - only that it will be > 100 // since JSONPlaceholder has built-in 100 posts expect(response.body).property("id").to.be.a("number").and.to.be.gt(100); // 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.intercept() - route responses to matching requests", () => { // https://on.cypress.io/intercept let message = "whoa, this comment does not exist"; // Listen to GET to comments/1 cy.intercept("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("response.statusCode").should("be.oneOf", [200, 304]); // Listen to POST to comments cy.intercept("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(({ request, response }) => { expect(request.body).to.include("email"); expect(request.headers).to.have.property("content-type"); expect(response && response.body).to.have.property("name", "Using POST in cy.intercept()"); }); // Stub a response to PUT comments/ **** cy.intercept( { method: "PUT", url: "**/comments/*" }, { statusCode: 404, body: { error: message }, headers: { "access-control-allow-origin": "*" }, delayMs: 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); }); });