Newer
Older
hurl / bin / generate-test.mjs
#!/usr/bin/env node

import { RestParser, RestRequest } from "rest-cli";

const usage = (errorNumber = 0) => {
    console.error("Usage:  ./bin/generate-test.mjs <instance> [requestName|requestNumber]");
    process.exit(errorNumber);
}

/** @param {string} s */
const isInteger = (s) => Number.isInteger(Number(s));


/**
 * Converts a REST client request object into a Hurl request.
 *
 * @param {RestRequest} request - The REST client request object to be converted.
 * @return {Promise<string>} The converted Hurl request.
 */
const restCliRequest2Hurl = async (request) => {
    let requestString = `${request.method} ${request.url}\n`;
    request.headers.forEach((value, key) => requestString += `${key}: ${value}\n`);
    requestString += request.body + '\n';

    try {
        const { response } = await request.request();

        const responseString = "HTTP 200\n" + response.getBody();

        return requestString + "\n" + responseString;
    } catch (error) {
        console.error(error);
        return requestString + "\n";
    }
}

/**
 * Converts the entire file by iterating through the RestParser object and
 * converting each request into an Hurl string using the restCliRequest2Hurl
 * function.
 *
 * @param {RestParser} parser - The RestParser object that contains the requests to be converted.
 * @return {Promise<string>} A promise that resolves to the Hurl string representation of all the requests.
 */
const convertWholeFile = async (parser) => {
    const nb = parser.count;
    let hurlString = "";
    for (let i = 0; i < nb; i++) {
        const request = await parser.get(i);
        if (!request) { // Should not happen
            console.error(`Request "${i}" not found.\nMaybe the examples.http file is wrong?`);
            continue;
        }
        hurlString += await restCliRequest2Hurl(request) +
            '\n\n';
    }
    return hurlString.trim();
}

///////////////////////////////////////////////////////////:

const [, , instanceName, requestName] = process.argv;

if (!instanceName) {
    console.error("Instance name needed as a first paramater!");
    usage(1);
}

if (process.argv.length > 4) {
    console.error("Wrong number of parameters!");
    usage(2);
}

// Get Response from examples.http file
const parser = new RestParser();
await parser.readFile(`./${instanceName}/examples.http`);

// Convert all requests
if (process.argv.length === 3) {
    const hurlString = await convertWholeFile(parser);
    console.log(hurlString);
    process.exit(0);
}

const requestId = isInteger(requestName) ? Number(requestName) : requestName;

if (requestId === undefined) {
    console.error("requestName needed as a second parameter (could be a string or an integer).");
    usage(3);
}

const request = await parser.get(requestId);

if (request) {
    console.log(await restCliRequest2Hurl(request));
} else {
    console.error(`Request "${requestId}" not found.`);
    usage(4);
}