166 lines
6.1 KiB
JavaScript
166 lines
6.1 KiB
JavaScript
/// <reference types="cypress" />
|
|
|
|
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);
|
|
});
|
|
});
|