How to use hasJsonContentType method in Cypress

Best JavaScript code snippet using cypress

validateBody.js

Source: validateBody.js Github

copy

Full Screen

1const mediaTyper = require('media-typer');2const contentTypeUtils = require('content-type');3const { isValidField } = require('./​isValid');4const { TextDiff, JsonExample, JsonSchemaValidator } = require('../​validators');5const isset = require('../​utils/​isset');6const parseJson = require('../​utils/​parseJson');7function isPlainText(mediaType) {8 return mediaType.type === 'text' && mediaType.subtype === 'plain';9}10function isJson(mediaType) {11 if (!mediaType) {12 return false;13 }14 return (15 (mediaType.type === 'application' && mediaType.subtype === 'json') ||16 mediaType.suffix === 'json'17 );18}19function isJsonSchema(mediaType) {20 if (!mediaType) {21 return false;22 }23 return (24 mediaType.type === 'application' &&25 mediaType.subtype === 'schema' &&26 mediaType.suffix === 'json'27 );28}29/​**30 * Parses a given content-type header into media type.31 * @param {string} contentType32 * @returns {[Error, MediaType]}33 */​34function parseContentType(contentType) {35 try {36 const { type } = contentTypeUtils.parse(`${contentType}`);37 return mediaTyper.parse(type);38 } catch (error) {39 return null;40 }41}42/​**43 * Determines if a given 'Content-Type' header contains JSON.44 * @param {string} contentType45 * @returns {boolean}46 */​47function isJsonContentType(contentType) {48 const mediaType = parseContentType(contentType);49 return mediaType ? isJson(mediaType) : false;50}51/​**52 * Returns a tuple of error and body media type based53 * on the given body and normalized headers.54 * @param {string} body55 * @param {string} contentType56 * @param {'actual'|'expected'} httpMessageOrigin57 * @returns {[string, MediaType]}58 */​59function getBodyType(body, contentType, httpMessageOrigin) {60 const hasJsonContentType = isJsonContentType(contentType);61 try {62 parseJson(body);63 const bodyMediaType = parseContentType(64 hasJsonContentType ? contentType : 'application/​json'65 );66 return [null, bodyMediaType];67 } catch (parsingError) {68 const fallbackMediaType = mediaTyper.parse('text/​plain');69 const error = hasJsonContentType70 ? `Can't validate: ${httpMessageOrigin} body 'Content-Type' header is '${contentType}' \71but body is not a parseable JSON:72${parsingError.message}`73 : null;74 return [error, fallbackMediaType];75 }76}77/​**78 * Returns a tuple of error and schema media type79 * based on given body schema.80 * @param {string} bodySchema81 * @returns {[string, string]}82 */​83function getBodySchemaType(bodySchema) {84 const jsonSchemaType = mediaTyper.parse('application/​schema+json');85 if (typeof bodySchema !== 'string') {86 return [null, jsonSchemaType];87 }88 try {89 parseJson(bodySchema);90 return [null, jsonSchemaType];91 } catch (error) {92 /​/​ Gavel must throw when given malformed JSON Schema.93 /​/​ See https:/​/​github.com/​apiaryio/​gavel.js/​issues/​20394 throw new Error(`\95Failed to validate HTTP message "body": given JSON Schema is not a valid JSON.96${error.message}\97`);98 }99}100/​**101 * Returns a body validator class based on the given102 * actual and expected body media types.103 * @param {MediaType} expectedType104 * @param {MediaType} actualType105 * @returns {Validator}106 */​107function getBodyValidator(expectedType, actualType) {108 const both = (predicate) => (expected, actual) => {109 return [expected, actual].every(predicate);110 };111 const validators = [112 [TextDiff, both(isPlainText), 'text'],113 /​/​ List JsonSchema first, because weak predicate of JsonExample114 /​/​ would resolve on "application/​schema+json" media type too.115 [116 JsonSchemaValidator,117 (expected, actual) => {118 return isJson(actual) && isJsonSchema(expected);119 },120 'json'121 ],122 [JsonExample, both(isJson), 'json']123 ];124 const validator = validators.find(([_name, predicate]) => {125 return predicate(expectedType, actualType);126 });127 if (!validator) {128 const error = `Can't validate actual media type '${mediaTyper.format(129 actualType130 )}' against the expected media type '${mediaTyper.format(expectedType)}'.`;131 return [error, null, null];132 }133 return [null, validator[0], validator[2]];134}135/​**136 * Validates given bodies of transaction elements.137 * @param {Object<string, any>} expected138 * @param {Object<string, any>} actual139 */​140function validateBody(expected, actual) {141 const values = {142 actual: actual.body143 };144 /​/​ Prevent assigning { expected: undefined }.145 /​/​ Also ignore "bodySchema" as the expected value.146 if (isset(expected.body)) {147 values.expected = expected.body;148 }149 const errors = [];150 const actualBodyType = typeof actual.body;151 const hasEmptyActualBody = actual.body === '';152 /​/​ Throw when user input for actual body is not a string.153 if (actualBodyType !== 'string') {154 throw new Error(155 `Expected HTTP body to be a string, but got: ${actualBodyType}`156 );157 }158 const [actualTypeError, actualType] = getBodyType(159 actual.body,160 actual.headers && actual.headers['content-type'],161 'actual'162 );163 const [expectedTypeError, expectedType] = expected.bodySchema164 ? getBodySchemaType(expected.bodySchema)165 : getBodyType(166 expected.body,167 expected.headers && expected.headers['content-type'],168 'expected'169 );170 if (actualTypeError) {171 errors.push({172 message: actualTypeError173 });174 }175 if (expectedTypeError) {176 errors.push({177 message: expectedTypeError178 });179 }180 const hasErrors = errors.length > 0;181 /​/​ Skipping body validation in case errors during182 /​/​ actual/​expected body type definition.183 const [validatorError, ValidatorClass, kind] = hasErrors184 ? [null, null, null]185 : getBodyValidator(expectedType, actualType);186 if (validatorError) {187 /​/​ In case determined media types mismtach, check if the actual is not missing.188 /​/​ Keep in mind the following scenarios:189 /​/​ 1. Expected '', and got '' (TextDiff/​TextDiff, valid)190 /​/​ 2. Expected {...}, but got '' (Json/​TextDiff, invalid, produces "missing actual body" error)191 /​/​ 3. Expected {...}, but got "foo" (Json/​TextDiff, invalid, produces types mismatch error).192 if (expected.body !== '' && hasEmptyActualBody) {193 errors.push({194 message: `Expected "body" of "${mediaTyper.format(195 expectedType196 )}" media type, but actual "body" is missing.`197 });198 } else {199 errors.push({200 message: validatorError201 });202 }203 }204 const usesJsonSchema =205 ValidatorClass && ValidatorClass.name === 'JsonSchemaValidator';206 const validator =207 ValidatorClass &&208 new ValidatorClass(usesJsonSchema ? expected.bodySchema : expected.body);209 const validationErrors = validator ? validator.validate(actual.body) : [];210 errors.push(...validationErrors);211 return {212 valid: isValidField({ errors }),213 kind,214 values,215 errors216 };217}218module.exports = {219 validateBody,220 isJson,221 isJsonSchema,222 isJsonContentType,223 parseContentType,224 getBodyType,225 getBodySchemaType,226 getBodyValidator...

Full Screen

Full Screen

transformers.js

Source: transformers.js Github

copy

Full Screen

1const logTags = require('../​logTags');2const pick = require('lodash/​pick');3const pickBy = require('lodash/​pickBy');4const mapValues = require('lodash/​mapValues');5const isObject = require('lodash/​isObject');6const url = require('url');7const isHealth = require('./​isHealth');8const { extractHeaders, truncateText } = require('../​utils');9const mapValuesDeep = (v, callback) => (isObject(v) ? mapValues(v, v => mapValuesDeep(v, callback)) : callback(v));10const truncateTextWithLength = length => v =>11 (typeof v === 'string' && truncateText(v, length, '[Trimmed by riviere]')) || v;12const mapError = ({ ctx, err }) => {13 err.action = `${ctx.logCtx.method}${ctx.request.path}`;14 err.params = {15 query: ctx.request.query,16 body: ctx.request.body,17 log_tag: logTags.CATEGORY.UNEXPECTED_ERROR.TAG18 };19 err.context = Object.assign(err.context || {}, ctx.logCtx);20 return err;21};22const mapInReq = ({ ctx, health, bodyKeys, bodyKeysRegex, headersRegex, maxBodyValueChars }) => {23 if (isHealth(ctx, health)) {24 return Object.assign({}, ctx.logCtx, {25 log_tag: logTags.CATEGORY.INBOUND_REQUEST_HEALTH.TAG26 });27 }28 const meta = extractRequestMeta(ctx, bodyKeys, bodyKeysRegex, maxBodyValueChars, headersRegex);29 let userAgent = getUserAgent(ctx.headers);30 return Object.assign({}, ctx.logCtx, meta, {31 log_tag: logTags.CATEGORY.INBOUND_REQUEST.TAG,32 userAgent33 });34};35const mapInRes = (res, req, startedAt, reqId) => {36 const duration = new Date().getTime() - startedAt;37 const status = res.statusCode;38 let contentLength = getContentLength(res.headers);39 let userAgent = getUserAgent(res.headers);40 return {41 ...pick(req, ['method', 'protocol', 'host', 'path', 'query', 'href']),42 status,43 duration,44 requestId: reqId,45 contentLength,46 userAgent,47 log_tag: logTags.CATEGORY.INBOUND_RESPONSE.TAG48 };49};50const mapOutReq = (requestOptions, reqId, opts = {}) => {51 const method = requestOptions.method;52 const port = requestOptions.port;53 const requestId = reqId;54 const headersRegex = opts.headersRegex;55 const { protocol, host, path, query, href } = getUrlParameters(requestOptions);56 const { maxQueryChars, maxPathChars, maxHrefChars } = opts;57 const slicedQuery = truncateText(query, maxQueryChars);58 const slicedPath = truncateText(path, maxPathChars);59 const slicedHref = truncateText(href, maxHrefChars);60 const metaHeaders = extractHeaders(headersRegex, requestOptions.headers);61 let metaBody = {};62 const hasJsonContentType =63 requestOptions.headers &&64 ((requestOptions.headers['Content-type'] && requestOptions.headers['Content-type'].includes('application/​json')) ||65 (requestOptions.headers['content-type'] && requestOptions.headers['content-type'].includes('application/​json')) ||66 (requestOptions.headers['Content-Type'] && requestOptions.headers['Content-Type'].includes('application/​json')));67 const isProperMethod = method === 'POST' || method === 'PUT' || method === 'PATCH';68 const isValidToExtractBody =69 isProperMethod && requestOptions.body && hasJsonContentType && (opts.bodyKeys || opts.bodyKeysRegex);70 if (isValidToExtractBody) {71 try {72 const jsonObject = JSON.parse(requestOptions.body);73 let picked = opts.maxBodyValueChars74 ? mapValuesDeep(jsonObject, truncateTextWithLength(opts.maxBodyValueChars))75 : jsonObject;76 if (opts.bodyKeysRegex) {77 const REGEX = opts.bodyKeysRegex;78 picked = pickBy(picked, (_, key) => REGEX.test(key));79 } else {80 picked = pick(picked, opts.bodyKeys);81 }82 if (Object.keys(picked).length) {83 metaBody = { body: picked };84 }85 } catch (e) {}86 }87 let contentLength = getContentLength(requestOptions.headers);88 return {89 metaHeaders,90 method,91 protocol,92 host,93 port,94 metaBody,95 path: slicedPath,96 query: slicedQuery,97 href: slicedHref,98 requestId,99 contentLength,100 log_tag: logTags.CATEGORY.OUTBOUND_REQUEST.TAG101 };102};103const mapOutRes = ({ ctx, health, bodyKeys, bodyKeysRegex, headersRegex, maxBodyValueChars }) => {104 const status = ctx.status;105 const duration = new Date().getTime() - ctx.state.riviereStartedAt;106 const headers = extractHeaders(headersRegex, ctx.response.headers);107 if (isHealth(ctx, health)) {108 return Object.assign({}, ctx.logCtx, {109 log_tag: logTags.CATEGORY.OUTBOUND_RESPONSE_HEALTH.TAG,110 status,111 duration112 });113 }114 const meta = extractRequestMeta(ctx, bodyKeys, bodyKeysRegex, maxBodyValueChars, headersRegex, 'request');115 let contentLength = ctx.state.calculatedContentLength || 0;116 let userAgent = getUserAgent(ctx.headers);117 return Object.assign({ status, duration, headers }, ctx.logCtx, meta, {118 log_tag: logTags.CATEGORY.OUTBOUND_RESPONSE.TAG,119 contentLength,120 userAgent121 });122};123function extractRequestMeta(ctx, bodyKeys, bodyKeysRegex, maxBodyValueChars, headersRegex, prefix = '') {124 const method = ctx.request.method;125 /​/​ pick headers126 const metaHeaders = extractHeaders(headersRegex, ctx.request.headers, prefix);127 /​/​ pick body128 let metaBody;129 const isProperMethod = method === 'POST' || method === 'PUT' || method === 'PATCH';130 if (isProperMethod && (bodyKeys || bodyKeysRegex) && typeof ctx.request.body === 'object') {131 let picked = maxBodyValueChars132 ? mapValuesDeep(ctx.request.body, truncateTextWithLength(maxBodyValueChars))133 : ctx.request.body;134 if (bodyKeysRegex) {135 const REGEX = bodyKeysRegex;136 picked = pickBy(picked, (_, key) => REGEX.test(key));137 } else {138 picked = pick(picked, bodyKeys);139 }140 if (Object.keys(picked).length) {141 if (prefix) {142 metaBody = { [prefix]: { body: picked } };143 } else {144 metaBody = { body: picked };145 }146 }147 }148 const meta = {};149 if (metaHeaders && Object.keys(metaHeaders).length) {150 meta.metaHeaders = metaHeaders;151 }152 if (metaBody) {153 meta.metaBody = metaBody;154 }155 return meta;156}157const getContentLength = headers => {158 if (!headers) return 0;159 return headers['content-length'] || headers['Content-length'] || headers['Content-Length'] || 0;160};161const getUserAgent = headers => {162 if (!headers) return '';163 return headers['user-agent'] || headers['User-agent'] || headers['User-Agent'] || '';164};165const getUrlParameters = requestOptions => {166 const usedOptions = requestOptions.uri || requestOptions;167 let protocol = usedOptions.protocol;168 protocol = protocol && protocol.substring(0, protocol.length - 1);169 const host = usedOptions.hostname || usedOptions.host;170 const path = usedOptions.path || usedOptions.pathname;171 const query = usedOptions.query;172 const href = url.format(usedOptions);173 return { protocol, host, path, query, href };174};175module.exports = {176 mapError,177 mapInReq,178 mapInRes,179 mapOutReq,180 mapOutRes...

Full Screen

Full Screen

broker.js

Source: broker.js Github

copy

Full Screen

1import Cookie from "../​cookie";2import { dateToApi, isDate } from "lib/​support/​dates";3import dayjs from "dayjs";4export function getCsrfToken() {5 return decodeURIComponent(Cookie.get("XSRF-TOKEN"));6}7/​**8 * @param {Object} headers9 * @returns {{Accept: string, 'X-XSRF-TOKEN': string}}10 */​11function baseHeaders(headers = {}) {12 return {13 "X-XSRF-TOKEN": getCsrfToken(),14 Accept: "application/​json",15 "Content-Type": "application/​json",16 ...headers,17 };18}19/​**20 * @param {String} url21 * @param {"GET"|"POST"|"PUT"|"PATCH"|"DELETE"} method22 * @param {Object} params - Data sent as url parameters23 * @param {Object} config - Data sent in the body24 * @returns {Promise<unknown>}25 */​26function apiRequest(url, method = "GET", params = null, config = {}) {27 const prefix = url.startsWith("/​") ? "/​api" : "/​api/​";28 const requestConfig = {};29 const requestUrl = new URL(prefix + url, document.location.href);30 const headers = baseHeaders(config?.headers || {});31 const hasParams = Boolean(params);32 const hasJsonContentType = headers["Content-Type"] === "application/​json";33 requestConfig.method = method;34 requestConfig.headers = headers;35 /​/​ Parameters as url on GET method36 if (hasParams && typeof params === "object" && method === "GET") {37 Object.entries(params).forEach(([key, value]) => {38 requestUrl.searchParams.set(key, value.toString());39 });40 } else if (hasParams) {41 requestConfig.body = hasJsonContentType ? JSON.stringify(params) : params;42 }43 /​/​ The browser handle the correct content type44 /​/​ for us when handling complicated multi-part form data.45 if (hasParams && params instanceof FormData) {46 delete requestConfig.headers["Content-Type"];47 }48 return new Promise((resolve, reject) => {49 fetch(requestUrl.href, requestConfig)50 .then((res) => handleRequestResponse(res, resolve, reject))51 .catch((err) => handeRequestError(err, resolve, reject));52 });53}54/​**55 * @param {Response} response56 */​57function isResponseJsonParsable(response) {58 if (response.status === 204) {59 return false;60 }61 return response.headers.get("Content-Type") === "application/​json";62}63/​**64 * @param {Response} response65 * @param {Function} resolve66 * @param {Function} reject67 */​68function handleRequestResponse(response, resolve, reject) {69 if (!response.ok) {70 response71 .json()72 .then((data) => reject(data, response))73 .catch(reject);74 return;75 }76 /​/​ Handle json compatible responses77 if (isResponseJsonParsable(response)) {78 response79 .json()80 .then((data) => resolve(data, response))81 .catch(reject);82 return;83 }84 resolve(null, response);85}86/​**87 * @param {Object} error88 * @param {Function} resolve89 * @param {Function} reject90 */​91function handeRequestError(error, resolve, reject) {92 console.error(error);93 reject(error);94}95function requestCsrfToken() {96 console.info("[Auth] Requesting token");97 return new Promise((resolve, reject) => {98 fetch("/​sanctum/​csrf-cookie")99 .then((res) => handleRequestResponse(res, resolve, reject))100 .catch((err) => handeRequestError(err, resolve, reject));101 });102}103/​**104 * Convert any empty value to an empty string.105 *106 * @param {Object} data107 * @returns {Object}108 */​109export function formatEmptyValue(data) {110 return Object.fromEntries(Object.entries(data).map(([k, v]) => [k, v || ""]));111}112/​**113 * Format any date object of the given object.114 *115 * @param {Object} data116 * @returns {Object}117 */​118export function formatDatesValues(data) {119 return Object.fromEntries(120 Object.entries(data).map(([k, v]) => [k, isDate(v) || dayjs.isDayjs(v) ? dateToApi(v) : v])121 );122}123export function formatObjectValues(data) {124 function objectToArrayFields(obj, prefix) {125 const fields = {};126 Object.entries(obj).forEach(([k, v]) => {127 const key = `${prefix}[${k}]`;128 const value = v || "";129 if (value instanceof File) {130 fields[key] = value;131 } else if (dayjs.isDayjs(value)) {132 fields[key] = dateToApi(value.toDate());133 } else if (value instanceof Date) {134 fields[key] = dateToApi(value);135 } else if (typeof value === "object") {136 Object.assign(fields, objectToArrayFields(value, key));137 } else {138 fields[key] = value;139 }140 });141 return fields;142 }143 const fieldsToAppend = {};144 const fieldToFilters = [];145 Object.entries(data).forEach(([k, v]) => {146 if (typeof v !== "object" || v instanceof File) {147 return v || "";148 }149 fieldToFilters.push(k);150 Object.assign(fieldsToAppend, objectToArrayFields(v, k));151 });152 const filteredFields = Object.fromEntries(Object.entries(data).filter(([k]) => !fieldToFilters.includes(k)));153 return Object.assign({}, filteredFields, fieldsToAppend);154}155/​**156 * Format singles files value by only keeping the origin File157 * to upload, and remove key/​value pair when the field has not158 * been changed, and should not be processed by the backend.159 *160 * @param {Object} data161 * @param {String[]} fields162 * @returns {Object}163 */​164export function formatAndFilterSingleFilesValues(data, fields) {165 const filteredData = Object.entries(data).filter(([name, value]) => {166 if (!fields.includes(name)) {167 return true;168 }169 if (!Array.isArray(value)) {170 return false;171 }172 /​/​ Remove the fields if not changed (not a new File object).173 return value[0]?.originFileObj;174 });175 /​/​noinspection JSCheckFunctionSignatures176 return Object.fromEntries(177 filteredData.map(([name, value]) => {178 if (!fields.includes(name)) {179 return [name, value];180 }181 /​/​ The file need to be cleared182 if (!Array.isArray(value) || value.length === 0) {183 return [name, ""];184 }185 /​/​ New file has to be uploaded186 return [name, value[0].originFileObj];187 })188 );189}190const Api = {191 get: (url, data = null, config = {}) => apiRequest(url, "GET", data, config),192 post: (url, data = null, config = {}) => apiRequest(url, "POST", data, config),193 postMultipart: (url, data = null, config = {}) => {194 const mergedConfigs = { ...config, headers: { "Content-Type": "multipart/​form-data", ...config.headers } };195 return apiRequest(url, "POST", data, mergedConfigs);196 },197 put: (url, data = null, config = {}) => apiRequest(url, "PUT", data, config),198 patch: (url, data = null, config = {}) => apiRequest(url, "PATCH", data, config),199 delete: (url, data = null, config = {}) => apiRequest(url, "DELETE", data, config),200 requestToken: requestCsrfToken,201 request: apiRequest,202};...

Full Screen

Full Screen

server.test.js

Source: server.test.js Github

copy

Full Screen

...29 const res = await mockDbMethod(brokenTodo);30 expect(res.statusCode).toBe(400);31 }32}33function hasJsonContentType(response) {34 expect(response.headers["content-type"]).toEqual(35 expect.stringContaining("json")36 );37}38describe("server", () => {39 beforeEach(() => jest.clearAllMocks());40 it("exists", () => {41 expect(typeof makeApp).toBe("function");42 expect(typeof app).toBe("function");43 });44 describe("GET /​todos - list todos", () => {45 it("returns status 200", async () => {46 const res = await supertest(app).get("/​todos");47 expect(res.statusCode).toBe(200);48 });49 it("returns content-type json", async () => {50 listTodos.mockResolvedValue([]);51 const res = await supertest(app).get("/​todos");52 hasJsonContentType(res);53 });54 it("returns an array of todos", async () => {55 listTodos.mockResolvedValue([]);56 const res = await supertest(app).get("/​todos");57 expect(Array.isArray(res.body)).toBe(true);58 expect(listTodos).toHaveBeenCalledTimes(1);59 });60 });61 describe("POST /​todos - add todo", () => {62 let todo = { task: "buy milk" };63 async function doAddTodo(returnId = 1, newTodo = todo) {64 addTodo.mockResolvedValue({ id: returnId });65 return await supertest(app)66 .post("/​todos")67 .set("Accept", "application/​json")68 .send(newTodo);69 }70 it("returns content-type json", async () =>71 hasJsonContentType(await doAddTodo()));72 it("return 201 status code", async () => {73 const res = await doAddTodo();74 expect(res.statusCode).toBe(201);75 });76 77 it("return the id of the newly added todo", async () => {78 const randomId = Math.floor(Math.random() * 100) + 1;79 const res = await doAddTodo(randomId);80 expect(res.body).toEqual({ id: randomId });81 expect(addTodo).toHaveBeenCalledTimes(1);82 expect(addTodo.mock.calls[0][0]).toEqual(todo);83 });84 it('returns 400 if todo is not an object with a single key "task" or has a task with an empty string', async () => {85 let todoMissingKey = {};86 let res;87 res = await doAddTodo(1, todoMissingKey);88 expect(res.statusCode).toBe(400);89 let todoWithExtraKeys = { task: "buy milk", done: false };90 res = await doAddTodo(1, todoWithExtraKeys);91 expect(res.statusCode).toBe(400);92 let todoWithEmptyTask = { task: "" };93 res = await doAddTodo(1, todoWithEmptyTask);94 expect(res.statusCode).toBe(400);95 let todoWithNonStringTask = { task: {} };96 res = await doAddTodo(1, todoWithNonStringTask);97 expect(res.statusCode).toBe(400);98 });99 });100 describe("PUT /​todos - edit todo", () => {101 let todo = { id: 1, task: "buy milk", done: false };102 async function doEditTodo(updatedTodo) {103 editTodo.mockResolvedValue({ status: "ok" });104 return await supertest(app)105 .put("/​todos")106 .set("Accept", "application/​json")107 .send(updatedTodo);108 }109 it("returns content-type json", async () =>110 hasJsonContentType(await doEditTodo()));111 it("returns status 200", async () => {112 const res = await doEditTodo(todo);113 expect(res.statusCode).toBe(200);114 });115 it('returns {status: "ok"} on success', async () => {116 const updatedTodo = { ...todo, done: true };117 const res = await doEditTodo(updatedTodo);118 expect(res.body).toEqual({ status: "ok" });119 expect(editTodo).toHaveBeenCalledTimes(1);120 expect(editTodo.mock.calls[0][0]).toEqual(updatedTodo);121 });122 it("returns status 400 if object shape is not: {id: int, task: str, done: bool}", async () => {123 await testBrokenTodos(doEditTodo);124 });125 });126 describe("DELETE /​todos - delete todo", () => {127 let todo = { id: 1, task: "buy milk", done: true };128 async function doDeleteTodo(todoToDelete) {129 deleteTodo.mockResolvedValue({ status: "ok" });130 return await supertest(app)131 .delete("/​todos")132 .set("Accept", "application/​json")133 .send(todoToDelete);134 }135 it("returns content-type json", async () =>136 hasJsonContentType(await doDeleteTodo(todo)));137 it("returns status 200", async () => {138 const res = await doDeleteTodo(todo);139 expect(res.statusCode).toBe(200);140 });141 it('returns {status: "ok"} on success', async () => {142 const todoToDelete = { ...todo, done: true };143 const res = await doDeleteTodo(todoToDelete);144 expect(res.body).toEqual({ status: "ok" });145 expect(deleteTodo).toHaveBeenCalledTimes(1);146 expect(deleteTodo.mock.calls[0][0]).toEqual(todoToDelete);147 });148 it("returns status 400 if object shape is not: {id: int, task: str, done: bool}", async () => {149 await testBrokenTodos(doDeleteTodo);150 });...

Full Screen

Full Screen

router.js

Source: router.js Github

copy

Full Screen

1const HttpError = require('./​HttpError');2function transformBody(body, type) {3 if (type === 'json') {4 return JSON.stringify(body);5 }6 return body;7}8function transformContentType(type) {9 if (type === 'json') {10 return `application/​json`;11 }12 if (type === 'xml') {13 return `application/​xml`;14 }15 return '';16}17function router(app) {18 async function onRequest(event, context, callback) {19 const {20 path,21 httpMethod: method,22 requestContext: {23 identity: {24 sourceIp,25 userAgent,26 },27 },28 } = event;29 const match = app.match(method, path);30 const requestStart = Date.now();31 function log(statusCode) {32 console.log(`method=${method} path=${path} status=${statusCode} duration=${Date.now() - requestStart}ms ip=${sourceIp} agent=${userAgent}`);33 }34 const success = (body = {}, statusCode = 200, type = 'json') => {35 log(statusCode);36 return ({37 statusCode: statusCode || 200,38 body: transformBody(body, type),39 headers: {40 'Access-Control-Allow-Origin': '*',41 'Access-Control-Allow-Credentials': true,42 'Content-Type': transformContentType(type),43 },44 });45 };46 const failed = (error = new HttpError('Server encountered an error.'), statusCode = 500) => {47 log(statusCode);48 return ({49 statusCode: statusCode || 500,50 body: JSON.stringify({ error: { message: `${error._httpSafe ? error.message : 'Server encountered an error.'}` } }),51 headers: {52 'Access-Control-Allow-Origin': '*',53 'Access-Control-Allow-Credentials': true,54 },55 });56 };57 if (! match) {58 const error = new Error('This resource does not exist.');59 error._httpSafe = true;60 return callback(null, failed(error, 404));61 }62 const [hits, routeHandler] = match;63 const { body = null, headers = {} } = event;64 let json = null;65 const lowercaseHeaders = Object.keys(headers)66 .reduce((acc, key) => ({67 ...acc,68 [key.toLowerCase()]: headers[key].toLowerCase(),69 }), {});70 const hasJsonContentType = lowercaseHeaders['content-type'] === 'application/​json';71 if (hasJsonContentType && body && ['post', 'put'].includes(method.toLowerCase())) {72 try {73 json = JSON.parse(body);74 } catch(error) {75 return callback(null, failed('Malformed json body.', 400));76 }77 }78 try {79 const [path, ...params] = hits;80 const response = await routeHandler({81 event, context, callback,82 success, failed,83 path, params, json,84 });85 if (! response) {86 return callback(null, failed());87 }88 return callback(null, response);89 } catch (error) {90 console.error(error);91 return callback(null, failed(error));92 }93 }94 return onRequest;95}...

Full Screen

Full Screen

json.js

Source: json.js Github

copy

Full Screen

...21 }22 if (!hasGzipContentEncoding(req)) {23 return next();24 }25 if (!hasJsonContentType(req)) {26 return next();27 }28 req._body = true;29 var data = [];30 req.on("data", function(chunk) {31 data.push(new Buffer(chunk));32 });33 34 req.on("end", function() {35 buffer = Buffer.concat(data);36 zlib.gunzip(buffer, function(err, result) {37 if (err) {38 err.body = result;39 err.status = 400;...

Full Screen

Full Screen

fetchAsync.js

Source: fetchAsync.js Github

copy

Full Screen

...7 const protohost = protocol + '/​/​' + host;8 const locRegex = new RegExp(protohost, 'i');9 return locRegex.test(url) ? url : protohost + url;10}11function hasJsonContentType(response) {12 const contentType = response.headers.get('content-type');13 return (14 contentType &&15 (contentType.includes('application/​json') ||16 contentType.includes('text/​plain'))17 );18}19export async function fetchAsync(20 url,21 option = { method: 'GET', body: undefined }22) {23 const { method, body } = option;24 try {25 const response = await fetch(fixURL(url), {26 method: method,27 headers: {28 'Content-Type': 'application/​json',29 },30 body: JSON.stringify(body),31 });32 const jsonObj = hasJsonContentType(response) ? await response.json() : null;33 /​/​ console.log('jsonobj: ', jsonObj);34 return jsonObj;35 } catch (err) {36 console.error('fetchAsync: ', err.message);37 return null;38 }39}...

Full Screen

Full Screen

jsonrequest.js

Source: jsonrequest.js Github

copy

Full Screen

1'use strict';2module.exports = {3 processRequest: function(req) {4 var5 contentType = req.header('Content-Type'),6 hasJsonContentType = contentType &&7 contentType.indexOf('application/​json') !== -1;8 if (contentType != null && !hasJsonContentType) {9 return;10 }11 if (req.body) {12 if (!contentType) {13 req.header('Content-Type', 'application/​json');14 }15 req.body = JSON.stringify(req.body);16 }17 }...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1describe('My First Test', function() {2 it('Does not do much!', function() {3 cy.contains('type').click()4 cy.url().should('include', '/​commands/​actions')5 cy.get('.action-email')6 .type('

Full Screen

Using AI Code Generation

copy

Full Screen

1describe('My First Test', function() {2 it('Does not do much!', function() {3 cy.contains('type').click()4 cy.url().should('include', '/​commands/​actions')5 cy.get('.action-email')6 .type('

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.hasJsonContentType()2cy.hasJsonContentType()3cy.hasJsonContentType()4cy.hasJsonContentType()5Cypress.Commands.add('hasJsonContentType', () => {6 cy.get('@response').its('headers').its('content-type').should('include', 'application/​json')7})8describe('Test', () => {9 it('should test', () => {10 cy.request('/​api/​users').as('response')11 cy.hasJsonContentType()12 })13})

Full Screen

Using AI Code Generation

copy

Full Screen

1describe('hasJsonContentType', () => {2 it('should have json content type', () => {3 .its('headers')4 .its('content-type')5 .should('include', 'application/​json')6 })7})8Cypress.Commands.add('hasJsonContentType', () => {9 .its('headers')10 .its('content-type')11 .should('include', 'application/​json')12})13import './​commands'14describe('hasJsonContentType', () => {15 it('should have json content type', () => {16 cy.hasJsonContentType()17 })18})19Cypress.Commands.add('hasJsonContentType', () => {20 .its('headers')21 .its('content-type')22 .should('include', 'application/​json')23})24import './​commands'25describe('hasJsonContentType', () => {26 it('should have json content type', () => {27 cy.hasJsonContentType()28 })29})30Cypress.Commands.add('hasJsonContentType', () => {31 .its('headers')32 .its('content-type')33 .should('include', 'application/​json')34})35import './​commands'36describe('hasJsonContentType', () => {37 it('should have json content type', () => {

Full Screen

Using AI Code Generation

copy

Full Screen

1import { hasJsonContentType } from 'cypress/​types/​jquery';2describe('Test', () => {3 it('Test', () => {4 cy.request({5 }).then((response) => {6 expect(response.status).to.eq(405);7 expect(response).to.have.property('headers');8 expect(response.headers).to.have.property('content-type');9 hasJsonContentType(response.headers['content-type']);10 });11 });12});13CypressError: Timed out retrying: expected 'text/​html; charset=UTF-8' to have a JSON content type14import { hasJsonContentType } from 'cypress/​types/​jquery';15describe('Test', () => {16 it('Test', () => {17 cy.request({18 }).then((response) => {19 expect(response.status).to.eq(405);20 expect(response).to.have.property('headers');21 expect(response.headers).to.have.property('content-type');22 hasJsonContentType(response.headers['content-type']);23 });24 });25});26Expected response to have JSON content type but it was "text/​html; charset=UTF-8"27Expected response to NOT have JSON content type but it was "text/​html; charset=UTF-8"28import { hasJsonContentType } from 'cypress/​types/​jquery';29describe('Test', () => {30 it('Test', () => {31 cy.request({32 }).then((response) => {33 expect(response.status).to

Full Screen

Using AI Code Generation

copy

Full Screen

1it('should have json content type', () => {2 expect(response).to.have.jsonContentType3 })4})5Cypress.Commands.add('hasJsonContentType', (response) => {6 expect(response.headers['content-type']).to.include('application/​json')7})8import './​commands'9{10}11 1 passing (1s)

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.hasJsonContentType();2cy.hasJsonContentType();3Cypress.Commands.add('hasJsonContentType', function() {4 .should((response) => {5 expect(response.headers['content-type']).to.include('application/​json')6 })7});8describe('Test', () => {9 it('Test', () => {10 cy.hasJsonContentType();11 cy.hasJsonContentType();12 });13});14describe('Test', () => {15 beforeEach(() => {16 cy.hasJsonContentType();17 });18 it('Test', () => {19 cy.hasJsonContentType();20 });21 it('Test', () => {22 cy.hasJsonContentType();23 });24});25describe('Test', () => {26 before(() => {27 cy.hasJsonContentType();28 });29 it('Test', () => {30 cy.hasJsonContentType();31 });32 it('Test', () => {33 cy.hasJsonContentType();34 });35});36describe('Test', () => {37 it('Test', () => {38 cy.hasJsonContentType();39 });40});41describe('Test', () => {42 it('Test', () => {43 cy.hasJsonContentType();44 });45 it('Test', () => {46 cy.hasJsonContentType();47 });48});49describe('Test', () => {50 it('Test', () => {

Full Screen

Using AI Code Generation

copy

Full Screen

1describe("Test", () => {2 it("should be true", () => {3 cy.request({4 headers: {5 "Content-Type": "application/​json; charset=utf-8"6 },7 body: {8 }9 }).then(res => {10 expect(res.hasJsonContentType).to.be.true;11 });12 });13});14describe("Test", () => {15 it("should be true", () => {16 cy.request({17 headers: {18 "Content-Type": "application/​json; charset=utf-8"19 },20 body: {21 }22 }).then(res => {23 expect(res.body).to.have.property("some");24 });25 });26});27describe("Test", () => {28 it("should be true", () => {29 cy.request({30 headers: {31 "Content-Type": "application/​json; charset=utf-8"32 },33 body: {34 }35 }).then(res => {36 expect(res.status).to.equal(200);37 });38 });39});40describe("Test", () => {41 it("should be true", () => {42 cy.request({43 headers: {44 "Content-Type": "application/​json; charset=utf-8"45 },46 body: {47 }48 }).then(res => {49 expect(res.status).to.equal(200);50 });51 });52});

Full Screen

Using AI Code Generation

copy

Full Screen

1describe('Test to check the content type of response', () => {2 it('should check the content type of response', () => {3 .its('headers')4 .its('content-type')5 .should('include', 'application/​json')6 })7})8Cypress.Commands.add('hasJsonContentType', () => {9 .its('headers')10 .its('content-type')11 .should('include', 'application/​json')12})13describe('Test to check the content type of response', () => {14 it('should check the content type of response', () => {15 cy.hasJsonContentType()16 })17})

Full Screen

StackOverFlow community discussions

Questions
Discussion

cypress wait for redirection after login

Cypress sees undefined when reffering to an aliased text value

Cypress: Stub response for same route with three different responses

Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1 (credentials file is present)

In Cypress how to select input element based on name?

Validate CSS &#39;backgroud-image&#39; URL using Cypress

How can we run offline tests using cypress in a PWA application?

Skipping a test in Cypress conditionally

How to add types to Cypress.env?

How can I test automatically Service Workers in offline mode? Trying with Cypress

Cypress provides retry abilities on assertion. You can resolve the waiting issue for the redirection URL with the below change

cy.url().should('contain', '/redirection-url')

OR

cy.url().should('eq', 'mysite.com/redirection-url')

Here should assertion will wait till 4 seconds by default and retries cy.url()

You can change the default timeout by updating parameter in cypress.json file

{
  "defaultCommandTimeout": 30000
}

Hope this will solve your issue.

https://stackoverflow.com/questions/64553275/cypress-wait-for-redirection-after-login

Blogs

Check out the latest blogs from LambdaTest on this topic:

Role Of Automation Testing In Agile

Every company wants their release cycle to be driven in the fast lane. Agile and automation testing have been the primary tools in the arsenal of any web development team. Incorporating both in SDLC(Software Development Life Cycle), has empowered web testers and developers to collaborate better and deliver faster. It is only natural to assume that these methodologies have become lifelines for web professionals, allowing them to cope up with the ever-changing customer demands.

Why did we build HyperExecute?

Innovation distinguishes between a leader and a follower.

Getting Started With Laravel Testing

If you’re reading this, it’s either because you’re curious about the factors that go into Laravel testing and how to implement them in your application or because you just want to improve your knowledge of Laravel testing. Whatever your goals may be, you will have something to take away after reading this article.

A Complete Guide To Flutter Testing

Mobile devices and mobile applications – both are booming in the world today. The idea of having the power of a computer in your pocket is revolutionary. As per Statista, mobile accounts for more than half of the web traffic worldwide. Mobile devices (excluding tablets) contributed to 54.4 percent of global website traffic in the fourth quarter of 2021, increasing consistently over the past couple of years.

How To Automate Login Page Using Selenium WebDriver?

Selenium has always been the most preferred test automation framework for testing web applications. This open-source framework supports popular programming languages (e.g. Java, JavaScript, Python, C#, etc.), browsers, and operating systems. It can also be integrated with other test automation frameworks like JUnit, TestNG, PyTest, PyUnit, amongst others. As per the State of open source testing survey, Selenium is still the king for web automation testing, with 81% of organizations preferring it over other frameworks.

Cypress Tutorial

Cypress is a renowned Javascript-based open-source, easy-to-use end-to-end testing framework primarily used for testing web applications. Cypress is a relatively new player in the automation testing space and has been gaining much traction lately, as evidenced by the number of Forks (2.7K) and Stars (42.1K) for the project. LambdaTest’s Cypress Tutorial covers step-by-step guides that will help you learn from the basics till you run automation tests on LambdaTest.

Chapters:

  1. What is Cypress? -
  2. Why Cypress? - Learn why Cypress might be a good choice for testing your web applications.
  3. Features of Cypress Testing - Learn about features that make Cypress a powerful and flexible tool for testing web applications.
  4. Cypress Drawbacks - Although Cypress has many strengths, it has a few limitations that you should be aware of.
  5. Cypress Architecture - Learn more about Cypress architecture and how it is designed to be run directly in the browser, i.e., it does not have any additional servers.
  6. Browsers Supported by Cypress - Cypress is built on top of the Electron browser, supporting all modern web browsers. Learn browsers that support Cypress.
  7. Selenium vs Cypress: A Detailed Comparison - Compare and explore some key differences in terms of their design and features.
  8. Cypress Learning: Best Practices - Take a deep dive into some of the best practices you should use to avoid anti-patterns in your automation tests.
  9. How To Run Cypress Tests on LambdaTest? - Set up a LambdaTest account, and now you are all set to learn how to run Cypress tests.

Certification

You can elevate your expertise with end-to-end testing using the Cypress automation framework and stay one step ahead in your career by earning a Cypress certification. Check out our Cypress 101 Certification.

YouTube

Watch this 3 hours of complete tutorial to learn the basics of Cypress and various Cypress commands with the Cypress testing at LambdaTest.

Run Cypress automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful