Source: src/logging.js

const {
  cyan,
  green,
  magenta,
  yellow,
} = require('chalk');

// eslint-disable-next-line no-unused-vars
const Logger = require('./logger');
const { fmtHeaders } = require('./utils');

/**
 * @param {{name: string, path: string, description: string}} suite
 * @param {Logger} log
 */
const logSuite = ({ name, path, description }, log) => {
  if (name) {
    log.log(cyan(`Test Suite :: ${name} ${path}\n`));
  } else {
    log.log(cyan(`Test Suite :: ${path}\n`));
  }
  if (description) {
    log.info(description);
  }
};
/**
 * @param {{name: string, description: string}} test
 * @param {Logger} log
 */
const logTest = ({ name, description }, log) => {
  log.log(magenta(name));
  if (description) {
    log.info(description);
  }
};

/**
 * @param {{
 *  query: Record<string, string>,
 *  headers: Record<string, string>,
 *  method: string,
 *  path: string,
 *  description: string}} request
 * @param {Logger} log
 */
const logRequest = ({
  headers, query, method, path, description,
}, log) => {
  log.log('');
  if (Object.keys(query).length === 0) {
    log.log(yellow(`${method.toUpperCase()} ${path}`));
  } else {
    const queryJoined = Object.entries(query)
      .map((pair) => pair.join('='))
      .join('&');
    log.log(yellow(`${method.toUpperCase()} ${path}?${queryJoined}`));
  }
  log.log('');
  if (description) {
    log.info(description);
  }
  log.debug(fmtHeaders(headers));
  log.debug('');
};

/**
 * @param {{
 *  statusMessage: string,
 *  statusCode: number,
 *  body: *,
 *  headers: Record<string, string>}} response
 * @param {Logger} log
 */
const logResponse = ({
  headers, body, statusCode, statusMessage,
}, log) => {
  log.log(green(`\n${statusMessage.toUpperCase()} ${statusCode}\n`));
  log.debug(fmtHeaders(headers));
  log.debug('');
  log.debug(body);
  log.debug('');
};

module.exports = {
  logSuite,
  logTest,
  logRequest,
  logResponse,
};