fix: 测试集合运行页面bug

This commit is contained in:
gaoxiaolin.gao 2018-05-17 14:59:57 +08:00
parent be4e449190
commit 88ffc90560
8 changed files with 520 additions and 483 deletions

View File

@ -1,12 +1,15 @@
### v1.3.16
* 支持自定义域名邮箱登录
* 测试用例支持导入不同项目接口
#### Bug Fixed
* postman headers 为 null 时报错
* format-data 数据解析不成功
* 导出的接口顺序希望按照api的接口顺序
### v1.3.15

View File

@ -1,122 +1,4 @@
<h1 class="curproject-name"> swagger_test </h1>
啊啊啊啊啊啊
# eeeeeee
[TOC]
## 13%0A%3Ca%20id%3D13%3E%20%3C/a%3E
[TOC]
### 基本信息
**Path** /api/13
**Method** GET
**接口描述:**
### 请求参数
**Query**
| 参数名称 | 是否必须 | 示例 | 备注 |
| ------------ | ------------ | ------------ | ------------ |
| qqq | 是 | | |
| wwww | 是 | | |
| wwwww | 是 | | |
### 返回数据
<table>
<thead class="ant-table-thead">
<tr>
<th key=name>名称</th><th key=type>类型</th><th key=required>是否必须</th><th key=default>默认值</th><th key=desc>备注</th><th key=sub>其他信息</th>
</tr>
</thead><tbody className="ant-table-tbody"><tr key=0-0><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> id</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span>The unique identifier for product</span></td><td key=5></td></tr><tr key=0-1><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> name</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-2><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> price</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5><p key=1><span style="font-weight: '700'">最小值: </span><span>0</span></p></td></tr><tr key=0-3><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> arr</span></td><td key=1><span>string []</span></td><td key=2>非必须</td><td key=3></td><td key=4><span>sdfsdf</span></td><td key=5><p key=3><span style="font-weight: '700'">item 类型: </span><span>string</span></p></td></tr><tr key=0-4><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> tags</span></td><td key=1><span>object []</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5><p key=0><span style="font-weight: '700'">最小数量: </span><span>1</span></p><p key=1><span style="font-weight: '700'">元素是否都不同: </span><span>true</span></p><p key=3><span style="font-weight: '700'">item 类型: </span><span>object</span></p></td></tr><tr key=0-4-0><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> length</span></td><td key=1><span>number</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-4-1><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> width</span></td><td key=1><span>number</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-4-2><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> height</span></td><td key=1><span>number</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-5><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> dimensions</span></td><td key=1><span>object</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-5-0><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> length</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-5-1><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> width</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-5-2><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> height</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr>
</tbody>
</table>
## 16%0A%3Ca%20id%3D16%3E%20%3C/a%3E
[TOC]
### 基本信息
**Path** /api/16
**Method** GET
**接口描述:**
### 请求参数
### 返回数据
<table>
<thead class="ant-table-thead">
<tr>
<th key=name>名称</th><th key=type>类型</th><th key=required>是否必须</th><th key=default>默认值</th><th key=desc>备注</th><th key=sub>其他信息</th>
</tr>
</thead><tbody className="ant-table-tbody"><tr key=0-0><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> success</span></td><td key=1><span>boolean</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5><p key=0><span style="font-weight: '700'">枚举: </span><span>true,false</span></p></td></tr><tr key=0-1><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> data</span></td><td key=1><span>object</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-1-0><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> success</span></td><td key=1><span>boolean</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5><p key=0><span style="font-weight: '700'">枚举: </span><span>true</span></p></td></tr><tr key=0-1-1><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> data</span></td><td key=1><span>object</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-1-1-0><td key=0><span style="padding-left: 40px"><span style="color: #8c8a8a">├─</span> count</span></td><td key=1><span>number</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-1-1-1><td key=0><span style="padding-left: 40px"><span style="color: #8c8a8a">├─</span> rows</span></td><td key=1><span>object []</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5><p key=3><span style="font-weight: '700'">item 类型: </span><span>object</span></p></td></tr><tr key=0-1-1-1-0><td key=0><span style="padding-left: 60px"><span style="color: #8c8a8a">├─</span> name</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-1-1-1-1><td key=0><span style="padding-left: 60px"><span style="color: #8c8a8a">├─</span> id</span></td><td key=1><span>string</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr>
</tbody>
</table>
## 22%0A%3Ca%20id%3D22%3E%20%3C/a%3E
[TOC]
### 基本信息
**Path** /api/22
**Method** POST
**接口描述:**
### 请求参数
**Headers**
| 参数名称 | 参数值 | 是否必须 | 示例 | 备注 |
| ------------ | ------------ | ------------ | ------------ | ------------ |
| Content-Type | application/json | 是 | | |
**Body**
<table>
<thead class="ant-table-thead">
<tr>
<th key=name>名称</th><th key=type>类型</th><th key=required>是否必须</th><th key=default>默认值</th><th key=desc>备注</th><th key=sub>其他信息</th>
</tr>
</thead><tbody className="ant-table-tbody"><tr key=0-0><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> id</span></td><td key=1><span>integer</span></td><td key=2>必须</td><td key=3></td><td key=4><span>The unique identifier for a product</span></td><td key=5></td></tr><tr key=0-1><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> name</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span>Name of the product</span></td><td key=5></td></tr><tr key=0-2><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> price</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5><p key=1><span style="font-weight: '700'">最小值: </span><span>0</span></p></td></tr>
</tbody>
</table>
### 返回数据
```javascript
/**
* 这是一个 response 事例
*/
{
"errcode": 0, //错误编码
"data": {
"id": "uuid-xxx", //产品id
"name": "iphone" //产品名称
}
}
```
# ee
[TOC]
# tag
[TOC]
# %u545C%u545C%u545C
[TOC]
<h1 class="curproject-name"> eererer </h1>

File diff suppressed because it is too large Load Diff

View File

@ -4,10 +4,10 @@ const projectModel = require('models/project.js');
const interfaceCatModel = require('models/interfaceCat.js');
const yapi = require('yapi.js');
const markdownIt = require("markdown-it");
const markdownItAnchor = require("markdown-it-anchor");
const markdownItTableOfContents = require("markdown-it-table-of-contents");
const defaultTheme = require("./defaultTheme.js");
const markdownIt = require('markdown-it');
const markdownItAnchor = require('markdown-it-anchor');
const markdownItTableOfContents = require('markdown-it-table-of-contents');
const defaultTheme = require('./defaultTheme.js');
const md = require('../../common/markdown');
// const htmlToPdf = require("html-pdf");
@ -20,94 +20,91 @@ class exportController extends baseController {
}
async handleListClass(pid, status) {
let result = await this.catModel.list(pid), newResult = [];
let result = await this.catModel.list(pid),
newResult = [];
for (let i = 0, item, list; i < result.length; i++) {
item = result[i].toObject()
list = await this.interModel.listByInterStatus(item._id, status)
for (let j = 0; j < list.length; j++) {
list[j] = list[j].toObject()
item = result[i].toObject();
list = await this.interModel.listByInterStatus(item._id, status);
list = list.sort((a, b) => {
return a.index - b.index;
});
if (list.length > 0) {
item.list = list;
newResult[i] = item;
}
item.list = list;
newResult[i] = item
}
return newResult;
}
handleExistId(data){
handleExistId(data) {
function delArrId(arr, fn) {
if (!Array.isArray(arr)) return;
arr.forEach(item => {
delete item._id;
delete item.__v;
delete item.uid;
delete item.edit_uid;
delete item.catid;
delete item.project_id;
function delArrId(arr, fn){
if(!Array.isArray(arr))return;
arr.forEach(item=>{
delete item._id
delete item.__v
delete item.uid
delete item.edit_uid
delete item.catid
delete item.project_id
if(typeof fn === 'function') fn(item)
})
if (typeof fn === 'function') fn(item);
});
}
delArrId(data, function(item){
delArrId(item.list, function(api){
delArrId(api.req_body_form)
delArrId(api.req_params)
delArrId(api.req_query)
delArrId(api.req_headers)
if(api.query_path && typeof api.query_path === 'object'){
delArrId(api.query_path.params)
}
})
})
delArrId(data, function(item) {
delArrId(item.list, function(api) {
delArrId(api.req_body_form);
delArrId(api.req_params);
delArrId(api.req_query);
delArrId(api.req_headers);
if (api.query_path && typeof api.query_path === 'object') {
delArrId(api.query_path.params);
}
});
});
return data;
}
async exportData(ctx) {
let pid = ctx.request.query.pid;
let type = ctx.request.query.type;
let status = ctx.request.query.status;
if (!pid) {
ctx.body = yapi.commons.resReturn(null, 200, "pid 不为空");
ctx.body = yapi.commons.resReturn(null, 200, 'pid 不为空');
}
let curProject;
let tp = "";
let tp = '';
try {
curProject = await this.projectModel.get(pid);
ctx.set("Content-Type", "application/octet-stream");
ctx.set('Content-Type', 'application/octet-stream');
const list = await this.handleListClass(pid, status);
switch (type) {
case "markdown": {
case 'markdown': {
tp = await createMarkdown.bind(this)(list, false);
ctx.set("Content-Disposition", `attachment; filename=api.md`);
return ctx.body = tp;
ctx.set('Content-Disposition', `attachment; filename=api.md`);
return (ctx.body = tp);
}
case "json": {
let data = this.handleExistId(list)
tp = JSON.stringify(data, null,2);
ctx.set("Content-Disposition", `attachment; filename=api.json`);
return ctx.body = tp;
case 'json': {
let data = this.handleExistId(list);
tp = JSON.stringify(data, null, 2);
ctx.set('Content-Disposition', `attachment; filename=api.json`);
return (ctx.body = tp);
}
default: {//默认为html
default: {
//默认为html
tp = await createHtml.bind(this)(list);
ctx.set("Content-Disposition", `attachment; filename=api.html`);
return ctx.body = tp;
ctx.set('Content-Disposition', `attachment; filename=api.html`);
return (ctx.body = tp);
}
}
} catch (error) {
yapi.commons.log(error, 'error');
ctx.body = yapi.commons.resReturn(null, 502, "下载出错");
ctx.body = yapi.commons.resReturn(null, 502, '下载出错');
}
async function createHtml(list) {
let md = await createMarkdown.bind(this)(list, true);
let markdown = markdownIt({ html: true, breaks: true });
@ -115,21 +112,23 @@ class exportController extends baseController {
markdown.use(markdownItTableOfContents, {
markerPattern: /^\[toc\]/im
});
require('fs').writeFileSync('./a.markdown', md)
require('fs').writeFileSync('./a.markdown', md);
let tp = unescape(markdown.render(md));
let left;
// console.log('tp',tp);
let content = tp.replace(/<div\s+?class="table-of-contents"\s*>[\s\S]*?<\/ul>\s*<\/div>/gi, function (match) {
left = match;
return '';
});
// console.log('left',left);
return createHtml5(left, content);
let content = tp.replace(
/<div\s+?class="table-of-contents"\s*>[\s\S]*?<\/ul>\s*<\/div>/gi,
function(match) {
left = match;
return '';
}
);
console.log('left', left);
return createHtml5(left || '', content);
}
function createHtml5(left, tp) {
//html5模板
let html = `<!DOCTYPE html>
@ -162,7 +161,8 @@ class exportController extends baseController {
return html;
}
function createMarkdown(list, isToc) {//拼接markdown
function createMarkdown(list, isToc) {
//拼接markdown
//模板
let mdTemplate = ``;
try {
@ -173,11 +173,10 @@ class exportController extends baseController {
return mdTemplate;
} catch (e) {
yapi.commons.log(e, 'error');
ctx.body = yapi.commons.resReturn(null, 502, "下载出错");
ctx.body = yapi.commons.resReturn(null, 502, '下载出错');
}
}
}
}
module.exports = exportController;
module.exports = exportController;

View File

@ -442,7 +442,7 @@ class interfaceController extends baseController {
item = result[i].toObject()
list = await this.Model.listByCatid(item._id)
for (let j = 0; j < list.length; j++) {
list[j] = list[j].toObject()
list[j] = list[j].toObject()
}
item.list = list;
@ -1020,6 +1020,7 @@ class interfaceController extends baseController {
let res = yapi.commons.schemaToJson(schema, {
alwaysFakeOptionals: required ? true : false
})
// console.log('res',res)
return ctx.body = res;
}

View File

@ -333,7 +333,20 @@ class interfaceColController extends baseController {
let interfaceData = await this.interfaceModel.get(params.interface_list[i]);
data.interface_id = params.interface_list[i];
data.casename = interfaceData.title;
data.req_body_other = interfaceData.req_body_other;
// 处理json schema 解析
if(interfaceData.req_body_type === 'json' && interfaceData.req_body_other && interfaceData.req_body_is_json_schema) {
let req_body_other = yapi.commons.json_parse(interfaceData.req_body_other)
req_body_other = yapi.commons.schemaToJson(req_body_other, {
alwaysFakeOptionals: true
})
data.req_body_other = JSON.stringify(req_body_other)
} else {
data.req_body_other = interfaceData.req_body_other;
}
data.req_body_type = interfaceData.req_body_type;
let caseResultData= await this.caseModel.save(data);
let username = this.getUsername();

View File

@ -147,8 +147,9 @@ class openController extends baseController{
let item = caseList[i];
item.id = item._id;
item.case_env = curEnv || item.case_env;
item.req_headers = this.handleReqHeader(item.req_headers, projectData.env, curEnv)
item.req_headers = this.handleReqHeader(item.req_headers, projectData.env, item.case_env)
item.pre_script = projectData.pre_script;
item.after_script = projectData.after_script;
item.env= projectData.env;

View File

@ -43,6 +43,7 @@ exports.schemaToJson = function(schema, options={}){
let result
try{
result = jsf(schema)
}catch(err){
result = err.message
}