Source: allure.js

"use strict";

/**
 * [Allure](http://allure.qatools.ru/) wrapper.
 *
 * @module
 */

const fs = require("fs");

const Allure = require("allure-js-commons");
const Step = require("allure-js-commons/beans/step");

const CONF = require("./config");

let allure;

if (CONF.allure.use) {
    allure = new Allure();
    allure.setOptions({ targetDir: CONF.allure.dir });
    allure.PASSED = "passed";
    allure.FAILED = "failed";
    allure.SKIPPED = "skipped";
    /**
     * Defines if allure helper has steps or no.
     *
     * @memberOf module:allure
     * @method
     * @return {boolean} `true` if it has steps, `false` otherwise.
     */
    allure.hasSteps = function () {
        return this.getCurrentSuite().currentStep instanceof Step;
    };
    /**
     * Defines if test is started or no.
     *
     * @memberOf module:allure
     * @method
     * @return {boolean} `true` if test is started, `false` otherwise.
     */
    allure.isTestStarted = function () {
        return !!(this.getCurrentSuite() && this.getCurrentTest() && !this.getCurrentTest().status);
    };
    /**
     * Starts step if test is started.
     *
     * @memberOf module:allure
     * @method
     * @arg {string} name - Step name.
     */
    allure.step = function () {
        if (this.isTestStarted()) this.startStep.apply(this, arguments);
    };
    /**
     * Ends step as passed if test is started.
     *
     * @memberOf module:allure
     * @method
     */
    allure.pass = function () {
        if (this.isTestStarted()) this.endStep(this.PASSED);
    };
    /**
     * Adds test story if test is started.
     *
     * @memberOf module:allure
     * @method
     * @arg {string} name - Story name.
     */
    allure.story = function (name) {
        if (!this.isTestStarted()) return;
        this.getCurrentTest().addLabel("story", name);
    };
    /**
     * Adds test feature if test is started.
     *
     * @memberOf module:allure
     * @method
     * @arg {string} name - Feature name.
     */
    allure.feature = function (name) {
        if (!this.isTestStarted()) return;
        this.getCurrentTest().addLabel("feature", name);
    };
    /**
     * Adds test environment value if test is started.
     *
     * @memberOf module:allure
     * @method
     * @arg {string} name - Environment name.
     * @arg {string} value - Environment value.
     */
    allure.addEnvironment = function (name, value) {
        if (!this.isTestStarted()) return;
        this.getCurrentTest().addParameter("environment-variable", name, value);
    };
    /**
     * Adds test description if test is started.
     *
     * @memberOf module:allure
     * @method
     * @arg {string} desc - Description.
     * @arg {string} type - Mime type.
     */
    allure.addDescription = function (desc, type) {
        if (!this.isTestStarted()) return;
        this.getCurrentTest().setDescription(desc, type);
    };
    /**
     * Attach content to test if test is started.
     *
     * @memberOf module:allure
     * @method
     * @arg {string} name - Content name.
     * @arg {string} content - Content body.
     * @arg {string} type - Mime type.
     */
    allure.attach = function (name, content, type) {
        if (!this.isTestStarted()) return;
        this.addAttachment(name, Buffer.from(content), type);
    };
    /**
     * Attach JSON to test if test is started.
     *
     * @memberOf module:allure
     * @method
     * @arg {string} name - JSON name.
     * @arg {string} obj - Object to convert to JSON.
     */
    allure.attachJson = function (name, obj) {
        if (!this.isTestStarted()) return;
        this.attach(name, JSON.stringify(obj, null, "  "), "application/json");
    };
    /**
     * Attach image to test if test is started.
     *
     * @memberOf module:allure
     * @method
     * @arg {string} name - Image name.
     * @arg {string} imgPath - Image path.
     */
    allure.attachImage = function (name, imgPath) {
        if (!this.isTestStarted()) return;
        this.attach(name, fs.readFileSync(imgPath), "image/png");
    };
    /**
     * Attach video to test if test is started.
     *
     * @memberOf module:allure
     * @method
     * @arg {string} name - Video name.
     * @arg {string} videoPath - Video path.
     */
    allure.attachVideo = function (name, videoPath) {
        if (!this.isTestStarted()) return;
        this.attach(name, fs.readFileSync(videoPath), "video/mp4");
    };
    /**
     * Attach text to test if test is started.
     *
     * @memberOf module:allure
     * @method
     * @arg {string} name - Text name.
     * @arg {string} txt - Text content.
     */
    allure.attachText = function (name, txt) {
        this.attach(name, txt, "text/plain");
    };
    /**
     * Attach HTML to test if test is started.
     *
     * @memberOf module:allure
     * @method
     * @arg {string} name - HTML name.
     * @arg {string} html - HTML content.
     */
    allure.attachHtml = function (name, html) {
        this.attach(name, html, "application/html");
    };

} else {
    allure = new Proxy({}, { get: () => () => {} });
};

module.exports = allure;