@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
JavaScript
;
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