Merge branch 'master' into 'sprint/178_mayue_17015'

# Conflicts:
#   module/product/control.php
This commit is contained in:
朱金勇
2021-12-17 05:34:25 +00:00
41 changed files with 204 additions and 456 deletions

1
.gitignore vendored
View File

@@ -3,6 +3,7 @@ config/my.php
www/data/
www/install.php
www/upgrade.php
www/checklist.php
www/ok.txt
tools/*
release/*

View File

@@ -275,6 +275,7 @@ class baseEntry
global $app;
$app->setModuleName($moduleName);
$app->setMethodName($methodName);
$app->viewType = 'json';
/* Check user permission. */
$this->checkPriv();

View File

@@ -108,8 +108,6 @@ class baseHTML
*/
static public function a($href = '', $title = '', $misc = '', $newline = true)
{
global $config;
if(strlen(trim($title)) == 0) $title = $href;
$newline = $newline ? "\n" : '';

View File

@@ -164,10 +164,8 @@ $(document).ready(function()
{
$('.split-row').splitRow();
});
});
/**
* Redirect the parent window.
*

View File

@@ -2110,6 +2110,8 @@ EOD;
if(isset($this->app->user))
{
if(in_array($module, $this->config->programPriv->waterfall)) return true;
$this->app->user = $this->session->user;
if(!commonModel::hasPriv($module, $method)) $this->deny($module, $method);
}

View File

@@ -127,12 +127,6 @@ class projectModel extends model
if($projectID and strpos(",{$this->app->user->view->projects},", ",{$this->session->project},") === false and !empty($projects)) $this->accessDenied();
}
/* Reset program priv. */
$moduleName = $this->app->getModuleName();
$methodName = $this->app->getMethodName();
$this->loadModel('common')->resetProjectPriv($this->session->project);
if(!$this->common->isOpenMethod($moduleName, $methodName) and !commonModel::hasPriv($moduleName, $methodName)) $this->common->deny($moduleName, $methodName, false);
return $this->session->project;
}
@@ -2080,6 +2074,13 @@ class projectModel extends model
}
$this->lang->switcherMenu = $this->getSwitcher($objectID, $this->app->rawModule, $this->app->rawMethod);
/* Reset project priv. */
$moduleName = $this->app->getModuleName();
$methodName = $this->app->getMethodName();
$this->loadModel('common')->resetProjectPriv($objectID);
if(!$this->common->isOpenMethod($moduleName, $methodName) and !commonModel::hasPriv($moduleName, $methodName)) $this->common->deny($moduleName, $methodName, false);
common::setMenuVars('project', $objectID);
}
}

View File

@@ -8,10 +8,19 @@ title=测试API 获取bug列表
cid=1
pid=1
通过正确的productID获取bug列表的状态码 >> 200
通过错误的productID获取bug列表的状态码 >> 200
通过正确的productID获取bug列表的数量 >> 10
通过错误的productID获取bug列表的数量 >> 0
>> /bugs/
创建最少字段的Bug >> product required.
创建最少字段的Bug >> title required.
创建最少字段的Bug >> Bug1
创建最多字段的Bug >> Bug2
创建不存在产品的Bug >> product does not exist.
>> Bug2
>> Bug1
>> Bug1
>> Bug1
>> Bug3
>> Bug3
>> true
*/

View File

@@ -8,6 +8,15 @@ title=测试创建产品;
cid=1
pid=1
测试创建所属项目集为1的产品 >> CESHI1,CESHI1
测试创建独立产品 >> 0
测试产品名称为空的情况 >> 『产品名称』不能为空。
测试产品代号为空的情况 >> 『产品代号』不能为空。
测试状态码 >> 400
测试产品名称已存在 >> 『产品名称』已经有『CESHI1』这条记录了。如果您确定该记录已删除请到后台-系统-数据-回收站还原。
测试状态码 >> 400
测试产品代号已存在 >> 『产品代号』已经有『CESHI1』这条记录了。如果您确定该记录已删除请到后台-系统-数据-回收站还原。
*/
global $token;
$header = array('Token' => $token->token);
@@ -30,4 +39,4 @@ r($existedName->body->error) && p('name:0') && e('『产品名称』已经有『
$existedCode = $rest->post('/products', array('name' => 'CESHI4','code' => 'CESHI1'), $header);
r($existedCode->status_code) && p() && e('400'); //测试状态码
r($existedCode->body->error) && p('code:0') && e('『产品代号』已经有『CESHI1』这条记录了。如果您确定该记录已删除请到后台-系统-数据-回收站还原。'); //测试产品代号已存在
r($existedCode->body->error) && p('code:0') && e('『产品代号』已经有『CESHI1』这条记录了。如果您确定该记录已删除请到后台-系统-数据-回收站还原。'); //测试产品代号已存在

View File

@@ -8,6 +8,10 @@ title=测试删除产品;
cid=1
pid=1
调用成功返回200 >> 200
调用查找接口成功返回200 >> 200
已删除的产品的deleted字段为1 >> 1
*/
global $token;
$header = array('Token' => $token->token);
@@ -17,4 +21,4 @@ r($pass->status_code) && p('') && e('200'); //调用成功返回200
$findProduct = $rest->get('/products/190', $header);
r($findProduct->status_code) && p() && e('200'); //调用查找接口成功返回200
r($findProduct->body) && p('deleted') && e('1'); //已删除的产品的deleted字段为1
r($findProduct->body) && p('deleted') && e('1'); //已删除的产品的deleted字段为1

View File

@@ -8,6 +8,10 @@ title=测试获取产品详情;
cid=1
pid=1
调用成功返回200 >> 200
期望code为code1 >> code1
ID为1000的产品不存在返回401 >> 404
*/
global $token;
$header = array('Token' => $token->token);
@@ -17,4 +21,4 @@ r($pass->status_code) && p() && e('200'); //调用成功返回200
r($pass->body) && p('code') && e('code1'); //期望code为code1
$fail = $rest->get('/products/1000', $header);
r($fail->status_code) && p() && e('404'); //ID为1000的产品不存在返回401
r($fail->status_code) && p() && e('404'); //ID为1000的产品不存在返回401

View File

@@ -8,6 +8,18 @@ title=测试获取产品列表;
cid=1
pid=1
调用成功返回200 >> 200
测试所有产品的数量 >> 191
查看所有产品中第一个产品的ID和code >> 1,code1
调用成功返回200 >> 200
测试已关闭的产品的数量 >> 90
查看已关闭的第一个产品的ID和code >> 21,code21
调用成功返回200 >> 200
测试正常状态的产品的数量 >> 101
查看正常状态的第一个产品的ID和code >> 1,code1
调用成功,返回200 >> 200
测试使用错误的状态参数查询时结果为空 >> 0
*/
global $token;
$header = array('Token' => $token->token);
@@ -32,6 +44,4 @@ r($productList) && p('0:id,code') && e('1,code1'); //查看正
$statusError = $rest->get('/products?status=doing', $header);
r($statusError->status_code) && p() && e('200'); //调用成功,返回200
r(count($statusError->body->products)) && p() && e('0'); //测试使用错误的状态参数查询时结果为空
r(count($statusError->body->products)) && p() && e('0'); //测试使用错误的状态参数查询时结果为空

View File

@@ -8,9 +8,11 @@ title=测试修改产品信息;
cid=1
pid=1
调用成功返回200 >> 200
*/
global $token;
$header = array('Token' => $token->token);
$pass = $rest->put('/products/1', array('name' => '测试正常产品1'), $header);
r($pass->status_code) && p() && e('200'); //调用成功返回200
r($pass->status_code) && p() && e('200'); //调用成功返回200

View File

@@ -20,4 +20,4 @@ $stringIdError = $rest->get('/projects/test', array("Token" => $token->body->tok
r($project) && c('200') && p('project,type', ',') && e('0,project'); // 获取条目的project和type字段
r($zeroIdError) && c('404') && p('error') && e('404 Not found'); // 获取不存在的项目
r($stringIdError) && c('404') && p('error') && e('404 Not found'); // 获取错误ID的项目
r($stringIdError) && c('404') && p('error') && e('404 Not found'); // 获取错误ID的项目

View File

@@ -15,4 +15,4 @@ global $token;
$projects = $rest->get('/projects', array("Token" => $token));
$project = array(reset($projects->body->projects));
r($project) && p('project,type', ',') && e('0,project'); // 获取条目的project和type字段
r($project) && p('project,type', ',') && e('0,project'); // 获取条目的project和type字段

View File

@@ -8,6 +8,7 @@ title=创建项目;
cid=1
pid=1
>> Y-m-d
创建失败没有name字段 >> `『项目名称』`
创建失败没有code字段 >> `『项目代号』`
创建失败没有end字段 >> `『计划完成』`
@@ -58,4 +59,4 @@ r($noNameError) && p('error') && e('`『项目名称』`'); //
r($noCodeError) && p('error') && e('`『项目代号』`'); // 创建失败没有code字段
r($noEndError) && p('error') && e('`『计划完成』`'); // 创建失败没有end字段
r($project) && c('201') && p('name,code', ',') && e('test111,test222'); // 创建成功获取创建的name和code字段
r($error) && p('error') && e('`『test111』`'); // 创建失败,获取错误信息
r($error) && p('error') && e('`『test111』`'); // 创建失败,获取错误信息

View File

@@ -25,4 +25,4 @@ r($deleteNotExist) && c(200) && p() && e('{"message":"success"}'); // 使用不
$existCase = $rest->get('/testcases/1', $header);
$existCase->body = array($existCase->body);
r($existCase) && c(200) && p('title,deleted') && e('这个是测试用例1,1'); // 查询已删除的用例信息
r($existCase) && c(200) && p('title,deleted') && e('这个是测试用例1,1'); // 查询已删除的用例信息

View File

@@ -22,4 +22,4 @@ $existCase->body = array($existCase->body);
$noCase->body = array($noCase->body);
r($existCase) && c(200) && p('title') && e('这个是测试用例100'); // 使用正确用例id查询用例详情
r($noCase) && c(404) && p('error') && e('404 Not found'); // 使用不存在的用例id查询用例详情
r($noCase) && c(404) && p('error') && e('404 Not found'); // 使用不存在的用例id查询用例详情

View File

@@ -10,9 +10,10 @@ pid=1
使用正确产品id查询用例列表的状态码 >> 200
使用不存在的产品id查询用例列表的状态码 >> 200
使用产品id为0查询用例列表的状态码 >> "Need product or project or execution id.
使用正确产品id获取用例列表的数量 >> 50
使用不存在的产品id获取用例列表的数量 >> 0
使用正确产品id获取用例列表 >> 这个是测试用例51,这个是测试用例52
使用正确产品id获取用例列表 >> 这个是测试用例51,这个是测试用例52,这个是测试用例53,这个是测试用例54,这个是测试用例55,这个是测试用例56,这个是测试用例57,这个是测试用例58,这个是测试用例59,这个是测试用例60,这个是测试用例61,这个是测试用例62,这个是测试用例63,这个是测试用例64,这个是测试用例65,这个是测试用例66,这个是测试用例67,这个是测试用例68,这个是测试用例69,这个是测试用例70,这个是测试用例71,这个是测试用例72,这个是测试用例73,这个是测试用例74,这个是测试用例75,这个是测试用例76,这个是测试用例77,这个是测试用例78,这个是测试用例79,这个是测试用例80,这个是测试用例81,这个是测试用例82,这个是测试用例83,这个是测试用例84,这个是测试用例85,这个是测试用例86,这个是测试用例87,这个是测试用例88,这个是测试用例89,这个是测试用例90,这个是测试用例91,这个是测试用例92,这个是测试用例93,这个是测试用例94,这个是测试用例95,这个是测试用例96,这个是测试用例97,这个是测试用例98,这个是测试用例99,这个是测试用例100
*/
global $token;
@@ -33,4 +34,4 @@ $emptyCases = $notExistProductCases->body->testcases;
r(count($existCases)) && p() && e('50'); // 使用正确产品id获取用例列表的数量
r(count($emptyCases)) && p() && e('0'); // 使用不存在的产品id获取用例列表的数量
r($existCases) && p('title') && e('这个是测试用例51,这个是测试用例52,这个是测试用例53,这个是测试用例54,这个是测试用例55,这个是测试用例56,这个是测试用例57,这个是测试用例58,这个是测试用例59,这个是测试用例60,这个是测试用例61,这个是测试用例62,这个是测试用例63,这个是测试用例64,这个是测试用例65,这个是测试用例66,这个是测试用例67,这个是测试用例68,这个是测试用例69,这个是测试用例70,这个是测试用例71,这个是测试用例72,这个是测试用例73,这个是测试用例74,这个是测试用例75,这个是测试用例76,这个是测试用例77,这个是测试用例78,这个是测试用例79,这个是测试用例80,这个是测试用例81,这个是测试用例82,这个是测试用例83,这个是测试用例84,这个是测试用例85,这个是测试用例86,这个是测试用例87,这个是测试用例88,这个是测试用例89,这个是测试用例90,这个是测试用例91,这个是测试用例92,这个是测试用例93,这个是测试用例94,这个是测试用例95,这个是测试用例96,这个是测试用例97,这个是测试用例98,这个是测试用例99,这个是测试用例100'); // 使用正确产品id获取用例列表
r($existCases) && p('title') && e('这个是测试用例51,这个是测试用例52,这个是测试用例53,这个是测试用例54,这个是测试用例55,这个是测试用例56,这个是测试用例57,这个是测试用例58,这个是测试用例59,这个是测试用例60,这个是测试用例61,这个是测试用例62,这个是测试用例63,这个是测试用例64,这个是测试用例65,这个是测试用例66,这个是测试用例67,这个是测试用例68,这个是测试用例69,这个是测试用例70,这个是测试用例71,这个是测试用例72,这个是测试用例73,这个是测试用例74,这个是测试用例75,这个是测试用例76,这个是测试用例77,这个是测试用例78,这个是测试用例79,这个是测试用例80,这个是测试用例81,这个是测试用例82,这个是测试用例83,这个是测试用例84,这个是测试用例85,这个是测试用例86,这个是测试用例87,这个是测试用例88,这个是测试用例89,这个是测试用例90,这个是测试用例91,这个是测试用例92,这个是测试用例93,这个是测试用例94,这个是测试用例95,这个是测试用例96,这个是测试用例97,这个是测试用例98,这个是测试用例99,这个是测试用例100'); // 使用正确产品id获取用例列表

View File

@@ -17,4 +17,4 @@ $pass = $rest->post('/tokens', array('account' => 'admin', 'password' => '123qwe
$fail = $rest->post('/tokens', array('account' => 'admin', 'password' => '123'));
r($pass) && c(201) && p('token') && e('`[A-Za-z0-9]+`'); // 使用正确用户名和密码获取token
r($fail) && c(400) && p('error') && e('登录失败,请检查您的用户名或密码是否填写正确。'); // 使用正确用户名和密码获取token
r($fail) && c(400) && p('error') && e('登录失败,请检查您的用户名或密码是否填写正确。'); // 使用正确用户名和密码获取token

View File

@@ -8,11 +8,11 @@ title=删除用户;
cid=1
pid=1
删除用户 >> message:success
删除ID为10的用户判断返回信息 >> message:success
*/
global $token;
$result = $rest->delete('/users/10', array('token' => $token->token));
r($result) && c(200) && p() && e("message:success") ; //删除ID为10的用户判断返回信息
r($result) && c(200) && p() && e("message:success") ; //删除ID为10的用户判断返回信息

View File

@@ -6,14 +6,14 @@ fields:
- field: id
note: "id"
range: 1
- field: name
- field: name
note: "公司名"
range: 易软天创网络科技有限公司
- field: admins
- field: admins
note: "管理员"
prefix: ","
prefix: ","
range: admin
postfix: ","
postfix: ","
- field: phone
note: "电话"
range: 15666933065
@@ -23,9 +23,9 @@ fields:
- field: website
note: "网站"
range: www.zentao.net
- field: guest
- field: guest
note: "匿名登录"
range: 0
- field: deleted
- field: deleted
note: "是否删除"
range: 0

View File

@@ -8,12 +8,20 @@ fields:
- field: name
fields:
- field: name1
range: [@#$%%&&*((adfdfss,测试名称长度能有多长并且包含特殊字符的一个长长的字符串!@#¥%……&×()哈哈哈哈,一级部门]{5}
range: 产品部,开发部,测试部,运营部,开发部1,开发部2,测试名称长度能有多长并且包含特殊字符的一个长长的字符串!@#¥%……&×()哈哈哈哈,[一级部门,二级部门,三级部门]{10},其他部门{10000}
- field: name2
range: A-E
range: []{7},1-10,1-10,1-10,1-10000
- field: order
note: "排序"
range: 10-150:10,10-100:10{2!}
range: 1-10000
- field: path
note: "路径"
range: 1-10000
prefix: ","
postfix: ","
- field: grade
note: "层级"
range: 1
- field: position
range: ""
- field: function

View File

@@ -5,7 +5,14 @@ fields:
- field: project
range: 0
- field: model
range:
range: ""
- field: name
note: "名称"
fields:
- field: name1
range: "项目集"
- field: name2
range: 1-10000
- field: type
range: program
- field: status

View File

@@ -2,12 +2,17 @@ title: table zt_project
author: Zhu Jinyong
version: "1.0"
fields:
- field: id
range: 1-10000
- field: project
range: 1-10000
range: 0
- field: model
range:
range: ""
- field: name
note: "名称"
fields:
- field: name1
range: '项目'
- field: name2
range: []{100000}
- field: type
range: project
- field: lifetime

View File

@@ -12,7 +12,7 @@ fields:
format: ""
- field: type
note: "内外部人员"
range: inside{344},outside,inside
range: inside{900},outside,inside{10000}
prefix: ""
postfix: ""
loop: 0
@@ -25,9 +25,9 @@ fields:
note: "用户名"
fields:
- field: account1
range: admin,program1User,noprogram1user,product1user,noproduct1user,project1user,noproject1user,test{100},dev{200},pm{10},po{10},td{2},pd{2},qd{2},top{5},others{10},a,bb,ccc,qwuiadsd?!2as@#%$aasd~aj1!@#1
range: admin,user{99},test{100},dev{100},pm{100},po{100},td{100},pd{100},qd{100},top{100},outside{100},others{100},a,bb,ccc,qwuiadsd?!2as@#%$aasd~aj1!@#1
- field: account2
range: [],1-100,1-200,1-10,1-10,1-2,1-2,1-2,1-5,1-10
range: [],1-99,1-100,1-100,1-100,1-100,1-100,1-100,1-100,1-100,1-100,1-100,[]{4}
- field: password
note: "密码"
range: 123qwe!@#{346}
@@ -43,9 +43,9 @@ fields:
note: "真实姓名"
fields:
- field: realname1
range: admin,测试{100},开发{200},项目经理{10},产品经理{10},研发主管{2},产品主管{2},测试主管{2},高层管理{5},其他{10},短用户名,BB,CCC,非常长非常长的用户名怎么这么长?
range: admin,用户,测试{100},开发{100},项目经理{100},产品经理{100},研发主管{100},产品主管{100},测试主管{100},高层管理{100},用户{100},其他{100},A,BB,CCC,非常长非常长的用户名怎么这么长?
- field: realname2
range: [],1-100,1-200,1-10,1-10,1-2,1-2,1-2,1-5,1-10
range: [],1-99,1-100,1-100,1-100,1-100,1-100,1-100,1-100,1-100,1-100,1-100,[]{4}
- field: nickname
note: "昵称"
- field: commiter
@@ -148,6 +148,9 @@ fields:
- field: locked
note: "锁定时间"
range: 0
- field: company
note: "公司"
range: 1
- field: ranzhi
note: "ZDOO账号"
- field: score

View File

@@ -1,37 +0,0 @@
title: project
author: Zhu Jinyong
version: "1.0"
fields:
- field: project
range: 0
- field: model
range: scrum
- field: type
range: project
- field: status
range: wait
- field: percent
range: 0
- field: auth
range: extend,reset
- field: desc
range: 1-10000
prefix: "项目描述"
- field: acl
range: open{4},private{4}
- field: whitelist
froms:
- from: common.user.v1.yaml
use: empty{8}
- from: common.user.v1.yaml
use: empty{8}
prefix: ","
- from: common.user.v1.yaml
use: one{8}
prefix: ","
- from: common.user.v1.yaml
use: two{8}
prefix: ","
- from: common.user.v1.yaml
use: three{8}
prefix: ","

View File

@@ -1,8 +1,9 @@
<?php
$builder = new stdclass();
$builder->user = array('rows' => 1000, 'extends' => array('user'));
$builder->dept = array('rows' => 100, 'extends' => array('dept'));
$builder->company = array('rows' => 1, 'extends' => array('company'));
$builder->user = array('rows' => 1000, 'extends' => array('user'));
$builder->dept = array('rows' => 100, 'extends' => array('dept'));
$builder->program = array('rows' => 100, 'extends' => array('project', 'program'));
$builder->project = array('rows' => 100, 'extends' => array('project', 'project'));
@@ -15,6 +16,6 @@ $builder->branch = array('rows' => 240, 'extends' => array('branch'));
$builder->build = array('rows' => 8, 'extends' => array('build'));
$builder->release = array('rows' => 8, 'extends' => array('release'));
$builder->pipeline = array('rows' => 1, 'data' => array('pipeline'));
$builder->repo = array('rows' => 1, 'data' => array('repo'));
$builder->mr = array('rows' => 1, 'data' => array('mr'));
$builder->pipeline = array('rows' => 1, 'extends' => array('pipeline'));
$builder->repo = array('rows' => 1, 'extends' => array('repo'));
$builder->mr = array('rows' => 1, 'extends' => array('mr'));

View File

@@ -1,24 +0,0 @@
title: dept
author: Li yuhcun
version: "1.0"
fields:
- field: id
note: "ID"
range: 1-10000
- field: grade
note: "部门级别"
range: 1
- field: parent
note: "上级部门ID"
range: 0
- field: path
range: 1-15
prefix: ","
postfix: ","
- field: manager
note: "负责人"
fields:
- field: manager1
range: test{5},[]{5}
- field: manager2
range: 1-50:10,[]{5},51-100:10

View File

@@ -1,33 +0,0 @@
title: dept
author: Li yuhcun
version: "1.0"
fields:
- field: id
note: "ID"
range: 16-10000
- field: name
note: "部门名称"
fields:
- field: name1
range: 二级部门{10}
- field: name2
range: A-J
- field: grade
note: "部门级别"
range: 2
- field: parent
note: "上级部门ID"
range: 11
- field: path
fields:
- field: grade1
range: 11
prefix: ","
postfix: ","
- field: grade2
range: 16-25
postfix: ","
- field: manager
note: "负责人"
range: 1-200:10
prefix: "dev"

View File

@@ -1,36 +0,0 @@
title: dept
author: Li yuhcun
version: "1.0"
fields:
- field: id
note: "ID"
range: 26-10000
- field: name
note: "部门名称"
fields:
- field: name1
range: 三级部门{10}
- field: name2
range: A-J
- field: path
fields:
- field: grade1
range: 11
prefix: ","
postfix: ","
- field: grade2
range: 16
postfix: ","
- field: grade3
range: 26-25
postfix: ","
- field: grade
note: "部门级别"
range: 3
- field: parent
note: "上级部门ID"
range: 16
- field: manager
note: "负责人"
range: 101-200:10
prefix: "dev"

View File

@@ -1,60 +0,0 @@
title: project
author: Zhu Jinyong
version: "1.0"
fields:
- field: id
range: 241-10000
- field: name
fields:
- field: grade1
prefix: "测试项目"
range: 1-120
- field: grade2
prefix: "下的迭代"
range: 1-10000
- field: project
range: 121-130{15},131-240{5}
- field: model
range:
- field: type
range: sprint
- field: status
range: wait,doing
- field: percent
range: 0
- field: auth
range:
- field: desc
range: 1-10000
prefix: "迭代描述"
- field: grade
range: 1
- field: parent
range: 121-130{15},131-240{5}
- field: path
fields:
- field: grade1
prefix: ","
postfix: ","
range: 121-130{15},131-240{5}
- field: self
postfix: ","
range: 241-10000
- field: acl
range: open{4},private{4}
- field: whitelist
froms:
- from: common.user.v1.yaml
use: empty{8}
- from: common.user.v1.yaml
use: empty{8}
prefix: ","
- from: common.user.v1.yaml
use: one{8}
prefix: ","
- from: common.user.v1.yaml
use: two{8}
prefix: ","
- from: common.user.v1.yaml
use: three{8}
prefix: ","

View File

@@ -1,17 +0,0 @@
title: program
author: Zhu Jinyong
version: "1.0"
fields:
- field: id
range: 1-10000
- field: name
range: 1-10000
prefix: "一级测试项目集"
- field: grade
range: 1
- field: parent
range: 0
- field: path
prefix: ","
postfix: ","
range: 1-10000

View File

@@ -1,24 +0,0 @@
title: program
author: Zhu Jinyong
version: "1.0"
fields:
- field: id
range: 41-10000
- field: name
range: 41-10000
prefix: "二级测试项目集"
- field: type
range: program
- field: grade
range: 2
- field: parent
range: 1-40{2}
- field: path
fields:
- field: grade1
prefix: ","
postfix: ","
range: 1-40{2}
- field: self
postfix: ","
range: 41-10000

View File

@@ -1,25 +0,0 @@
title: program
author: Zhu Jinyong
version: "1.0"
fields:
- field: id
range: 81-10000
- field: name
range: 81-10000
prefix: "三级测试项目集"
- field: grade
range: 3
- field: parent
range: 41-80{2}
- field: path
fields:
- field: grade1
prefix: ","
postfix: ","
range: 1-40{2}
- field: grade2
postfix: ","
range: 41-80{2}
- field: self
postfix: ","
range: 81-10000

View File

@@ -1,21 +0,0 @@
title: program
author: Zhu Jinyong
version: "1.0"
fields:
- field: id
range: 121-10000
- field: name
range: 1-10000
prefix: "独立测试项目"
- field: status
range: wait
- field: grade
range: 1
- field: parent
range: 0
- field: path
fields:
- field: grade1
prefix: ","
postfix: ","
range: 121-10000

View File

@@ -1,24 +0,0 @@
title: program
author: Zhu Jinyong
version: "1.0"
fields:
- field: id
range: 131-10000
- field: name
range: 11-10000
prefix: "测试项目"
- field: status
range: wait
- field: grade
range: 2
- field: parent
range: 1-40{2}
- field: path
fields:
- field: grade1
prefix: ","
postfix: ","
range: 1-40{2}
- field: grade2
postfix: ","
range: 131-10000

View File

@@ -1,27 +0,0 @@
title: program
author: Zhu Jinyong
version: "1.0"
fields:
- field: id
range: 161-10000
- field: name
range: 41-10000
prefix: "测试项目"
- field: status
range: wait
- field: grade
range: 3
- field: parent
range: 41-80{2}
- field: path
fields:
- field: grade1
prefix: ","
postfix: ","
range: 1-40{2}
- field: grade2
postfix: ","
range: 41-80{2}
- field: self
postfix: ","
range: 161-10000

View File

@@ -1,30 +0,0 @@
title: program
author: Zhu Jinyong
version: "1.0"
fields:
- field: id
range: 201-10000
- field: name
range: 81-10000
prefix: "测试项目"
- field: status
range: wait
- field: grade
range: 4
- field: parent
range: 81-120{2}
- field: path
fields:
- field: grade1
prefix: ","
postfix: ","
range: 1-40{2}
- field: grade2
postfix: ","
range: 41-80{2}
- field: grade3
postfix: ","
range: 81-120{2}
- field: self
postfix: ","
range: 201-10000

View File

@@ -13,6 +13,8 @@
define('RUNTIME_ROOT', dirname(dirname(__FILE__)) . '/runtime/');
define('LIB_ROOT', dirname(dirname(__FILE__)) . '/lib/');
include LIB_ROOT . 'init.php';
/**
* Get version type of ZenTaoPMS.
*
@@ -71,34 +73,27 @@ function ztfExtract($dir)
*/
function zdRun()
{
global $config, $dao;
$frameworkRoot = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'framework' . DIRECTORY_SEPARATOR;
include $frameworkRoot . 'helper.class.php';
include LIB_ROOT . 'spyc.php';
$zdRoot = dirname(dirname(__FILE__)) . '/data/';
$zdPath = RUNTIME_ROOT . 'zd';
$zdRoot = dirname(dirname(__FILE__)) . '/data/';
$zdPath = RUNTIME_ROOT . 'zd';
set_time_limit(0);
try
{
$config = new stdclass();
$config->db = new stdclass();
include dirname(dirname(dirname(__FILE__))) . '/config/config.php';
$versionType = getVersionType($config->version);
$configRoot = $zdRoot . $versionType . '/';
include $configRoot . 'config.php';
include $configRoot . 'processor.php';
/* Connect to MySQL. */
$dsn = "mysql:host={$config->db->host}:{$config->db->port};dbname={$config->db->name}";
$dbh = new PDO($dsn, $config->db->user, $config->db->password);
$dao = new dao();
echo 'MySQL connect success' . PHP_EOL;
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 设置报错处理方式。
$dbh->exec("SET GLOBAL sql_mode = '';");
$dbh->exec("set names 'utf8'");
$dbh->beginTransaction();
$dao->begin();
/* Copy common to tmp. */
$tmpCommonPath = RUNTIME_ROOT . 'tmp/common';
@@ -107,19 +102,38 @@ function zdRun()
system("rm {$zdRoot}sql/*");
/* Generate SQL files. */
$command = "$zdPath -c %s -d $zdRoot%s -n %s -o {$zdRoot}sql/%s.sql -table %s";
$tables = array();
$tables = array();
foreach($builder as $key => $info)
{
/* Build zendata. */
$configData = array('fields' => array());
/* Build ZenData. */
$tableName = '';
$files = array();
if(!empty($info['extends']))
{
foreach($info['extends'] as $fileKey => $fileName)
{
if(!$tableName) $tableName = $fileName;
$files[] = $zdRoot . $fileName . '.yaml';
}
}
if(!empty($info['data']))
{
foreach($info['data'] as $fileKey => $fileName)
{
if($fileKey == 0) continue; // Skip default file.
if(!$tableName) $tableName = $info['data'];
$files[] = $configRoot . $info['data'] . '.yaml';
}
$defaultFile = array_shift($files);
$data = Spyc::YAMLLoad($configRoot . $fileName . '.yaml');
/* Parse files, Generate $configYaml. */
if(count($files) == 1) // If only one file need to parse, use is direactly.
{
$configYaml = $files[0];
}
else
{
$configData = array('fields' => array());
foreach($files as $file)
{
$data = Spyc::YAMLLoad($file);
foreach($data['fields'] as $field)
{
$fieldName = $field['field'];
@@ -137,26 +151,25 @@ function zdRun()
if(!$fieldExist) $configData['fields'][] = $field;
}
}
/* Refresh runtime/tmp/config.yaml. */
$spyc = new Spyc();
$spyc->setting_dump_force_quotes = true;
$content = $spyc->dump($configData);
$yaml = fopen(RUNTIME_ROOT . 'tmp/config.yaml', 'w');
fwrite($yaml, $content);
fclose($yaml);
$configYaml = RUNTIME_ROOT . 'tmp/config.yaml';
}
/* Refresh runtime/tmp/config.yaml. */
$spyc = new Spyc();
$spyc->setting_dump_force_quotes = true;
$content = $spyc->dump($configData);
$yaml = fopen(RUNTIME_ROOT . 'tmp/config.yaml', 'w');
fwrite($yaml, $content);
fclose($yaml);
/* Create sql files. */
$defaultName = $info['data'][0];
$tableName = $config->db->prefix . $defaultName;
$execYaml = sprintf($command, RUNTIME_ROOT . 'tmp/config.yaml', $defaultName . '.yaml', $info['rows'], $fileName, $tableName);
/* Create SQL files. */
$tableName = $config->db->prefix . $tableName;
$command = "$zdPath -c %s -d %s -n %s -o {$zdRoot}sql/%s.sql -table %s";
$execYaml = sprintf($command, $configYaml, $defaultFile, $info['rows'], $fileName, $tableName);
system($execYaml);
echo $execYaml . "\n";
echo 'Execute: ' . $fileName . PHP_EOL;
// echo $execYaml . "\n";
$tables[$tableName] = $tableName;
}
@@ -164,7 +177,7 @@ function zdRun()
/* Truncate tables. */
foreach($tables as $table)
{
$dbh->exec('truncate table ' . $table);
$dao->exec('truncate table ' . $table);
}
/* Export SQL files to MySQL. */
@@ -178,12 +191,14 @@ function zdRun()
$tableName = basename($file, '.sql');
$sql = file_get_contents($sqlDir . $file);
$count = $dbh->exec($sql);
$count = $dao->exec($sql);
echo $tableName . ' insert rows ' . $count . PHP_EOL;
}
$dbh->commit();
$dbh = null;
$dao->commit();
$processor = new Processor();
$processor->init();
}
catch (PDOException $e)
{
@@ -209,6 +224,8 @@ Usage:
The commands are:
init only init data and files
extract extract comment of testcase
api run unit test for api
control run unit test for controllers
model run unit test for models
ui ui testing

View File

@@ -0,0 +1,24 @@
<?php if(strpos($_SERVER['HTTP_USER_AGENT'], 'xuanxuan') != false): ?>
<style>
body {scrollbar-gutter: stable both-edges;}
::-webkit-scrollbar-thumb {border-radius: 5px;}
#navbar {display: flex; align-items: center; justify-content: center;}
#navbar .nav {display: flex; align-items: center; height: 50px;}
#navbar .nav > li {float: none;}
#navbar .nav > li > a {padding-top: 3px!important; padding-bottom: 3px!important; border-radius: 4px;}
</style>
<script>
$(function()
{
if(window.parent === window || window.parent.appHeaderStyleUpdated) return;
const mainHeader = document.getElementById('mainHeader');
if(!mainHeader) return;
const style = window.getComputedStyle(mainHeader, null);
const color = window.getComputedStyle(document.querySelector('#navbar .nav>li:not(.active)>a'), null).color;
const clientHeaderStyle = {windowControlBtnColor: color, background: style.background, color: color};
window.parent.appHeaderStyleUpdated = true;
window.open('xxc://setAppHeaderStyle/zentao-integrated/' + encodeURIComponent(JSON.stringify(clientHeaderStyle)), '_blank');
});
</script>
<?php endif; ?>