UNPKG

@serenity-js/rest

Version:

Serenity/JS Screenplay Pattern library for interacting with REST and other HTTP-based services, supporting comprehensive API testing and blended testing scenarios

87 lines 3.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Send = void 0; const core_1 = require("@serenity-js/core"); const model_1 = require("@serenity-js/core/lib/model"); const axios_1 = require("axios"); const abilities_1 = require("../abilities"); /** * Sends a [`HTTPRequest`](https://serenity-js.org/api/rest/class/HTTPRequest/) to a specified URL. * * The response to the request is made available via [`LastResponse`](https://serenity-js.org/api/rest/class/LastResponse/). * * ## Send a GET request * * ```ts * import { actorCalled } from '@serenity-js/core' * import { CallAnApi, GetRequest, LastResponse, Send } from '@serenity-js/rest' * import { Ensure, equals } from '@serenity-js/assertions' * * await actorCalled('Apisitt') * .whoCan(CallAnApi.at('https://api.example.org/')) * .attemptsTo( * Send.a(GetRequest.to('/books/0-688-00230-7')), * Ensure.that(LastResponse.status(), equals(200)), * ) * ``` * * @group Activities */ class Send extends core_1.Interaction { request; /** * Instantiates a new [interaction](https://serenity-js.org/api/core/class/Interaction/) to [`Send`](https://serenity-js.org/api/rest/class/Send/). * * #### Learn more * - [AxiosRequestConfig](https://axios-http.com/docs/req_config) * * @param request */ static a(request) { return new Send(request); } /** * @param request */ constructor(request) { super(`#actor sends ${request.toString()}`); this.request = request; } /** * @inheritDoc */ performAs(actor) { const callAnApi = abilities_1.CallAnApi.as(actor); return actor.answer(this.request) .then(config => callAnApi.request(config).then((response) => { const resolvedUrl = callAnApi.resolveUrl(config); actor.collect(this.responseToArtifact(resolvedUrl, response), this.requestToArtifactName(response.config.method, resolvedUrl)); })); } responseToArtifact(targetUrl, response) { const request = response.config; const axiosRequestHeaders = request.headers; const requestHeaders = axios_1.AxiosHeaders.from(axiosRequestHeaders).toJSON(true); const axiosResponseHeaders = response.headers; const responseHeaders = axios_1.AxiosHeaders.from(axiosResponseHeaders).toJSON(false); const requestAndResponse = { request: { method: request.method, url: targetUrl, headers: requestHeaders, data: request.data, }, response: { status: response.status, headers: responseHeaders, data: response.data, }, }; return model_1.HTTPRequestResponse.fromJSON(requestAndResponse); } requestToArtifactName(method, url) { return new model_1.Name(`${method.toUpperCase()} ${url}`); } } exports.Send = Send; //# sourceMappingURL=Send.js.map