UNPKG

trident-beta

Version:

trident is a sample and lightly tools aims to improve collaboration efficiency between SDET and QA based on initiative from Einstein/TestIT.

2,439 lines 113 kB
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
    result["default"] = mod;
    return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
var lodash_1 = __importDefault(require("lodash"));
var qs_1 = __importDefault(require("qs"));
var Parser = __importStar(require("../parser/parser"));
var httpClient_1 = __importDefault(require("../util/httpClient"));
var constants_1 = require("./constants");
var log4js = require("log4js");
var logger = log4js.getLogger();
var TestItSDK = /** @class */ (function () {
    function TestItSDK(endpoint) {
        this.endpoint = endpoint;
        this.userName = null;
        this.accessToken = null;
        this.cache = new Map();
        this.httpClient = new httpClient_1.default();
    }
    /**
     * Return true if client is authorized.
     */
    TestItSDK.prototype.getAutorized = function () {
        return this.accessToken != null;
    };
    /**
     * Login to TestIt. Save cookies if login successfully.
     * @param username
     * @param password
     */
    TestItSDK.prototype.login = function (username, password) {
        return __awaiter(this, void 0, void 0, function () {
            var url, data, headers, config, response, err_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 3, , 4]);
                        url = this.endpoint + "/api/v1/login";
                        data = { username: username, password: password };
                        headers = {
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers, data: data };
                        return [4 /*yield*/, this.httpClient.post(url, config)];
                    case 1:
                        response = _a.sent();
                        this.userName = response.data.username;
                        this.accessToken = response.data.access_token;
                        logger.debug(response.data);
                        return [4 /*yield*/, this.init()];
                    case 2:
                        _a.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        err_1 = _a.sent();
                        throw new Error("Failed to login TestIt, please check your username and password.");
                    case 4:
                        logger.debug("----Welcome! Login Successfully!-----");
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Logout Testit, delete cookies.
     */
    TestItSDK.prototype.logout = function () {
        this.userName = null;
        this.accessToken = null;
    };
    /**
     * Initialize sdk,fetch global data.
     * @return {Promise<void>}
     */
    TestItSDK.prototype.init = function () {
        return __awaiter(this, void 0, void 0, function () {
            var globalData;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getGlobalData()];
                    case 1:
                        globalData = _a.sent();
                        this.cache.set(constants_1.CacheKey.GLOBAL_DATA, globalData);
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Fetch fields information by project id for further using.
     * @param projectId
     */
    TestItSDK.prototype.fetchFieldsInfoById = function (projectId) {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/api/v1/fields?projectId=" + projectId;
                        headers = {
                            Authorization: this.accessToken,
                            "Content-type": "application/json"
                        };
                        config = {
                            headers: headers
                        };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get search elements map from fields by name.
     * @param response
     * @param name (like Keywords Subtype...)
     */
    TestItSDK.prototype.getFieldsInfoMapByName = function (response, name) {
        return __awaiter(this, void 0, void 0, function () {
            var fieldsIdxMap, index, values, resMap, i;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getFieldsIndexMap(response)];
                    case 1:
                        fieldsIdxMap = _a.sent();
                        index = fieldsIdxMap.get(name);
                        if (index == undefined) {
                            throw new Error("Not found the name : " + name);
                        }
                        values = response[index].values;
                        resMap = new Map();
                        for (i = 0; i < values.length; i++) {
                            resMap.set(values[i].name, values[i].id);
                        }
                        return [2 /*return*/, resMap];
                }
            });
        });
    };
    /**
     * Get field's response values map (name -> index).
     * @param response
     */
    TestItSDK.prototype.getFieldsIndexMap = function (response) {
        return __awaiter(this, void 0, void 0, function () {
            var valuesMap, i;
            return __generator(this, function (_a) {
                valuesMap = new Map();
                for (i = 0; i < response.length; i++) {
                    valuesMap.set(response[i].name, i);
                }
                return [2 /*return*/, valuesMap];
            });
        });
    };
    /**
     * Get field's response values map (name -> id).
     * @param response
     */
    TestItSDK.prototype.getFieldsIdMap = function (response) {
        return __awaiter(this, void 0, void 0, function () {
            var valuesMap, i;
            return __generator(this, function (_a) {
                valuesMap = new Map();
                for (i = 0; i < response.length; i++) {
                    valuesMap.set(response[i].name, response[i].id);
                }
                return [2 /*return*/, valuesMap];
            });
        });
    };
    /**
     * Get projects.
     * @return {Promise<IProject[]>}
     */
    TestItSDK.prototype.getProjects = function () {
        return __awaiter(this, void 0, void 0, function () {
            var cacheKey, url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cacheKey = constants_1.CacheKey.PROJECTS;
                        if (this.cache.has(cacheKey)) {
                            return [2 /*return*/, this.cache.get(cacheKey)];
                        }
                        url = this.endpoint + "/api/v1/projects";
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        this.cache.set(cacheKey, response.data);
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Generate prefix project map.
     */
    TestItSDK.prototype.genPrefixProjectMap = function () {
        return __awaiter(this, void 0, void 0, function () {
            var response, prefixMap, i;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getProjects()];
                    case 1:
                        response = _a.sent();
                        prefixMap = new Map();
                        for (i = 0; i < response.length; i++) {
                            prefixMap.set(response[i].id, response[i].prefix);
                        }
                        return [2 /*return*/, prefixMap];
                }
            });
        });
    };
    /**
     * Get project by name.
     * @param projectName
     */
    TestItSDK.prototype.getProjectByName = function (projectName) {
        return __awaiter(this, void 0, void 0, function () {
            var totalProjects;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getProjects()];
                    case 1:
                        totalProjects = _a.sent();
                        return [2 /*return*/, lodash_1.default.find(totalProjects, function (p) { return p.name === projectName; })];
                }
            });
        });
    };
    /**
     * Get project id by name.
     * @param projectName
     */
    TestItSDK.prototype.getProjectIdByName = function (projectName) {
        return __awaiter(this, void 0, void 0, function () {
            var project;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getProjectByName(projectName)];
                    case 1:
                        project = _a.sent();
                        if (!project) {
                            throw new Error("Project not found : " + projectName + ".");
                        }
                        return [2 /*return*/, project["id"]];
                }
            });
        });
    };
    /**
     * Get project by project id.
     * @param projectId
     */
    TestItSDK.prototype.getProjectById = function (projectId) {
        return __awaiter(this, void 0, void 0, function () {
            var cacheKey, url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cacheKey = constants_1.CacheKey.PROJECT + " : " + projectId;
                        if (this.cache.has(cacheKey)) {
                            return [2 /*return*/, this.cache.get(cacheKey)];
                        }
                        url = this.endpoint + "/api/v1/project/" + projectId;
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        //update : response total data of project.
                        this.cache.set(cacheKey, response.data);
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get keywords by project id.
     * 【Error】Project doesn't include keywords!Not really go.
     * @param projectId
     */
    TestItSDK.prototype.getKeywordsByProjectId = function (projectId) {
        return __awaiter(this, void 0, void 0, function () {
            var cacheKey, url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cacheKey = constants_1.CacheKey.KEYWORDS + " : " + projectId;
                        if (this.cache.has(cacheKey)) {
                            return [2 /*return*/, this.cache.get(cacheKey)];
                        }
                        url = this.endpoint + "/api/v1/project/" + projectId;
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        this.cache.set(cacheKey, response.data);
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get project tree by project id.
     * @param projectId
     */
    TestItSDK.prototype.getProjectTreeById = function (projectId) {
        return __awaiter(this, void 0, void 0, function () {
            var cacheKey, url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cacheKey = constants_1.CacheKey.PROJECT_TREE + " : " + projectId;
                        if (this.cache.has(cacheKey)) {
                            return [2 /*return*/, this.cache.get(cacheKey)];
                        }
                        url = this.endpoint + "/api/v1/project/" + projectId + "/tree";
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        this.cache.set(cacheKey, response.data);
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get section by section id.
     * @param sectionId
     */
    TestItSDK.prototype.getSectionById = function (sectionId) {
        return __awaiter(this, void 0, void 0, function () {
            var cacheKey, url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cacheKey = constants_1.CacheKey.SECTION + " : " + sectionId;
                        if (this.cache.has(cacheKey)) {
                            return [2 /*return*/, this.cache.get(cacheKey)];
                        }
                        url = this.endpoint + "/api/v1/section/" + sectionId;
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        this.cache.set(cacheKey, response.data);
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get test case by test case id. - 17
     * @param testCaseId
     */
    TestItSDK.prototype.getTestCaseById = function (testCaseId) {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response, err_2;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        url = this.endpoint + "/api/v1/case/" + testCaseId;
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                    case 2:
                        err_2 = _a.sent();
                        throw new Error("404 Not Found.Please make sure the right testCaseId");
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Get many test cases by test case ids.
     * @param testCaseIds
     */
    TestItSDK.prototype.getTestCasesByIds = function (testCaseIds) {
        return __awaiter(this, void 0, void 0, function () {
            var prefix, url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        prefix = this.endpoint + "/api/v1/cases?";
                        testCaseIds.forEach(function (value) {
                            prefix = prefix + "id=" + value + "&";
                        });
                        url = prefix.substring(0, prefix.length - 1);
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get test plans from test case by test case id.
     * @param testCaseId
     */
    TestItSDK.prototype.getTestPlansByTestCaseId = function (testCaseId) {
        return __awaiter(this, void 0, void 0, function () {
            var cacheKey, url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cacheKey = constants_1.CacheKey.TEST_PLAN + " : " + testCaseId;
                        if (this.cache.has(cacheKey)) {
                            return [2 /*return*/, this.cache.get(cacheKey)];
                        }
                        url = this.endpoint + "/api/v1/case/" + testCaseId + "/testplans";
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        this.cache.set(cacheKey, response.data);
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get test plans by project ids.
     * @param projectIds
     */
    TestItSDK.prototype.getTestPlansByProjectIds = function (projectIds) {
        return __awaiter(this, void 0, void 0, function () {
            var prefix, url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        prefix = this.endpoint + "/api/v1/testplans?";
                        projectIds.forEach(function (value) {
                            prefix = prefix + "projectId=" + value + "&";
                        });
                        url = prefix.substring(0, prefix.length - 1);
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get execution-history by test case id.
     * @param testCaseId
     */
    TestItSDK.prototype.getExecutionHistoryByTestCaseId = function (testCaseId) {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/api/v1/case/" + testCaseId + "/execution-history";
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get test case version by version id.
     * @param versionId
     */
    TestItSDK.prototype.getCaseVersionByVersionId = function (versionId) {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/api/v1/case/version/" + versionId;
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get test case by key.
     * 【Example】key = JPT-3166
     * @param key
     */
    TestItSDK.prototype.getTestCaseByKey = function (key) {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/api/v1/case/" + key;
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "applicaiton/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get builds by test plan id.
     * @param testPlanId
     */
    TestItSDK.prototype.getBuildsByTestPlanId = function (testPlanId) {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/api/v1/testplan/" + testPlanId + "/builds";
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get test plan by test plan id.
     * @param testPlanId
     */
    TestItSDK.prototype.getTestPlanById = function (testPlanId) {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/api/v1/testplan/" + testPlanId;
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get tree by test plan id.
     * @param testPlanId
     */
    TestItSDK.prototype.getTreeByTestPlanId = function (testPlanId) {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/api/v1/testplan/" + testPlanId + "/tree";
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get execution progress by test plan id.
     * @param testPlanId
     */
    TestItSDK.prototype.getExecutionProgressByTestPlanId = function (testPlanId) {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/api/v1/testplan/" + testPlanId + "/execution-progress";
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get build by build id.
     * @param buildId
     */
    TestItSDK.prototype.getBuildById = function (buildId) {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/api/v1/build/" + buildId;
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get suite by suite id.
     * @param suiteId
     */
    TestItSDK.prototype.getSuiteById = function (suiteId) {
        return __awaiter(this, void 0, void 0, function () {
            var cacheKey, url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cacheKey = constants_1.CacheKey.SUITES + ":" + suiteId;
                        if (this.cache.has(cacheKey)) {
                            return [2 /*return*/, this.cache.get(cacheKey)];
                        }
                        url = this.endpoint + "/api/v1/suite/" + suiteId;
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        this.cache.set(cacheKey, response.data);
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get suite tree by suite id.
     * @param suiteId
     */
    TestItSDK.prototype.getSuiteTreeById = function (suiteId) {
        return __awaiter(this, void 0, void 0, function () {
            var cacheKey, url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cacheKey = constants_1.CacheKey.SUITE_TREE + ":" + suiteId;
                        if (this.cache.has(cacheKey)) {
                            return [2 /*return*/, this.cache.get(cacheKey)];
                        }
                        url = this.endpoint + "/api/v1/suite/" + suiteId + "/tree";
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        this.cache.set(cacheKey, response.data);
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /* Search API use in cases */
    /**
     * Search test cases by json query.
     * @param query
     * @param scope
     */
    TestItSDK.prototype.searchTestCasesByJsonQuery = function (query, scope) {
        if (scope === void 0) { scope = "TEST_SUITES"; }
        return __awaiter(this, void 0, void 0, function () {
            var criterionJson, url, data, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        criterionJson = query;
                        url = this.endpoint + "/testCases/search";
                        data = {
                            type: "search",
                            scope: scope,
                            criterionJson: criterionJson
                        };
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
                        };
                        config = {
                            headers: headers,
                            data: qs_1.default.stringify(data)
                        };
                        return [4 /*yield*/, this.httpClient.post(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Flatten response data.
     * @param root
     */
    TestItSDK.prototype.flat = function (root) {
        var cases = [];
        var fifo = [root];
        var _loop_1 = function () {
            var node = fifo.shift();
            if ("case" !== node.type) {
                if (node.children && node.children.length > 0) {
                    node.children.forEach(function (child) {
                        if (!child.path) {
                            child.path = [];
                        }
                        child.path.push(node.name);
                    });
                    fifo.push.apply(fifo, node.children);
                }
            }
            else {
                cases.push(node);
            }
        };
        while (fifo.length > 0) {
            _loop_1();
        }
        return cases;
    };
    /**
     * Search and generate template info by search Option.
     * @param searchOption
     */
    TestItSDK.prototype.generateTemplateInfoByOptions = function (searchOption) {
        return __awaiter(this, void 0, void 0, function () {
            var query, response, flatResponse, flatLength, resultData, i, tempKey, _a, _b;
            return __generator(this, function (_c) {
                switch (_c.label) {
                    case 0: return [4 /*yield*/, this.generateQuery(searchOption)];
                    case 1:
                        query = _c.sent();
                        return [4 /*yield*/, this.searchTestCasesByQuery(query, "TEST_SUITES", searchOption.suiteName)];
                    case 2:
                        response = _c.sent();
                        flatResponse = this.flat(response);
                        flatLength = flatResponse.length;
                        resultData = [];
                        i = 0;
                        _c.label = 3;
                    case 3:
                        if (!(i < flatLength)) return [3 /*break*/, 6];
                        tempKey = flatResponse[i].prefix + "-" + flatResponse[i].externalId;
                        _b = (_a = resultData).push;
                        return [4 /*yield*/, this.generateTemplatesInfoByKey(tempKey)];
                    case 4:
                        _b.apply(_a, [_c.sent()]);
                        _c.label = 5;
                    case 5:
                        i++;
                        return [3 /*break*/, 3];
                    case 6: return [2 /*return*/, resultData];
                }
            });
        });
    };
    /**
     * Store template file by search options.
     * @param searchOption
     * @param path
     */
    TestItSDK.prototype.storeTemplateFileByOptions = function (searchOption, path) {
        return __awaiter(this, void 0, void 0, function () {
            var query, response, flatResponse, flatLength, i, tempKey, fileName, info;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.generateQuery(searchOption)];
                    case 1:
                        query = _a.sent();
                        return [4 /*yield*/, this.searchTestCasesByQuery(query, "TEST_SUITES", searchOption.suiteName)];
                    case 2:
                        response = _a.sent();
                        flatResponse = this.flat(response);
                        flatLength = flatResponse.length;
                        i = 0;
                        _a.label = 3;
                    case 3:
                        if (!(i < flatLength)) return [3 /*break*/, 6];
                        tempKey = flatResponse[i].prefix + "-" + flatResponse[i].externalId;
                        fileName = "" + path + tempKey + ".test.ts";
                        return [4 /*yield*/, this.generateTemplatesInfoByKey(tempKey)];
                    case 4:
                        info = _a.sent();
                        this.writeTemplateInfo(info, fileName);
                        _a.label = 5;
                    case 5:
                        i++;
                        return [3 /*break*/, 3];
                    case 6:
                        logger.debug("Store Successfully");
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Store files in tree by search options.
     * [Abandon]Please replace with the API of [storeFilesBySearchOptions]
     * @param searchOption
     * @param path
     */
    TestItSDK.prototype.storeFilesInTreeByOptions = function (searchOption, path, templatePath) {
        return __awaiter(this, void 0, void 0, function () {
            var query, response, fs, i, flatResponse, flatLength, j, tempKey, flatResponse, flatLength, i, tempKey;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.generateQuery(searchOption)];
                    case 1:
                        query = _a.sent();
                        return [4 /*yield*/, this.searchTestCasesByQuery(query, "TEST_SUITES", searchOption.suiteName)];
                    case 2:
                        response = _a.sent();
                        fs = require("fs");
                        if (!(response.length > 1)) return [3 /*break*/, 10];
                        i = 0;
                        _a.label = 3;
                    case 3:
                        if (!(i < response.length)) return [3 /*break*/, 9];
                        flatResponse = this.flat(response[i]);
                        flatLength = flatResponse.length;
                        j = 0;
                        _a.label = 4;
                    case 4:
                        if (!(j < flatLength)) return [3 /*break*/, 7];
                        tempKey = flatResponse[j].prefix + "-" + flatResponse[j].externalId;
                        return [4 /*yield*/, this.storeFileInTreeByCaseKey(tempKey, path, templatePath)];
                    case 5:
                        _a.sent();
                        _a.label = 6;
                    case 6:
                        j++;
                        return [3 /*break*/, 4];
                    case 7:
                        logger.debug("Total Store " + flatLength + " files");
                        logger.debug("Store Successfully");
                        _a.label = 8;
                    case 8:
                        i++;
                        return [3 /*break*/, 3];
                    case 9: return [3 /*break*/, 15];
                    case 10:
                        flatResponse = this.flat(response[0]);
                        flatLength = flatResponse.length;
                        i = 0;
                        _a.label = 11;
                    case 11:
                        if (!(i < flatLength)) return [3 /*break*/, 14];
                        tempKey = flatResponse[i].prefix + "-" + flatResponse[i].externalId;
                        return [4 /*yield*/, this.storeFileInTreeByCaseKey(tempKey, path, templatePath)];
                    case 12:
                        _a.sent();
                        _a.label = 13;
                    case 13:
                        i++;
                        return [3 /*break*/, 11];
                    case 14:
                        logger.debug("Total Store " + flatLength + " files");
                        logger.debug("Store Successfully");
                        _a.label = 15;
                    case 15: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Store files by search option(use template render engine)
     * @param searchOption
     * @param path
     * @param templatePath
     */
    TestItSDK.prototype.storeFilesBySearchOptions = function (searchOption, path, templatePath) {
        return __awaiter(this, void 0, void 0, function () {
            var fs, templateInfo, response_1, singleCaseInfo, query, response, cases, fileGenerateTask, _loop_2, _i, cases_1, item;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        fs = require("fs");
                        if (!(templatePath === undefined)) return [3 /*break*/, 2];
                        return [4 /*yield*/, fs.readFileSync("../templates/Default.txt", "UTF-8", function (err) {
                                throw new Error("Can't not find default.txt");
                            })];
                    case 1:
                        templateInfo = _a.sent();
                        return [3 /*break*/, 4];
                    case 2: return [4 /*yield*/, fs.readFileSync(templatePath, "UTF-8", function (err) {
                            throw new Error("Can't not find " + templatePath);
                        })];
                    case 3:
                        templateInfo = _a.sent();
                        _a.label = 4;
                    case 4:
                        if (!!(searchOption.caseId === undefined)) return [3 /*break*/, 8];
                        return [4 /*yield*/, this.getTestCaseByKey(searchOption.caseId)];
                    case 5:
                        response_1 = _a.sent();
                        return [4 /*yield*/, this.fillCaseInfoMap(searchOption.caseId, response_1)];
                    case 6:
                        singleCaseInfo = _a.sent();
                        return [4 /*yield*/, this.storeFileInTree(singleCaseInfo, path, templateInfo)];
                    case 7:
                        _a.sent();
                        logger.debug("Store " + searchOption.caseId + " Successfully");
                        return [2 /*return*/];
                    case 8: return [4 /*yield*/, this.generateQuery(searchOption)];
                    case 9:
                        query = _a.sent();
                        return [4 /*yield*/, this.searchTestCasesByQuery(query, "TEST_SUITES", searchOption.suiteName)];
                    case 10:
                        response = _a.sent();
                        if (response.length == 0 || response == null)
                            throw new Error("Search for nothing");
                        return [4 /*yield*/, this.handleResponse(response)];
                    case 11:
                        cases = _a.sent();
                        fileGenerateTask = [];
                        _loop_2 = function (item) {
                            fileGenerateTask.push(new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () {
                                return __generator(this, function (_a) {
                                    switch (_a.label) {
                                        case 0: return [4 /*yield*/, this.storeFileInTree(item, path, templateInfo)];
                                        case 1:
                                            _a.sent();
                                            resolve();
                                            return [2 /*return*/];
                                    }
                                });
                            }); }));
                        };
                        for (_i = 0, cases_1 = cases; _i < cases_1.length; _i++) {
                            item = cases_1[_i];
                            _loop_2(item);
                        }
                        //Promise all storage
                        return [4 /*yield*/, Promise.all(fileGenerateTask)];
                    case 12:
                        //Promise all storage
                        _a.sent();
                        logger.debug("[Store Finished] Total Store " + fileGenerateTask.length + " files");
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Handle search response to generate case info map
     * @param response
     */
    TestItSDK.prototype.handleResponse = function (response) {
        return __awaiter(this, void 0, void 0, function () {
            var caseInfoMap, caseInfoSyncTask, i, flatResponse, _loop_3, _i, flatResponse_1, item, flatResponse, caseInfoSyncTask_1, _loop_4, _a, flatResponse_2, item;
            var _this = this;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        caseInfoMap = [];
                        caseInfoSyncTask = [];
                        if (!(response.length > 1)) return [3 /*break*/, 2];
                        for (i = 0; i < response.length; i++) {
                            flatResponse = this.flat(response[i]);
                            _loop_3 = function (item) {
                                caseInfoSyncTask.push(new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () {
                                    var tempKey, caseResponse, caseInfo;
                                    return __generator(this, function (_a) {
                                        switch (_a.label) {
                                            case 0:
                                                tempKey = item.prefix + "-" + item.externalId;
                                                return [4 /*yield*/, this.getTestCaseByKey(tempKey)];
                                            case 1:
                                                caseResponse = _a.sent();
                                                return [4 /*yield*/, this.fillCaseInfoMap(tempKey, caseResponse)];
                                            case 2:
                                                caseInfo = _a.sent();
                                                caseInfoMap.push(caseInfo);
                                                resolve();
                                                return [2 /*return*/];
                                        }
                                    });
                                }); }));
                                // logger.debug(`${caseInfoMap[0].ascendants} ----- Search result : ${flatResponse.length}`)
                                logger.debug("Ready to store " + caseInfoMap.length + " files");
                            };
                            //if repeat suite name,clear case info map
                            for (_i = 0, flatResponse_1 = flatResponse; _i < flatResponse_1.length; _i++) {
                                item = flatResponse_1[_i];
                                _loop_3(item);
                            }
                        }
                        //get all caseInfo
                        return [4 /*yield*/, Promise.all(caseInfoSyncTask)];
                    case 1:
                        //get all caseInfo
                        _b.sent();
                        logger.debug("Total Search : " + response.length + " suite name tree");
                        return [3 /*break*/, 4];
                    case 2:
                        flatResponse = this.flat(response[0]);
                        caseInfoSyncTask_1 = [];
                        _loop_4 = function (item) {
                            caseInfoSyncTask_1.push(new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () {
                                var tempKey, caseResponse, caseInfo;
                                return __generator(this, function (_a) {
                                    switch (_a.label) {
                                        case 0:
                                            tempKey = item.prefix + "-" + item.externalId;
                                            return [4 /*yield*/, this.getTestCaseByKey(tempKey)];
                                        case 1:
                                            caseResponse = _a.sent();
                                            return [4 /*yield*/, this.fillCaseInfoMap(tempKey, caseResponse)];
                                        case 2:
                                            caseInfo = _a.sent();
                                            caseInfoMap.push(caseInfo);
                                            resolve();
                                            return [2 /*return*/];
                                    }
                                });
                            }); }));
                        };
                        for (_a = 0, flatResponse_2 = flatResponse; _a < flatResponse_2.length; _a++) {
                            item = flatResponse_2[_a];
                            _loop_4(item);
                        }
                        return [4 /*yield*/, Promise.all(caseInfoSyncTask_1)];
                    case 3:
                        _b.sent();
                        logger.debug("Ready to Store " + flatResponse.length + " files");
                        _b.label = 4;
                    case 4: return [2 /*return*/, caseInfoMap];
                }
            });
        });
    };
    /**
     * Fill case info map
     * @param tempKey
     * @param caseResponse
     */
    TestItSDK.prototype.fillCaseInfoMap = function (tempKey, caseResponse) {
        return __awaiter(this, void 0, void 0, function () {
            var caseInfo, _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = {
                            id: tempKey,
                            name: caseResponse.name
                        };
                        return [4 /*yield*/, this.fetchTemplateFieldInfo(caseResponse, "suite")];
                    case 1:
                        _a.suite = _b.sent(),
                            _a.priority = "P" + caseResponse.priority,
                            _a.ids = [tempKey];
                        return [4 /*yield*/, this.fetchTemplateFieldInfo(caseResponse, "ascendants")];
                    case 2:
                        _a.ascendants = _b.sent();
                        return [4 /*yield*/, this.fetchTemplateFieldInfo(caseResponse, "keywords")];
                    case 3:
                        _a.keywords = _b.sent();
                        return [4 /*yield*/, this.fetchTemplateFieldInfo(caseResponse, "maintainers")];
                    case 4:
                        _a.maintainers = _b.sent();
                        return [4 /*yield*/, this.fetchTemplateFieldInfo(caseResponse, "docs")];
                    case 5:
                        _a.docs = _b.sent();
                        return [4 /*yield*/, this.fetchTemplateFieldInfo(caseResponse, "testSteps")];
                    case 6:
                        _a.testSteps = _b.sent();
                        return [4 /*yield*/, this.fetchTemplateFieldInfo(caseResponse, "preconditions")];
                    case 7:
                        _a.preconditions = _b.sent();
                        return [4 /*yield*/, this.fetchTemplateFieldInfo(caseResponse, "accountType")];
                    case 8:
                        _a.accountType = _b.sent();
                        return [4 /*yield*/, this.fetchTemplateFieldInfo(caseResponse, "extensionType")];
                    case 9:
                        _a.extensionType = _b.sent();
                        return [4 /*yield*/, this.fetchTemplateFieldInfo(caseResponse, "entryPoint")];
                    case 10:
                        caseInfo = (_a.entryPoint = _b.sent(),
                            _a);
                        return [2 /*return*/, caseInfo];
                }
            });
        });
    };
    /**
     * Search test cases by query.
     * 【Query Example】const query = `version eq "active" and project_id in "[1311]" and field.5371560 in "[6234174]" and field.224 in "[11949947]"`;
     * @param query
     * @param scope
     * @param suiteName use suite name to filter
     */
    TestItSDK.prototype.searchTestCasesByQuery = function (query, scope, suiteName) {
        if (scope === void 0) { scope = "TEST_SUITES"; }
        return __awaiter(this, void 0, void 0, function () {
            var queryJson, response, filterResult, result;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.generateSearchJson(query)];
                    case 1:
                        queryJson = _a.sent();
                        return [4 /*yield*/, this.searchTestCasesByJsonQuery(queryJson, scope)];
                    case 2:
                        response = _a.sent();
                        if (!!(suiteName === undefined)) return [3 /*break*/, 4];
                        return [4 /*yield*/, this.SearchSuiteBlkInResponse(response, suiteName)];
                    case 3:
                        filterResult = _a.sent();
                        return [2 /*return*/, filterResult];
                    case 4:
                        result = [];
                        result.push(response);
                        return [2 /*return*/, result];
                }
            });
        });
    };
    /**
     * Search suite by suite name in response
     * @param response
     * @param suiteName
     */
    TestItSDK.prototype.SearchSuiteBlkInResponse = function (response, suiteName) {
        return __awaiter(this, void 0, void 0, function () {
            var suiteQueue, resultData, i, tempProject, j, tempSuite, k;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        suiteQueue = [];
                        resultData = [];
                        i = 0;
                        _a.label = 1;
                    case 1:
                        if (!(i < response.children.length)) return [3 /*break*/, 7];
                        tempProject = response.children[i];
                        if (!!(tempProject.children === undefined)) return [3 /*break*/, 6];
                        j = 0;
                        _a.label = 2;
                    case 2:
                        if (!(j < tempProject.children.length)) return [3 /*break*/, 6];
                        suiteQueue.push(tempProject.children[j]);
                        _a.label = 3;
                    case 3:
                        if (!(suiteQueue.length != 0 && suiteQueue != null)) return [3 /*break*/, 5];
                        return [4 /*yield*/, suiteQueue.shift()];
                    case 4:
                        tempSuite = _a.sent();
                        if (tempSuite === undefined)
                            return [3 /*break*/, 3];
                        if (tempSuite.name == suiteName) {
                            resultData.push(tempSuite);
                        }
                        //search for suite children
                        if (!(tempSuite.children === undefined) &&
                            tempSuite.type == "suite") {
                            for (k = 0; k < tempSuite.children.length; k++) {
                                if (tempSuite.children[k].type == "suite") {
                                    suiteQueue.push(tempSuite.children[k]);
                                }
                            }
                        }
                        return [3 /*break*/, 3];
                    case 5:
                        j++;
                        return [3 /*break*/, 2];
                    case 6:
                        i++;
                        return [3 /*break*/, 1];
                    case 7: return [2 /*return*/, resultData];
                }
            });
        });
    };
    /**
     * Convert search query to json.
     * @param query
     */
    TestItSDK.prototype.generateSearchJson = function (query) {
        return __awaiter(this, void 0, void 0, function () {
            var queryParse, queryJson, s1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        queryParse = Parser.parse(query);
                        return [4 /*yield*/, JSON.stringify(queryParse)];
                    case 1:
                        queryJson = _a.sent();
                        s1 = '\\"';
                        queryJson = queryJson.replace(s1, "").replace(s1, "");
                        queryJson = queryJson.replace(/\"\\\"/g, "").replace(/\\\"\"/g, "");
                        //filter search condition of suiteName value
                        queryJson = queryJson.replace(/'/g, '"');
                        // logger.debug(queryJson);
                        return [2 /*return*/, queryJson];
                }
            });
        });
    };
    /**
     * Search testCases by search options(projectName,keywords,subtype).
     * @param projectName
     * @param keywords
     * @param subtype
     */
    TestItSDK.prototype.searchCasesBySearchOptions = function (searchOption) {
        return __awaiter(this, void 0, void 0, function () {
            var response, query, searchRes, flatResponseArr, i, flatResponse, flatResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!!(searchOption.caseId === undefined)) return [3 /*break*/, 3];
                        return [4 /*yield*/, this.getTestCaseByKey(searchOption.caseId)];
                    case 1:
                        response = _a.sent();
                        return [4 /*yield*/, this.printSearchInfo(response)];
                    case 2:
                        _a.sent();
                        return [2 /*return*/];
                    case 3: return [4 /*yield*/, this.generateQuery(searchOption)];
                    case 4:
                        query = _a.sent();
                        return [4 /*yield*/, this.searchTestCasesByQuery(query, "TEST_SUITES", searchOption.suiteName)];
                    case 5:
                        searchRes = _a.sent();
                        //count response lenth
                        //by suite name
                        if (searchRes.length > 1) {
                            flatResponseArr = [];
                            logger.debug("->> Find " + searchRes.length + " suites according to the " + searchOption.suiteName);
                            for (i = 0; i < searchRes.length; i++) {
                                flatResponse = this.flat(searchRes[i]);
                                logger.debug("Search Result: ");
                                this.printSearchInfo(flatResponse);
                                flatResponseArr.push(flatResponse);
                                logger.debug("Total Search : " + flatResponse.length + "\n");
                            }
                            return [2 /*return*/, flatResponseArr]; //return array
                        }
                        else {
                            //not by suite name
                            logger.debug("->> Find 1 suite according to the " + searchOption.suiteName);
                            flatResponse = this.flat(searchRes[0]);
                            logger.debug("Search Result: ");
                            this.printSearchInfo(flatResponse);
                            logger.debug("Total Search : " + flatResponse.length);
                            return [2 /*return*/, flatResponse]; // return response
                        }
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Print search result info
     * @param flatResponse
     */
    TestItSDK.prototype.printSearchInfo = function (flatResponse) {
        return __awaiter(this, void 0, void 0, function () {
            var i, temp, info;
            return __generator(this, function (_a) {
                for (i = 0; i < flatResponse.length; i++) {
                    temp = flatResponse[i];
                    info = "\t" + temp.prefix + "-" + temp.externalId + ":" + temp.name;
                    logger.debug(info);
                }
                return [2 /*return*/];
            });
        });
    };
    /**
     * Get suite id by name.
     * @param suiteName
     * @param projectId
     */
    TestItSDK.prototype.getSuiteIdByName = function (suiteName, projectId) {
        return __awaiter(this, void 0, void 0, function () {
            var projectTree, searchQueue, suiteId, i, tempSuite, j;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getProjectTreeById(projectId)];
                    case 1:
                        projectTree = _a.sent();
                        searchQueue = [];
                        suiteId = [];
                        i = 0;
                        _a.label = 2;
                    case 2:
                        if (!(i < projectTree.length)) return [3 /*break*/, 11];
                        return [4 /*yield*/, searchQueue.push(projectTree[i])];
                    case 3:
                        _a.sent();
                        _a.label = 4;
                    case 4:
                        if (!(searchQueue.length != 0 && searchQueue != null)) return [3 /*break*/, 10];
                        return [4 /*yield*/, searchQueue.shift()];
                    case 5:
                        tempSuite = _a.sent();
                        if (tempSuite === undefined)
                            return [3 /*break*/, 4];
                        try {
                            if (tempSuite.name == suiteName) {
                                //store suiteId
                                suiteId.push(tempSuite.id);
                            }
                        }
                        catch (err) {
                            logger.debug(tempSuite);
                        }
                        if (!(!(tempSuite.children === undefined) && tempSuite.type == "suite")) return [3 /*break*/, 9];
                        j = 0;
                        _a.label = 6;
                    case 6:
                        if (!(j < tempSuite.children.length)) return [3 /*break*/, 9];
                        if (!(tempSuite.children[j].type == "suite")) return [3 /*break*/, 8];
                        return [4 /*yield*/, searchQueue.push(tempSuite.children[j])];
                    case 7:
                        _a.sent();
                        _a.label = 8;
                    case 8:
                        j++;
                        return [3 /*break*/, 6];
                    case 9: return [3 /*break*/, 4];
                    case 10:
                        i++;
                        return [3 /*break*/, 2];
                    case 11: return [2 /*return*/, suiteId];
                }
            });
        });
    };
    /**
     * Search cases by suite name.
     * [Abandon]
     * @param suiteName
     * @param projectName
     */
    TestItSDK.prototype.searchCasesBySuiteName = function (suiteName, projectName) {
        return __awaiter(this, void 0, void 0, function () {
            var projectId, caseKeyMap, prefixMap, prefix, suiteId, k, suiteTree, suite, path, i, i, flatResponse, j, caseKeyInfo;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getProjectIdByName(projectName)];
                    case 1:
                        projectId = _a.sent();
                        caseKeyMap = [];
                        return [4 /*yield*/, this.genPrefixProjectMap()];
                    case 2:
                        prefixMap = _a.sent();
                        return [4 /*yield*/, prefixMap.get(projectId)];
                    case 3:
                        prefix = _a.sent();
                        return [4 /*yield*/, this.getSuiteIdByName(suiteName, projectId)];
                    case 4:
                        suiteId = _a.sent();
                        logger.debug(suiteId);
                        // get suite tree by id and flat it get total case
                        logger.debug("Search for " + suiteId.length + " suite");
                        k = 0;
                        _a.label = 5;
                    case 5:
                        if (!(k < suiteId.length)) return [3 /*break*/, 12];
                        return [4 /*yield*/, this.getSuiteTreeById(suiteId[k])];
                    case 6:
                        suiteTree = _a.sent();
                        return [4 /*yield*/, this.getSuiteById(suiteId[k])];
                    case 7:
                        suite = _a.sent();
                        path = "";
                        for (i = 0; i < suite.ascendants.length; i++) {
                            path = "" + path + suite.ascendants[i].name + "/";
                        }
                        logger.debug("The path : " + path);
                        i = 0;
                        _a.label = 8;
                    case 8:
                        if (!(i < suiteTree.length)) return [3 /*break*/, 11];
                        return [4 /*yield*/, this.flat(suiteTree[i])];
                    case 9:
                        flatResponse = _a.sent();
                        for (j = 0; j < flatResponse.length; j++) {
                            caseKeyInfo = prefix + "-" + flatResponse[j].externalId;
                            logger.debug(caseKeyInfo);
                            caseKeyMap.push(caseKeyInfo);
                        }
                        _a.label = 10;
                    case 10:
                        i++;
                        return [3 /*break*/, 8];
                    case 11:
                        k++;
                        return [3 /*break*/, 5];
                    case 12:
                        logger.debug("Total Search Result : " + caseKeyMap.length);
                        return [2 /*return*/, caseKeyMap];
                }
            });
        });
    };
    /**
     * Store cases by suite name.
     * [Abandon]
     * @param suiteName
     * @param projectName
     * @param path
     */
    TestItSDK.prototype.storeCasesBySuiteName = function (suiteName, projectName, path, templatePath) {
        return __awaiter(this, void 0, void 0, function () {
            var caseKeyMap, i;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.searchCasesBySuiteName(suiteName, projectName)];
                    case 1:
                        caseKeyMap = _a.sent();
                        i = 0;
                        _a.label = 2;
                    case 2:
                        if (!(i < caseKeyMap.length)) return [3 /*break*/, 5];
                        return [4 /*yield*/, this.storeFileInTreeByCaseKey(caseKeyMap[i], path, templatePath)];
                    case 3:
                        _a.sent();
                        _a.label = 4;
                    case 4:
                        i++;
                        return [3 /*break*/, 2];
                    case 5: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Generate search query by project name、keywords and suite.
     * @param projectName
     * @param keywords
     * @param subtype
     */
    TestItSDK.prototype.generateQuery = function (searchOption) {
        return __awaiter(this, void 0, void 0, function () {
            var projectName, projectId, response, keyworsMap, subtypeMap, automatedByMap, fieldsIdMap, keyWordQuery, keywords, keywordsArr, i, subtypeQuery, subtype, subtypeArr, i, priorityQuery, priority, caseNameQuery, caseName, automatedByQuery, automatedBy, automatedByArr, i, dateCreatedQuery, dateCreated, dateValue, timeZone, dateUpdatedQuery, dateUpdated, dateValue, timeZone, query;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        projectName = searchOption.projectName;
                        return [4 /*yield*/, this.getProjectIdByName(projectName)];
                    case 1:
                        projectId = _a.sent();
                        return [4 /*yield*/, this.fetchFieldsInfoById(projectId)];
                    case 2:
                        response = _a.sent();
                        return [4 /*yield*/, this.getFieldsInfoMapByName(response, "Keywords")];
                    case 3:
                        keyworsMap = _a.sent();
                        return [4 /*yield*/, this.getFieldsInfoMapByName(response, "Subtype")];
                    case 4:
                        subtypeMap = _a.sent();
                        return [4 /*yield*/, this.getFieldsInfoMapByName(response, "Automated By")];
                    case 5:
                        automatedByMap = _a.sent();
                        return [4 /*yield*/, this.getFieldsIdMap(response)];
                    case 6:
                        fieldsIdMap = _a.sent();
                        keyWordQuery = "";
                        if (!(searchOption.keywords === undefined)) {
                            keywords = searchOption.keywords;
                            keywordsArr = [];
                            for (i = 0; i < keywords.length; i++) {
                                keywordsArr.push(keyworsMap.get(keywords[i]));
                            }
                            keyWordQuery = keyWordQuery + " and field." + fieldsIdMap.get("Keywords") + " in \"[" + keywordsArr + "]\"";
                        }
                        subtypeQuery = "";
                        if (!(searchOption.subtype === undefined)) {
                            subtype = searchOption.subtype;
                            subtypeArr = [];
                            for (i = 0; i < subtype.length; i++) {
                                subtypeArr.push(subtypeMap.get(subtype[i]));
                            }
                            subtypeQuery = subtypeQuery + " and field." + fieldsIdMap.get("Subtype") + " in \"[" + subtypeArr + "]\"";
                        }
                        priorityQuery = "";
                        if (!(searchOption.priority === undefined)) {
                            priority = searchOption.priority;
                            priorityQuery = priorityQuery + " and priority in \"[" + searchOption.priority + "]\"";
                        }
                        caseNameQuery = "";
                        if (!(searchOption.caseName === undefined)) {
                            caseName = searchOption.caseName;
                            caseNameQuery = caseNameQuery + " and case_name like \"'" + caseName + "'\"";
                        }
                        automatedByQuery = "";
                        if (!(searchOption.automatedBy === undefined)) {
                            automatedBy = searchOption.automatedBy;
                            automatedByArr = [];
                            for (i = 0; i < automatedBy.length; i++) {
                                automatedByArr.push(automatedByMap.get(automatedBy[i]));
                            }
                            automatedByQuery = automatedByQuery + " and field." + fieldsIdMap.get("Automated By") + " in \"[" + automatedByArr + "]\"";
                        }
                        dateCreatedQuery = "";
                        if (!(searchOption.dateCreated === undefined)) {
                            dateCreated = searchOption.dateCreated;
                            dateValue = [];
                            timeZone = new Date().getTimezoneOffset() * 60 * 1000;
                            dateValue[0] = new Date(dateCreated[0]).getTime() + timeZone;
                            dateValue[1] = new Date(dateCreated[1]).getTime() + timeZone;
                            dateCreatedQuery = dateCreatedQuery + " and date_created gte \"" + dateValue[0] + "\" and date_created lt \"" + dateValue[1] + "\"";
                        }
                        dateUpdatedQuery = "";
                        if (!(searchOption.dateUpdated === undefined)) {
                            dateUpdated = searchOption.dateUpdated;
                            dateValue = [];
                            timeZone = new Date().getTimezoneOffset() * 60 * 1000;
                            dateValue[0] = new Date(dateUpdated[0]).getTime() + timeZone;
                            dateValue[1] = new Date(dateUpdated[1]).getTime() + timeZone;
                            dateUpdatedQuery = dateUpdatedQuery + " and last_updated gte \"" + dateValue[0] + "\" and last_updated lt \"" + dateValue[1] + "\"";
                        }
                        query = "version eq \"active\" and project_id in \"[" + projectId + "]\"" + keyWordQuery + subtypeQuery + priorityQuery + caseNameQuery + automatedByQuery + dateCreatedQuery + dateUpdatedQuery;
                        return [2 /*return*/, query];
                }
            });
        });
    };
    /* Sync API */
    /**
     * Get sync projects.
     */
    TestItSDK.prototype.getSyncProjects = function () {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/api/internal/sync/projects";
                        headers = {
                            Authorization: this.accessToken,
                            "Content-type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get sync cases.
     */
    TestItSDK.prototype.getSyncCases = function () {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                url = this.endpoint + "/api/internal/sync/cases";
                headers = {
                    Authorization: this.accessToken,
                    "Content-type": "application/json"
                };
                config = { headers: headers };
                response = this.httpClient.get(url, config);
                return [2 /*return*/, response];
            });
        });
    };
    /* Get Store API */
    /**
     * Get store project by project id.
     * @param projectId
     */
    TestItSDK.prototype.getStoreProjectById = function (projectId) {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/api/internal/storage/project/" + projectId;
                        headers = {
                            Authorization: this.accessToken,
                            "Content-type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Get global data.
     * @return {Promise<IGlobalData>}
     */
    TestItSDK.prototype.getGlobalData = function () {
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/projects/static";
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    /**
     * Search for suggest cases by query.
     * @param pattern
     * @param limit
     */
    TestItSDK.prototype.getSuggestTestCases = function (pattern, limit) {
        if (limit === void 0) { limit = 10; }
        return __awaiter(this, void 0, void 0, function () {
            var url, headers, config, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        url = this.endpoint + "/api/v1/suggest/cases?search=" + pattern + "&limit=" + limit;
                        headers = {
                            Authorization: this.accessToken,
                            "Content-Type": "application/json"
                        };
                        config = { headers: headers };
                        return [4 /*yield*/, this.httpClient.get(url, config)];
                    case 1:
                        response = _a.sent();
                        return [2 /*return*/, response.data];
                }
            });
        });
    };
    TestItSDK.prototype.generateInfosByKey = function (key) {
        return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
            return [2 /*return*/];
        }); });
    };
    /**
     * Generate template info by key according to giving template
     * @param key
     * @param templatePath
     */
    TestItSDK.prototype.generateInfoByKeyInTemplate = function (key, templatePath) {
        return __awaiter(this, void 0, void 0, function () {
            var fs, responseData, templateInfo, matchRes, i, field, info, matchResTs, childrenLen, contentInfo, expandInfo, i, steps, expectedResult, i, _a, _b, _c, _d, i;
            return __generator(this, function (_e) {
                switch (_e.label) {
                    case 0:
                        fs = require("fs");
                        return [4 /*yield*/, this.getTestCaseByKey(key)];
                    case 1:
                        responseData = _e.sent();
                        templateInfo = fs.readFileSync(templatePath, "utf8");
                        matchRes = templateInfo.match(/.*[\n\t\s]*\$\{.*?\}[\n\t\s]*.*/g);
                        i = 0;
                        _e.label = 2;
                    case 2:
                        if (!(i < matchRes.length)) return [3 /*break*/, 6];
                        field = matchRes[i].split(":")[0].trim();
                        return [4 /*yield*/, this.fetchTemplateFieldInfo(responseData, field)];
                    case 3:
                        info = _e.sent();
                        if (!!(info === undefined)) return [3 /*break*/, 5];
                        return [4 /*yield*/, templateInfo.replace(/\$\{.*?\}/, info)];
                    case 4:
                        templateInfo = _e.sent();
                        _e.label = 5;
                    case 5:
                        i++;
                        return [3 /*break*/, 2];
                    case 6:
                        matchResTs = templateInfo.match(/.*\$\{.*?\}.*[\n\s\t\r]*.*/g);
                        childrenLen = responseData.children.length;
                        contentInfo = matchResTs[0] + "\n" + matchResTs[1] + "\n";
                        expandInfo = "";
                        for (i = 0; i < childrenLen; i++) {
                            expandInfo = "" + expandInfo + contentInfo;
                        }
                        templateInfo = templateInfo.replace(matchResTs[0] + "\n" + matchResTs[1], expandInfo);
                        steps = [];
                        expectedResult = [];
                        if (!(childrenLen != 0)) return [3 /*break*/, 11];
                        i = 0;
                        _e.label = 7;
                    case 7:
                        if (!(i < childrenLen)) return [3 /*break*/, 11];
                        _a = steps;
                        _b = i;
                        return [4 /*yield*/, this.stringFilter(responseData.children[i].name)];
                    case 8:
                        _a[_b] = _e.sent();
                        _c = expectedResult;
                        _d = i;
                        return [4 /*yield*/, this.stringFilter(responseData.children[i].expectedResult)];
                    case 9:
                        _c[_d] = _e.sent();
                        _e.label = 10;
                    case 10:
                        i++;
                        return [3 /*break*/, 7];
                    case 11:
                        //fill test steps
                        for (i = 0; i < childrenLen; i++) {
                            templateInfo = templateInfo
                                .replace("${}", steps[i])
                                .replace("${}", expectedResult[i]);
                        }
                        return [2 /*return*/, templateInfo];
                }
            });
        });
    };
    TestItSDK.prototype.getTestStepsInfo = function () {
        return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
            return [2 /*return*/];
        }); });
    };
    /**
     * Fetch template field information by field name
     * To fill template
     * @param responseData
     * @param field
     */
    TestItSDK.prototype.fetchTemplateFieldInfo = function (responseData, field) {
        return __awaiter(this, void 0, void 0, function () {
            var key, ascendantsLen, suiteInfo, name_1, valueLen, keywords, i, casePrioriy, valueLen, maintainers, i, docsArr, url, docs, ids, valueLen, subtype, i, subtypeStr, children, childrenLen, testStepsInfo, i, _a, _b, _c, ascendants, suiteTree, i, tempName, space, preconditions, matches, matchInfo, accountType, extensionType, entryPointStr;
            return __generator(this, function (_d) {
                switch (_d.label) {
                    case 0:
                        key = responseData.prefix + "-" + responseData.externalId;
                        if (!(field == "suite")) return [3 /*break*/, 1];
                        ascendantsLen = responseData.ascendants.length;
                        suiteInfo = responseData.ascendants[ascendantsLen - 1].name;
                        return [2 /*return*/, suiteInfo];
                    case 1:
                        if (!(field == "name")) return [3 /*break*/, 2];
                        name_1 = key + ":" + responseData.name;
                        return [2 /*return*/, name_1];
                    case 2:
                        if (!(field == "keywords")) return [3 /*break*/, 3];
                        valueLen = responseData.values.length;
                        keywords = [];
                        for (i = 0; i < valueLen; i++) {
                            // 224 is keywords field id
                            if (responseData.values[i].fieldId == 224) {
                                keywords.push(responseData.values[i].name);
                            }
                        }
                        // var keywordsStr = await this.convertoString(keywords);
                        // return keywordsStr;
                        return [2 /*return*/, keywords];
                    case 3:
                        if (!(field == "priority")) return [3 /*break*/, 4];
                        casePrioriy = "P" + responseData.priority;
                        return [2 /*return*/, casePrioriy];
                    case 4:
                        if (!(field == "maintainers")) return [3 /*break*/, 5];
                        valueLen = responseData.values.length;
                        maintainers = [];
                        for (i = 0; i < valueLen; i++) {
                            // 6615030 is keywords field id
                            if (responseData.values[i].fieldId == 6615030) {
                                maintainers.push(responseData.values[i].name);
                            }
                        }
                        // var maintainersStr = await this.convertoString(maintainers);
                        // return maintainersStr;
                        return [2 /*return*/, maintainers];
                    case 5:
                        if (!(field == "docs")) return [3 /*break*/, 7];
                        docsArr = [];
                        return [4 /*yield*/, this.endpoint + "/test-cases/" + key];
                    case 6:
                        url = _d.sent();
                        docsArr.push(url);
                        docs = this.convertoString(docsArr);
                        return [2 /*return*/, docs];
                    case 7:
                        if (!(field == "ids")) return [3 /*break*/, 8];
                        ids = key;
                        return [2 /*return*/, ids];
                    case 8:
                        if (!(field == "subtype")) return [3 /*break*/, 10];
                        valueLen = responseData.values.length;
                        subtype = [];
                        for (i = 0; i < valueLen; i++) {
                            // 6231852 is keywords field id
                            if (responseData.values[i].fieldId == 6231852) {
                                subtype[i] = responseData.values[i].name;
                            }
                        }
                        return [4 /*yield*/, this.convertoString(subtype)];
                    case 9:
                        subtypeStr = _d.sent();
                        return [2 /*return*/, subtypeStr];
                    case 10:
                        if (!(field == "testSteps")) return [3 /*break*/, 16];
                        children = responseData.children;
                        childrenLen = children.length;
                        testStepsInfo = [];
                        i = 0;
                        _d.label = 11;
                    case 11:
                        if (!(i < childrenLen)) return [3 /*break*/, 15];
                        _a = testStepsInfo;
                        _b = i;
                        _c = {};
                        return [4 /*yield*/, this.stringFilter(children[i].name)];
                    case 12:
                        _c.step = _d.sent();
                        return [4 /*yield*/, this.stringFilter(children[i].expectedResult)];
                    case 13:
                        _a[_b] = (_c.expectedResult = _d.sent(),
                            _c);
                        _d.label = 14;
                    case 14:
                        i++;
                        return [3 /*break*/, 11];
                    case 15: return [2 /*return*/, testStepsInfo];
                    case 16:
                        if (field == "ascendants") {
                            ascendants = responseData.ascendants;
                            suiteTree = "";
                            for (i = 0; i < ascendants.length; i++) {
                                tempName = ascendants[i].name;
                                space = new RegExp(" ", "g");
                                tempName = tempName.replace(space, "");
                                suiteTree = suiteTree + "/" + tempName;
                            }
                            suiteTree = suiteTree.replace(suiteTree.charAt(0), "");
                            return [2 /*return*/, suiteTree];
                        }
                        _d.label = 17;
                    case 17: return [4 /*yield*/, this.stringFilter(responseData.preconditions)];
                    case 18:
                        preconditions = _d.sent();
                        matches = preconditions.match(/Account type\(\/s\)\:[ ]*.*/);
                        //no matches
                        if (matches === undefined || matches === null) {
                            return [2 /*return*/];
                        }
                        else {
                            //match by special (/s):
                            matchInfo = matches[0].split("(/s):");
                        }
                        if (field == "preconditions") {
                            return [2 /*return*/, preconditions];
                        }
                        else if (field == "accountType") {
                            accountType = matchInfo[1].replace("Extension type", "").trim();
                            return [2 /*return*/, accountType];
                        }
                        else if (field == "extensionType") {
                            extensionType = matchInfo[2].replace("Entry point", "").trim();
                            return [2 /*return*/, extensionType];
                        }
                        else if (field == "entryPoint") {
                            entryPointStr = matchInfo[3].trim();
                            return [2 /*return*/, entryPointStr];
                        }
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Convert original array to string
     * @param original
     */
    TestItSDK.prototype.convertoString = function (original) {
        return __awaiter(this, void 0, void 0, function () {
            var result, i;
            return __generator(this, function (_a) {
                result = "";
                for (i = 0; i < original.length; i++) {
                    result = result + "\"" + original[i] + "\",";
                }
                result = result.substring(0, result.length - 1);
                return [2 /*return*/, result];
            });
        });
    };
    /**
     * Generate template information by key.
     * @param key Case key
     */
    TestItSDK.prototype.generateTemplatesInfoByKey = function (key) {
        return __awaiter(this, void 0, void 0, function () {
            var responseData, ascendantsLen, suite, nameInfo, casePrioriy, skip, skipReason, keywords, maintainers, valueLen, i, childrenLen, steps, expectedResult, i, _a, _b, _c, _d, importInfo, runTestInfo, asyncInfo, preStep, afterStep, preExpect, afterExpect, end, resInfo, resInfoStr, resInfoKeys, i, i, resultInfo, i;
            return __generator(this, function (_e) {
                switch (_e.label) {
                    case 0: return [4 /*yield*/, this.getTestCaseByKey(key)];
                    case 1:
                        responseData = _e.sent();
                        ascendantsLen = responseData.ascendants.length;
                        suite = responseData.ascendants[ascendantsLen - 1].name;
                        nameInfo = key + ":" + responseData.name;
                        casePrioriy = "P" + responseData.priority;
                        skip = true;
                        skipReason = "waiting for E2E deliver";
                        keywords = [];
                        maintainers = [];
                        valueLen = responseData.values.length;
                        //Refer to field id.
                        for (i = 0; i < valueLen; i++) {
                            if (responseData.values[i].fieldId == 224) {
                                keywords.push(responseData.values[i].name);
                            }
                            else if (responseData.values[i].fieldId == 6615030) {
                                maintainers.push(responseData.values[i].name);
                            }
                        }
                        steps = [];
                        expectedResult = [];
                        if (!((childrenLen = responseData.children.length) != 0)) return [3 /*break*/, 6];
                        i = 0;
                        _e.label = 2;
                    case 2:
                        if (!(i < childrenLen)) return [3 /*break*/, 6];
                        _a = steps;
                        _b = i;
                        return [4 /*yield*/, this.stringFilter(responseData.children[i].name)];
                    case 3:
                        _a[_b] = _e.sent();
                        _c = expectedResult;
                        _d = i;
                        return [4 /*yield*/, this.stringFilter(responseData.children[i].expectedResult)];
                    case 4:
                        _c[_d] = _e.sent();
                        _e.label = 5;
                    case 5:
                        i++;
                        return [3 /*break*/, 2];
                    case 6:
                        importInfo = "import { h, runTest } from '@src/init';\nimport { App } from \"@src/pageModels/app\";\nimport { StepWrapper } from \"@tests/stepWrapper\";\nimport { HomePageController } from \"@src/pageControllers/app/homePage\";\nimport MeetingRoomController from \"@src/pageControllers/app/homePage/meetingRoom\";\nimport { WebphoneSession } from \"ultron-client\";\nimport { LeftRailController } from \"@src/pageControllers/app/homePage/meetTab\";\nimport MeetingPageController from '@src/pageControllers/app/homePage/meetingPage';\nimport { sleep } from \"@src/libs/utils\";\n";
                        runTestInfo = "runTest({\n";
                        asyncInfo = "},async(t:any)=>{\n";
                        preStep = '\tawait h(t).When_("';
                        afterStep = ",async()=>{\n\t});\n";
                        preExpect = '\tawait h(t).Then_("';
                        afterExpect = ",async() => {\n\t});\n";
                        end = "\th(t).finish();\n});";
                        resInfo = {
                            suite: suite,
                            name: [nameInfo],
                            priority: casePrioriy,
                            skip: skip,
                            skipReason: skipReason,
                            keywords: keywords,
                            maintainers: maintainers
                        };
                        resInfoStr = JSON.stringify(resInfo);
                        resInfoKeys = Object.keys(resInfo);
                        for (i = 0; i < resInfoKeys.length; i++) {
                            resInfoStr = resInfoStr.replace("\"" + resInfoKeys[i] + "\"", resInfoKeys[i]);
                            resInfoStr = resInfoStr.replace("," + resInfoKeys[i], ",\n" + resInfoKeys[i]);
                        }
                        // delete the character of start and end
                        resInfoStr = resInfoStr.replace(resInfoStr.charAt(0), "");
                        resInfoStr = resInfoStr.replace(resInfoStr.charAt(resInfoStr.length - 1), "");
                        // add tab
                        for (i = 0; i < resInfoKeys.length; i++) {
                            resInfoStr = resInfoStr.replace("" + resInfoKeys[i], "\t" + resInfoKeys[i]);
                        }
                        resultInfo = "" + importInfo + runTestInfo + resInfoStr + "\n" + asyncInfo;
                        for (i = 0; i < childrenLen; i++) {
                            resultInfo = "" + resultInfo + preStep + steps[i] + "\"" + afterStep + preExpect + expectedResult[i] + "\"" + afterExpect;
                        }
                        resultInfo = "" + resultInfo + end;
                        return [2 /*return*/, resultInfo];
                }
            });
        });
    };
    /**
     * Write info to ouputstream and storage to file path.
     * @param info
     * @param filePath
     */
    TestItSDK.prototype.writeTemplateInfo = function (info, filePath) {
        return __awaiter(this, void 0, void 0, function () {
            var fs, infoWriteStream;
            return __generator(this, function (_a) {
                fs = require("fs");
                infoWriteStream = fs.createWriteStream(filePath);
                infoWriteStream.write(info, "UTF-8");
                infoWriteStream.end();
                infoWriteStream.on(filePath + "--Done", function () {
                    logger.debug("${filePath}--Done");
                });
                return [2 /*return*/];
            });
        });
    };
    /**
     * Store a template file to file path by case key.
     * @param key
     * @param filePath
     */
    TestItSDK.prototype.storeTemplateInfoByCaseKey = function (key, filePath) {
        return __awaiter(this, void 0, void 0, function () {
            var info;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.generateTemplatesInfoByKey(key)];
                    case 1:
                        info = _a.sent();
                        filePath = "" + filePath + key + ".test.ts";
                        this.writeTemplateInfo(info, filePath);
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Store template info for file tree by case key.
     * @param key
     * @param filePath
     */
    TestItSDK.prototype.storeFileInTreeByCaseKey = function (key, filePath, templatePath) {
        return __awaiter(this, void 0, void 0, function () {
            var response, ascendants, suiteTree, i, tempName, space;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getTestCaseByKey(key)];
                    case 1:
                        response = _a.sent();
                        ascendants = response.ascendants;
                        suiteTree = "";
                        for (i = 0; i < ascendants.length; i++) {
                            tempName = ascendants[i].name;
                            space = new RegExp(" ", "g");
                            tempName = tempName.replace(space, "");
                            suiteTree = suiteTree + "/" + tempName;
                        }
                        suiteTree = suiteTree.replace(suiteTree.charAt(0), "");
                        filePath = "" + filePath + suiteTree;
                        this.writeInfoByCreateDir(key, filePath, templatePath);
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Store file by case key
     * @param key
     * @param filePath
     * @param templatePath
     */
    TestItSDK.prototype.storeFileByCaseKey = function (key, filePath, templatePath) {
        return __awaiter(this, void 0, void 0, function () {
            var response, caseInfo, fs, templateInfo;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getTestCaseByKey(key)];
                    case 1:
                        response = _a.sent();
                        return [4 /*yield*/, this.fillCaseInfoMap(key, response)];
                    case 2:
                        caseInfo = _a.sent();
                        fs = require("fs");
                        //make sure template path is true
                        if (templatePath === undefined) {
                            templateInfo = fs.readFileSync("../templates/Default.txt", "UTF-8", function (err) {
                                throw new Error("Can't not find default.txt");
                            });
                        }
                        else {
                            templateInfo = fs.readFileSync(templatePath, "UTF-8", function (err) {
                                throw new Error("Can't not find " + templatePath);
                            });
                        }
                        return [4 /*yield*/, this.storeFileInTree(caseInfo, filePath, templateInfo)];
                    case 3:
                        _a.sent();
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Store and fill templateInfo
     * @param caseInfo
     * @param filePath
     * @param templateInfo
     */
    TestItSDK.prototype.storeFileInTree = function (caseInfo, filePath, templateInfo) {
        return __awaiter(this, void 0, void 0, function () {
            var resultInfo, fileName, Mustache;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        resultInfo = templateInfo;
                        filePath = "" + filePath + caseInfo.ascendants;
                        fileName = filePath + "/" + caseInfo.id + ".test.ts";
                        Mustache = require("mustache");
                        Mustache.parse(templateInfo);
                        resultInfo = Mustache.render(templateInfo, caseInfo);
                        // logger.debug(resultInfo);
                        // logger.debug(filePath);
                        //write resultInfo into path
                        return [4 /*yield*/, this.writeInfo(resultInfo, filePath, fileName)];
                    case 1:
                        // logger.debug(resultInfo);
                        // logger.debug(filePath);
                        //write resultInfo into path
                        _a.sent();
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Write info by create dir.
     * @param info
     * @param filePath
     */
    TestItSDK.prototype.writeInfoByCreateDir = function (key, filePath, templatePath) {
        return __awaiter(this, void 0, void 0, function () {
            var info, mkdirp, fs, testFile, infoWriteStream;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!!(templatePath === undefined)) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.generateInfoByKeyInTemplate(key, templatePath)];
                    case 1:
                        info = _a.sent();
                        return [3 /*break*/, 4];
                    case 2: return [4 /*yield*/, this.generateTemplatesInfoByKey(key)];
                    case 3:
                        info = _a.sent();
                        _a.label = 4;
                    case 4:
                        mkdirp = require("mkdirp");
                        return [4 /*yield*/, mkdirp(filePath)];
                    case 5:
                        _a.sent(); //.then((made: any) => logger.debug(`Create in ${made}`));
                        fs = require("fs");
                        testFile = filePath + "/" + key + ".test.ts";
                        logger.debug("Store " + testFile);
                        return [4 /*yield*/, fs.createWriteStream(testFile)];
                    case 6:
                        infoWriteStream = _a.sent();
                        return [4 /*yield*/, infoWriteStream.write(info, "UTF-8")];
                    case 7:
                        _a.sent();
                        return [4 /*yield*/, infoWriteStream.end()];
                    case 8:
                        _a.sent();
                        infoWriteStream.on(filePath + "--Done", function () {
                            logger.debug("${filePath}--Done");
                        });
                        infoWriteStream.on("error", function (err) {
                            logger.debug(err.stack);
                        });
                        return [2 /*return*/];
                }
            });
        });
    };
    TestItSDK.prototype.writeInfo = function (info, filePath, fileName) {
        return __awaiter(this, void 0, void 0, function () {
            var mkdirp, fs, infoWriteStream;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        mkdirp = require("mkdirp");
                        return [4 /*yield*/, mkdirp(filePath)];
                    case 1:
                        _a.sent(); //.then((made: any) => logger.debug(`Create in ${made}`));
                        fs = require("fs");
                        logger.debug("Store " + fileName);
                        return [4 /*yield*/, fs.createWriteStream(fileName)];
                    case 2:
                        infoWriteStream = _a.sent();
                        return [4 /*yield*/, infoWriteStream.write(info, "UTF-8")];
                    case 3:
                        _a.sent();
                        return [4 /*yield*/, infoWriteStream.end()];
                    case 4:
                        _a.sent();
                        infoWriteStream.on(fileName + "--Done", function () {
                            logger.debug("${fileName}--Done");
                        });
                        infoWriteStream.on("error", function (err) {
                            logger.debug(err.stack);
                        });
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Make directory.
     * @param dir
     */
    TestItSDK.prototype.mkdir = function (dir) {
        return __awaiter(this, void 0, void 0, function () {
            var fs;
            return __generator(this, function (_a) {
                fs = require("fs");
                fs.mkdir(dir, function (err) {
                    if (err) {
                        logger.debug(err);
                        return;
                    }
                });
                return [2 /*return*/];
            });
        });
    };
    /**
     * Filter string with special character.
     * @param str
     */
    TestItSDK.prototype.stringFilter = function (str) {
        return __awaiter(this, void 0, void 0, function () {
            var newLine, quota;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!(str != null)) return [3 /*break*/, 3];
                        newLine = "\n[\n]*";
                        quota = '"';
                        return [4 /*yield*/, str
                                .replace(new RegExp("<.*?>", "g"), "")
                                .replace(new RegExp(newLine, "g"), " ")
                                .replace(new RegExp(quota, "g"), "'")];
                    case 1:
                        str = _a.sent(); // RegExp = "\<.*?\>" all block
                        str = str.trim();
                        str = unescape(str); //url
                        return [4 /*yield*/, this.htmlDecodeByRegExp(str)];
                    case 2:
                        // str = decodeURIComponent(str);//uri
                        str = _a.sent(); //html tags
                        _a.label = 3;
                    case 3: return [2 /*return*/, str];
                }
            });
        });
    };
    TestItSDK.prototype.htmlDecodeByRegExp = function (str) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (str.length == 0)
                            return [2 /*return*/, ""];
                        return [4 /*yield*/, str
                                .replace(/&amp;/g, "&")
                                .replace(/&lt;/g, "<")
                                .replace(/&gt;/g, ">")
                                .replace(/&nbsp;/g, " ")
                                .replace(/&#39;/g, "'")
                                .replace(/&quot;/g, '"')];
                    case 1:
                        str = _a.sent();
                        return [2 /*return*/, str];
                }
            });
        });
    };
    return TestItSDK;
}());
exports.default = TestItSDK;
// // /**
// //  * Test Modules
// //  */
// async function testitDemo() {
//   /* Login require information */
//   const TESTIT_ENDPOINT = "https://testit.ringcentral.com";
//   const testItSdk = new TestItSDK(TESTIT_ENDPOINT);
//   // const username: string  = process.env.USERNAME;
//   // const password: string  = process.env.PASSWORD;
//   //   await testItSdk.searchCasesBySearchOptions(searchOption);
//   /* 1、Test login function. */
//   // logger.debug(USERNAME);
//   // logger.debug(USERNAME);
//   //config my debug
//   const log4js = require('log4js');
//   log4js.configure({
//       appenders: { console: { type: 'console' } },
//       categories: { default: { appenders: ['console'], level: 'debug' } }
//   });
//   await testItSdk.login(USERNAME, PASSWORD);
//   const searchOption: SearchOptions = {
//     projectName: "Jupiter",
//     subtype:["E2E"],
//     dateCreated :["2021-01-01","2021-01-10"],
//     dateUpdated :["2021-01-01","2021-01-10"]
//   };
//   //   var output = Mustache.render("{{title}} sßpends {{calc}}", view);
//   //   logger.debug(output);
//   const path = "../templateFiles/";
//   const templatePath = "../templates/JupiterTemplate.ts.txt";
//   // await testItSdk.searchCasesBySearchOptions(searchOption);
//   // await testItSdk.storeFileByCaseKey("JPT-5660",path,templatePath);
//   // await testItSdk.searchCasesBySearchOptions(searchOption);
//   await testItSdk.storeFilesBySearchOptions(searchOption, path, templatePath);
// }
// testitDemo();