@magic-num/fileclient
Version:
247 lines (212 loc) • 6.55 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _core = require("@magic-num/core");
var _tree = _interopRequireDefault(require("./tree"));
var _handler = _interopRequireDefault(require("./handler"));
var FileClient =
/*#__PURE__*/
function () {
function FileClient() {
(0, _classCallCheck2.default)(this, FileClient);
this.handlers = [];
this.mockDelay = false;
this.currentTestSuite = null; // 当前选中的TestSuite
this.testsuites = {};
}
(0, _createClass2.default)(FileClient, [{
key: "addHandler",
value: function addHandler(handler) {
this.handlers.push(handler);
}
}, {
key: "addTestSuite",
value: function addTestSuite(suite) {
this.testsuites[suite.name] = suite;
}
}, {
key: "req",
value: function req(uri, conf) {
return this.request(uri, conf);
}
}, {
key: "request",
value: function request(uri) {
var conf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (this.currentTestSuite) {
if (this.currentTestSuite && this.currentTestSuite.handlers[uri]) {
return this.useTestSuite(this.currentTestSuite, uri, conf);
} else {
throw new Error("Current TestSuite does not contain ".concat(uri));
}
}
var handler = this.findHandler(uri, conf);
return this.executeHandler(handler, conf);
}
/**
* 获得给定接口
* @param {*} uri
* @param {*} updateCounter
*/
}, {
key: "filterTestcase",
value: function filterTestcase(_ref) {
var uri = _ref.uri,
_ref$filter = _ref.filter,
filter = _ref$filter === void 0 ? function () {
return true;
} : _ref$filter;
var handlers = this.handlers.filter(function (h) {
return h.id === uri;
});
if (handlers.length === 1) {
return handlers[0].filterTestcase(filter, this.coverage);
} else {
throw new Error("\u8BF7\u6C42".concat(uri, "\u65F6\u53D1\u751F\u9519\u8BEF"));
}
}
/**
* 设置当前的testsuite
* @param {*} name
*/
}, {
key: "setCurrentSuite",
value: function setCurrentSuite(_name) {
if (_name === null) {
this.currentTestSuite = null;
console.info('取消TestSuite设置');
return;
}
var name = "".concat(_name, ".json");
var h = this.testsuites[name];
if (h) {
this.currentTestSuite = h;
Object.values(h.handlers).forEach(function (item) {
item.counter = 0;
});
console.info("TestSuite\u8BBE\u7F6E\u66F4\u65B0\u4E3A".concat(name));
} else {
throw new Error("TestSuite ".concat(name, " not exist"));
}
}
/**
* 通用testcase匹配
* @param {*} uri
* @param {*} conf
*/
}, {
key: "useTestSuite",
value: function useTestSuite(suite, uri) {
var conf = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var matches = this.handlers.filter(function (handler) {
return handler.uri.test(uri);
});
if (matches.length === 1) {
var h = matches[0];
conf.accept = suite.accept(h);
if (h.counter) {
h.counter++;
} else {
h.counter = 1;
}
conf.counter = h.counter;
return this.executeHandler(h, conf);
} else {
return Promise.reject(new Error("".concat(uri, "\u5339\u914D\u5230").concat(matches.length, "\u4E2A\u7ED3\u679C")));
}
}
}, {
key: "executeHandler",
value: function executeHandler(handler, conf) {
var _this = this;
return new Promise(function (resolve, reject) {
if (_this.coverage === true) {
conf.__coverage__ = true;
}
try {
if (_this.mockDelay) {
setTimeout(function () {
resolve(handler.execute(conf));
}, Math.random() * 500 + 500);
} else {
resolve(handler.execute(conf));
}
} catch (e) {
reject(e);
}
});
}
/**
* 获得给定接口
* @param {*} uri
* @param {*} updateCounter
*/
}, {
key: "findHandler",
value: function findHandler(uri) {
var handlers = this.handlers.filter(function (h) {
return h.id === uri;
});
if (handlers.length === 1) {
return handlers[0];
} else {
throw new Error("\u8BF7\u6C42".concat(uri, "\u65F6\u53D1\u751F\u9519\u8BEF"));
}
}
}, {
key: "getTestSuites",
value: function getTestSuites(folder) {
var _this2 = this;
var files = _fs.default.readdirSync(folder);
var items = files.filter(function (f) {
return /\.json$/i.test(f);
}).map(function (file) {
return {
name: file,
path: _path.default.join(folder, file)
};
}).filter(function (item) {
var s = _fs.default.statSync(item.path);
return s.isFile();
});
items.forEach(function (item) {
var raw = _fs.default.readFileSync(item.path);
var json = JSON.parse(raw);
_this2.testsuites[item.name] = _core.TestSuite.fromJSON(json);
});
}
}], [{
key: "fromTree",
value: function fromTree(tree) {
var s = new FileClient();
Object.keys(tree).forEach(function (k) {
var api = tree[k];
var handler = new _handler.default(k);
Object.values(api).forEach(function (item) {
var tc = _core.TestCase.fromJSON(item.json); // tc.id = tc.id || item.id
handler.addTestCase(tc);
});
s.addHandler(handler);
});
return s;
}
}, {
key: "fromPath",
value: function fromPath(folder) {
var result = _tree.default.walk("".concat(folder, "/testcase/"));
var tree = result.tree;
var client = FileClient.fromTree(tree);
client.getTestSuites("".concat(folder, "/testsuite"));
return client;
}
}]);
return FileClient;
}();
exports.default = FileClient;