diff --git a/api/v1/entries/stories.php b/api/v1/entries/stories.php
index 75d38b6c7f..558f95a7cd 100644
--- a/api/v1/entries/stories.php
+++ b/api/v1/entries/stories.php
@@ -66,7 +66,7 @@ class storiesEntry extends entry
$control = $this->loadController('story', 'create');
$this->requireFields('title,spec,pri,category');
- $control->create($productID);
+ $control->create($productID, $this->param('branch', 0), $this->param('moduleID', 0), $this->param('storyID', 0), $this->param('objectID', 0));
$data = $this->getData();
if(isset($data->status) and $data->status == 'fail') return $this->sendError(zget($data, 'code', 400), $data->message);
diff --git a/api/v1/entries/storyassignto.php b/api/v1/entries/storyassignto.php
index 66e6f089f8..a868427b84 100644
--- a/api/v1/entries/storyassignto.php
+++ b/api/v1/entries/storyassignto.php
@@ -22,7 +22,7 @@ class storyAssignToEntry extends Entry
{
$story = $this->loadModel('story')->getByID($storyID);
- $fields = 'assignedTo';
+ $fields = 'assignedTo,comment';
$this->batchSetPost($fields);
$control = $this->loadController('story', 'assignTo');
diff --git a/module/action/model.php b/module/action/model.php
index f70bef05bf..40c55ee22d 100755
--- a/module/action/model.php
+++ b/module/action/model.php
@@ -917,6 +917,8 @@ class actionModel extends model
->beginIF($docs and !$this->app->user->admin)->andWhere("IF(objectType != 'doc' || (objectType = 'doc' && (action = 'approved' || action = 'removed')), '1=1', objectID " . helper::dbIN($docs) . ")")->fi()
->beginIF($libs and !$this->app->user->admin)->andWhere("IF(objectType != 'doclib', '1=1', objectID " . helper::dbIN(array_keys($libs)) . ') ')->fi()
->beginIF($actionCondition)->andWhere("($actionCondition)")->fi()
+ /* Filter out client login/logout actions. */
+ ->andWhere('action')->notin('disconnectxuanxuan,loginxuanxuan')
->orderBy($orderBy)
->page($pager)
->fetchAll();
@@ -1008,13 +1010,13 @@ class actionModel extends model
$actionQuery = str_replace("`product` = '$productID'", "`product` LIKE '%,$productID,%'", $actionQuery);
if($date) $actionQuery = "($actionQuery) AND " . ('date' . ($direction == 'next' ? '<' : '>') . "'{$date}'");
-
+
/* If this vision is lite, delete product actions. */
if($this->config->vision == 'lite') $actionQuery .= " AND objectType != 'product'";
-
+
$actionQuery .= " AND vision = '" . $this->config->vision . "'";
$actions = $this->getBySQL($actionQuery, $orderBy, $pager);
-
+
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'action');
if(!$actions) return array();
return $this->transformActions($actions);
diff --git a/module/branch/view/manage.html.php b/module/branch/view/manage.html.php
index 2ab8732ce6..2c3e663c39 100644
--- a/module/branch/view/manage.html.php
+++ b/module/branch/view/manage.html.php
@@ -40,7 +40,7 @@
sso->redirect)) echo "class='ranzhiFixedTfootAction'";?> >
diff --git a/module/common/view/header.lite.html.php b/module/common/view/header.lite.html.php
index 0f5771a23c..807b39b71c 100755
--- a/module/common/view/header.lite.html.php
+++ b/module/common/view/header.lite.html.php
@@ -77,6 +77,8 @@ if($this->config->vision == 'lite')
$extHookFiles = glob($extHookRule);
if($extHookFiles) foreach($extHookFiles as $extHookFile) include $extHookFile;
}
+$xuanExtFile = $extensionRoot . 'xuan/common/ext/view/header.xuanxuan.html.hook.php';
+if(file_exists($xuanExtFile)) include $xuanExtFile;
?>
app->getViewType() == 'xhtml' ? 'allow-self-open' : '';?>
diff --git a/module/execution/model.php b/module/execution/model.php
index dcffef5d44..bfac6c4405 100644
--- a/module/execution/model.php
+++ b/module/execution/model.php
@@ -1829,7 +1829,7 @@ class executionModel extends model
foreach($plans as $plan) $planPairs += $plan;
}
$this->config->product->search['params']['plan']['values'] = $planPairs;
- $this->config->product->search['params']['module']['values'] = $modules;
+ $this->config->product->search['params']['module']['values'] = array('' => '') + $modules;
if($productType == 'normal')
{
unset($this->config->product->search['fields']['branch']);
diff --git a/module/product/control.php b/module/product/control.php
index 08fe655607..5427438fee 100644
--- a/module/product/control.php
+++ b/module/product/control.php
@@ -1291,7 +1291,7 @@ class product extends control
$this->view->position[] = $this->lang->product->line;
$this->view->programs = array('') + $this->loadModel('program')->getTopPairs();
- $this->view->lines = $this->dao->select('*')->from(TABLE_MODULE)->where('type')->eq('line')->andWhere('deleted')->eq(0)->orderBy('`order`')->fetchAll();
+ $this->view->lines = $this->product->getLines();
$this->display();
}
diff --git a/module/product/model.php b/module/product/model.php
index 5ec8aa627e..1d3012d7ac 100644
--- a/module/product/model.php
+++ b/module/product/model.php
@@ -970,7 +970,7 @@ class productModel extends model
else
{
$moduleList = array();
- $modules = array('' => '/');
+ $modules = array('/');
$branchGroup = $this->loadModel('execution')->getBranchByProduct(array_keys($products), $this->session->project, '');
foreach($products as $productID => $productName)
{
@@ -996,7 +996,7 @@ class productModel extends model
{
$modules = $this->tree->getOptionMenu($productID, 'story', 0, $branch);
}
- $this->config->product->search['params']['module']['values'] = $modules;
+ $this->config->product->search['params']['module']['values'] = array('' => '') + $modules;
$productInfo = $this->getById($productID);
if(!$productID or $productInfo->type == 'normal' or $this->app->tab == 'assetlib')
@@ -1786,7 +1786,7 @@ class productModel extends model
*
* @param int $programID
* @access public
- * @return void
+ * @return array
*/
public function getLinePairs($programID = 0)
{
@@ -1797,6 +1797,16 @@ class productModel extends model
->fetchPairs();
}
+ /*
+ * Get all lines.
+ * @access public
+ * @return array
+ */
+ public function getLines()
+ {
+ return $this->dao->select('*')->from(TABLE_MODULE)->where('type')->eq('line')->andWhere('deleted')->eq(0)->orderBy('`order`')->fetchAll();
+ }
+
/**
* Get the summary of product's stories.
*
diff --git a/module/story/js/change.js b/module/story/js/change.js
index fcdf2de956..df0c4cbd8e 100644
--- a/module/story/js/change.js
+++ b/module/story/js/change.js
@@ -4,6 +4,14 @@ $(function()
{
$('#reviewer').attr('disabled', $(this).is(':checked') ? 'disabled' : null).trigger('chosen:updated');
getStatus('change', "storyID=" + storyID + ",changed=" + changed + ",needNotReview=" + ($(this).prop('checked') ? 1 : 0));
+ if($(this).is(':checked'))
+ {
+ $('.input-group-addon').removeClass('required');
+ }
+ else
+ {
+ $('.input-group-addon').addClass('required');
+ }
});
$('#needNotReview').change();
diff --git a/module/story/model.php b/module/story/model.php
index eab6a9657c..0bbab938cc 100644
--- a/module/story/model.php
+++ b/module/story/model.php
@@ -670,7 +670,7 @@ class storyModel extends model
->add('lastEditedDate', $now)
->setIF($specChanged, 'version', $oldStory->version + 1)
->setIF($specChanged and $oldStory->status == 'active' and $this->post->needNotReview == false, 'status', 'changed')
- ->setIF($specChanged and $oldStory->status == 'draft' and $this->post->needNotReview, 'status', 'active')
+ ->setIF($oldStory->status == 'draft' and $this->post->needNotReview, 'status', 'active')
->setIF($specChanged, 'reviewedBy', '')
->setIF($specChanged, 'closedBy', '')
->setIF($specChanged, 'closedReason', '')
@@ -679,7 +679,7 @@ class storyModel extends model
->stripTags($this->config->story->editor->change['id'], $this->config->allowedTags)
->remove('files,labels,reviewer,comment,needNotReview,uid')
->get();
- if($specChanged and $story->status == 'active' and $this->checkForceReview()) $story->status = 'changed';
+ if($specChanged and isset($story->status) && $story->status == 'active' and $this->checkForceReview()) $story->status = 'changed';
$story = $this->loadModel('file')->processImgURL($story, $this->config->story->editor->change['id'], $this->post->uid);
$this->dao->update(TABLE_STORY)->data($story, 'spec,verify')
->autoCheck()
@@ -735,7 +735,7 @@ class storyModel extends model
$this->file->updateObjectID($this->post->uid, $storyID, 'story');
- $oldStory->reviewers = implode(',', array_keys($oldStroyReviewers));
+ $oldStory->reviewers = implode(',', array_keys($oldStoryReviewers));
$story->reviewers = implode(',', $_POST['reviewer']);
return common::createChanges($oldStory, $story);
}
@@ -1315,11 +1315,11 @@ class storyModel extends model
->setDefault('lastEditedBy', $this->app->user->account)
->setDefault('lastEditedDate', $now)
->setDefault('status', $oldStory->status)
+ ->setDefault('reviewedDate', $date)
->setIF($this->post->result == 'revert', 'version', $this->post->preVersion)
->removeIF($this->post->result != 'reject', 'closedReason, duplicateStory, childStories')
->removeIF($this->post->result == 'reject' and $this->post->closedReason != 'duplicate', 'duplicateStory')
->removeIF($this->post->result == 'reject' and $this->post->closedReason != 'subdivided', 'childStories')
- ->add('reviewedDate', $date)
->add('reviewedBy', $oldStory->reviewedBy . ',' . $this->app->user->account)
->remove('result,preVersion,comment')
->get();
@@ -2663,6 +2663,8 @@ class storyModel extends model
{
$storyQuery .= " AND `status` NOT IN ('draft', 'closed')";
}
+
+ if($this->app->rawModule == 'build' and $this->app->rawMethod == 'linkstory') $storyQuery .= " AND `parent` != '-1'";
}
elseif(strpos($storyQuery, $allBranch) !== false)
{
diff --git a/module/story/view/view.html.php b/module/story/view/view.html.php
index 9d43318036..4f7b66447c 100644
--- a/module/story/view/view.html.php
+++ b/module/story/view/view.html.php
@@ -413,7 +413,7 @@
| story->reviewedDate;?> |
- reviewedBy) echo $story->reviewedDate;?> |
+ reviewedBy) echo date('Y-m-d', strtotime($story->reviewedDate))?> |
| story->closedBy;?> |
diff --git a/module/upgrade/model.php b/module/upgrade/model.php
index 3d1002f169..95392cc46c 100644
--- a/module/upgrade/model.php
+++ b/module/upgrade/model.php
@@ -5257,8 +5257,9 @@ class upgradeModel extends model
$products = $this->dao->select('*')->from(TABLE_PRODUCT)->where('acl')->eq('custom')->fetchAll();
foreach($products as $product)
{
- $groups = explode(',', $product->whitelist);
- $accounts = $this->dao->select('account')->from(TABLE_USERGROUP)->where('`group`')->in($groups)->fetchPairs('account');
+ $groups = explode(',', $product->whitelist);
+ $accounts = $this->dao->select('account')->from(TABLE_USERGROUP)->where('`group`')->in($groups)->fetchPairs('account');
+ $whiteList = '';
foreach($accounts as $account)
{
$acl = new stdclass();
@@ -5269,9 +5270,11 @@ class upgradeModel extends model
$acl->source = 'upgrade';
$this->dao->insert(TABLE_ACL)->data($acl)->exec();
+
+ $whiteList .= ',' . $account;
}
- $this->dao->update(TABLE_PRODUCT)->set('acl')->eq('private')->where('id')->eq($product->id)->exec();
+ $this->dao->update(TABLE_PRODUCT)->set('acl')->eq('private')->set('whitelist')->eq($whiteList)->where('id')->eq($product->id)->exec();
}
return true;
diff --git a/test/class/caselib.class.php b/test/class/caselib.class.php
new file mode 100644
index 0000000000..3c7ce07afc
--- /dev/null
+++ b/test/class/caselib.class.php
@@ -0,0 +1,134 @@
+objectModel = $tester->loadModel('caselib');
+ }
+
+ public function setLibMenuTest($libraries, $libID)
+ {
+ $objects = $this->objectModel->setLibMenu($libraries, $libID);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function saveLibStateTest($libID = 0, $libraries = array())
+ {
+ $objects = $this->objectModel->saveLibState($libID, $libraries);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getByIdTest($libID, $setImgSize = false)
+ {
+ $objects = $this->objectModel->getById($libID, $setImgSize);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function updateTest($libID)
+ {
+ $objects = $this->objectModel->update($libID);
+
+ if(dao::isError()) return dao::getError();
+
+ $objects = $this->objectModel->getById($libID);
+
+ return $objects;
+ }
+
+ public function deleteTest($libID, $table = '')
+ {
+ $objects = $this->objectModel->delete($libID, $table);
+
+ if(dao::isError()) return dao::getError();
+
+ $objects = $this->objectModel->getById($libID);
+
+ return $objects;
+ }
+
+ public function getLibrariesTest()
+ {
+ $objects = $this->objectModel->getLibraries();
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getListTest($orderBy = 'id_desc', $pager = null)
+ {
+ $objects = $this->objectModel->getList($orderBy, $pager);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function createTest($param)
+ {
+ foreach($param as $k => $v) $_POST[$k] = $v;
+ $libID = $this->objectModel->create();
+ unset($_POST);
+
+ if(dao::isError()) return dao::getError();
+
+ $objects = $this->objectModel->getById($libID);
+
+ return $objects;
+ }
+
+ public function getLibCasesTest($libID, $browseType, $queryID = 0, $moduleID = 0, $sort = 'id_desc', $pager = null)
+ {
+ $objects = $this->objectModel->getLibCases($libID, $browseType, $queryID, $moduleID, $sort, $pager);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function buildSearchFormTest($libID, $libraries, $queryID, $actionURL)
+ {
+ $objects = $this->objectModel->buildSearchForm($libID, $libraries, $queryID, $actionURL);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getLibLinkTest($module, $method, $extra)
+ {
+ $objects = $this->objectModel->getLibLink($module, $method, $extra);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function createFromImportTest($libID)
+ {
+ $objects = $this->objectModel->createFromImport($libID);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function batchCreateCaseTest($libID)
+ {
+ $objects = $this->objectModel->batchCreateCase($libID);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+}
diff --git a/test/class/projectrelease.class.php b/test/class/projectrelease.class.php
new file mode 100644
index 0000000000..14e68da432
--- /dev/null
+++ b/test/class/projectrelease.class.php
@@ -0,0 +1,195 @@
+objectModel = $tester->loadModel('projectrelease');
+ }
+
+ /**
+ * Test get release by id.
+ *
+ * @param int $releaseID
+ * @access public
+ * @return object
+ */
+ public function getByIDTest($releaseID)
+ {
+ $objects = $this->objectModel->getByID($releaseID);
+
+ if(dao::isError())
+ {
+ $error = dao::getError();
+ return $error[0];
+ }
+
+ return $objects;
+ }
+
+ /**
+ * Test get list of releases.
+ *
+ * @param int $projectID
+ * @param string $type
+ * @access public
+ * @return array
+ */
+ public function getListTest($projectID, $type = 'all')
+ {
+ $objects = $this->objectModel->getList($projectID, $type);
+
+ if(dao::isError())
+ {
+ $error = dao::getError();
+ return $error[0];
+ }
+
+ return $objects;
+ }
+
+ /**
+ * Test get last release.
+ *
+ * @param int $projectID
+ * @access public
+ * @return object
+ */
+ public function getLastTest($projectID)
+ {
+ $objects = $this->objectModel->getLast($projectID);
+
+ if(dao::isError())
+ {
+ $error = dao::getError();
+ return $error[0];
+ }
+
+ return $objects;
+ }
+
+ /**
+ * Test get released builds from project.
+ *
+ * @param int $projectID
+ * @access public
+ * @return array
+ */
+ public function getReleasedBuildsTest($projectID)
+ {
+ $objects = $this->objectModel->getReleasedBuilds($projectID);
+
+ if(dao::isError())
+ {
+ $error = dao::getError();
+ return $error[0];
+ }
+ if(count($objects) == 1)
+ {
+ return count($objects);
+ }
+ else
+ {
+ return $objects;
+ }
+ }
+
+ /**
+ * Test update a release.
+ *
+ * @param int $releaseID
+ * @param string $name
+ * @param string $date
+ * @access public
+ * @return array
+ */
+ public function updateTest($releaseID, $name = '', $date = '')
+ {
+ global $app;
+ $app->loadConfig('release');
+
+ $updateFields['name'] = $name;
+ $updateFields['build'] = 1;
+ $updateFields['date'] = $date;
+ $updateFields['status'] = 'normal';
+ $updateFields['desc'] = '';
+ $updateFields['labels'] = array();
+ $updateFields['files'] = array();
+ $updateFields['uid'] = '62450877d0a27';
+ $updateFields['product'] = 1;
+ foreach($updateFields as $field => $defaultValue) $_POST[$field] = $defaultValue;
+
+ $objects = $this->objectModel->update($releaseID);
+ if($objects == array()) $objects = '没有数据更新';
+ unset($_POST);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ /**
+ * Test link stories
+ *
+ * @param int $releaseID
+ * @access public
+ * @return array
+ */
+ public function linkStoryTest($releaseID)
+ {
+ $_POST['stories'] = array(1, 2);
+ $this->objectModel->linkStory($releaseID);
+
+ global $tester;
+ $objects = $tester->dao->select('stories')->from(TABLE_RELEASE)->where('id')->eq((int)$releaseID)->fetch();
+ unset($_POST);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ /**
+ * Test unlink stories
+ *
+ * @param int $releaseID
+ * @param int $storyID
+ * @access public
+ * @return array
+ */
+ public function unlinkStoryTest($releaseID, $storyID)
+ {
+ $this->linkStoryTest($releaseID);
+ $this->objectModel->unlinkStory($releaseID, $storyID);
+
+ global $tester;
+ $objects = $tester->dao->select('stories')->from(TABLE_RELEASE)->where('id')->eq((int)$releaseID)->fetch();
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ /**
+ * Test link bugs.
+ *
+ * @param int $releaseID
+ * @param string $type
+ * @access public
+ * @return array
+ */
+ public function linkBugTest($releaseID, $type = 'bug')
+ {
+ $_POST['bugs'] = array(1, 2);
+ $this->objectModel->linkBug($releaseID, $type);
+
+ global $tester;
+ $field = $type == 'bug' ? 'bugs' : 'leftBugs';
+ $objects = $tester->dao->select($field)->from(TABLE_RELEASE)->where('id')->eq((int)$releaseID)->fetch();
+ unset($_POST);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+}
diff --git a/test/model/caselib/batchcreatecase.php b/test/model/caselib/batchcreatecase.php
new file mode 100755
index 0000000000..7e864c3f11
--- /dev/null
+++ b/test/model/caselib/batchcreatecase.php
@@ -0,0 +1,35 @@
+#!/usr/bin/env php
+batchCreateCase();
+cid=1
+pid=1
+
+*/
+
+$caselib = new caselibTest();
+$_POST = array(
+ 'module' => array(0 => 0, 1 => 0),
+ 'title' => array(0 => '测试导入添加1', 1 => '测试导入添加2'),
+ 'color' => array(0 => '', 1 => ''),
+ 'type' => array(0 => 'performance', 1 => 'unit'),
+ 'pri' => array(0 => 2, 1 => 4),
+ 'precondition' => array(0 => '', 1 => ''),
+ 'keywords' => array(0 => '', 1 => ''),
+ 'stage' => array(0 => array(), 1 => array()),
+);
+$caselib->batchCreateCaseTest(201);
+unset($_POST);
+$total = $tester->dao->select('count(*) total')->from(TABLE_CASE)->where('lib')->eq(201)->fetch('total');
+$cases = $tester->dao->select('*')->from(TABLE_CASE)->where('lib')->eq(201)->fetchAll('id');
+
+r($total) && p() && e('12'); // 添加两条数据之后查询数据条数是否正确
+r($cases) && p('411:title,type') && e('测试导入添加1,performance'); // 添加数据之后查询新加用例的名称,用例类型
+r($cases) && p('412:title,type') && e('测试导入添加2,unit'); // 添加数据之后查询新加用例的名称,用例类型
+
+system('./ztest init');
diff --git a/test/model/caselib/buildsearchform.php b/test/model/caselib/buildsearchform.php
new file mode 100755
index 0000000000..1008baf312
--- /dev/null
+++ b/test/model/caselib/buildsearchform.php
@@ -0,0 +1,25 @@
+#!/usr/bin/env php
+buildSearchForm();
+cid=1
+pid=1
+
+*/
+
+$caselib = new caselibTest();
+$libID = 201;
+$queryID = 10;
+$actionURL = helper::createLink('caselib', 'browse', "libID=$libID&browseType=bySearch&queryID=myQueryID");
+$libs = $tester->loadModel('caselib')->getLibraries();
+
+$caselib->buildSearchFormTest($libID, $libs, $queryID, $actionURL);
+$search = $tester->config->testcase->search;
+
+r($search) && p('actionURL') && e('model/caselib/buildsearchform.php?m=caselib&f=browse&t=&libID=201&browseType=bySearch&queryID=myQueryID'); //测试设置的url参数
+r($search) && p('queryID') && e('10'); //测试设置的queryID值是否正确
diff --git a/test/model/caselib/create.php b/test/model/caselib/create.php
new file mode 100755
index 0000000000..282060adc3
--- /dev/null
+++ b/test/model/caselib/create.php
@@ -0,0 +1,35 @@
+#!/usr/bin/env php
+create();
+cid=1
+pid=1
+
+*/
+
+$caselib = new caselibTest();
+
+$lib = new stdClass();
+$lib->name = "";
+$result1 = $caselib->createTest($lib);
+
+$lib = new stdClass();
+$lib->name = '测试用例库名称';
+$lib->desc = '测试用例库描述';
+$result2 = $caselib->createTest($lib);
+
+$lib = new stdClass();
+$lib->name = '测试用例库名称';
+$result3 = $caselib->createTest($lib);
+
+r($result1) && p('name:0') && e('『名称』不能为空。'); //测试名称是空时候添加
+r($result2) && p('name') && e('测试用例库名称'); //测试添加的名称信息
+r($result2) && p('desc') && e('测试用例库描述'); //测试添加的描述信息
+r($result3) && p('name:0') && e('『名称』已经有『测试用例库名称』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。'); //测试名称是空时候添加
+
+system('./ztest init');
diff --git a/test/model/caselib/createfromimport.php b/test/model/caselib/createfromimport.php
new file mode 100755
index 0000000000..0503cfb7cd
--- /dev/null
+++ b/test/model/caselib/createfromimport.php
@@ -0,0 +1,38 @@
+#!/usr/bin/env php
+createFromImport();
+cid=1
+pid=1
+
+*/
+
+$caselib = new caselibTest();
+$_POST = array(
+ 'lib' => array(2 => 201, 3 => 201),
+ 'title' => array(2 => '测试导入添加1', 3 => '测试导入添加2'),
+ 'module' => array(2 => 0, 3 => 0),
+ 'pri' => array(2 => 2, 3 => 4),
+ 'type' => array(2 => 'performance', 3 => 'unit'),
+ 'stage' => array(2 => array(), 3 => array()),
+ 'keywords' => array(2 => 'keywords1', 3 => 'keywords2'),
+ 'precondition' => array(2 => '', 3 => ''),
+ 'isEndPage' => 1,
+ 'pagerID' => 1
+);
+
+$caselib->createFromImportTest(201);
+unset($_POST);
+$total = $tester->dao->select('count(*) total')->from(TABLE_CASE)->where('lib')->eq(201)->fetch('total');
+$cases = $tester->dao->select('*')->from(TABLE_CASE)->where('lib')->eq(201)->fetchAll('id');
+
+r($total) && p() && e('12'); //添加两条数据之后查询数据条数是否正确
+r($cases) && p('411:title,keywords') && e('测试导入添加1,keywords1'); //添加数据之后查询新加用例的名称,关键字
+r($cases) && p('412:title,keywords') && e('测试导入添加2,keywords2'); //添加数据之后查询新加用例的名称,关键字
+
+system('./ztest init');
diff --git a/test/model/caselib/delete.php b/test/model/caselib/delete.php
new file mode 100755
index 0000000000..18b6e67a32
--- /dev/null
+++ b/test/model/caselib/delete.php
@@ -0,0 +1,20 @@
+#!/usr/bin/env php
+delete();
+cid=1
+pid=1
+
+*/
+
+$caselib = new caselibTest();
+$lib = $caselib->deleteTest(201);
+
+r($lib) && p('deleted') && e('1'); //测试删除之后deleted值是否为1
+
+system('./ztest init');
diff --git a/test/model/caselib/getbyid.php b/test/model/caselib/getbyid.php
new file mode 100755
index 0000000000..c1b0baef36
--- /dev/null
+++ b/test/model/caselib/getbyid.php
@@ -0,0 +1,20 @@
+#!/usr/bin/env php
+getById();
+cid=1
+pid=1
+
+*/
+
+$caselib = new caselibTest();
+$data = $caselib->getByIdTest(201);
+
+r($data) && p('name') && e('这是测试套件名称201'); //测试获取数据的名称信息
+r($data) && p('desc') && e('这是测试套件的描述201'); //测试获取数据的描述信息
+r($data) && p('type') && e('library'); //测试获取数据的type类型
diff --git a/test/model/caselib/getlibcases.php b/test/model/caselib/getlibcases.php
new file mode 100755
index 0000000000..a2c2bf7474
--- /dev/null
+++ b/test/model/caselib/getlibcases.php
@@ -0,0 +1,26 @@
+#!/usr/bin/env php
+getLibCases();
+cid=1
+pid=1
+
+*/
+global $tester;
+$tester->app->loadClass('pager', $static = true);
+
+$pager = new pager(0, 5, 1);
+$caselib = new caselibTest();
+
+$list1 = $caselib->getLibCasesTest(201, 'all');
+$list2 = $caselib->getLibCasesTest(201, 'bysearch');
+$list3 = $caselib->getLibCasesTest(201, 'all', '0', '0', 'id_desc', $pager);
+
+r(count($list1)) && p() && e('10'); //所有状态下,用例库下用例数量
+r(count($list2)) && p() && e('10'); //搜索状态下,用例库下用例数量
+r(count($list3)) && p() && e('5'); //分页状态下,用例库下用例数量
diff --git a/test/model/caselib/getliblink.php b/test/model/caselib/getliblink.php
new file mode 100755
index 0000000000..02d8d9dba4
--- /dev/null
+++ b/test/model/caselib/getliblink.php
@@ -0,0 +1,24 @@
+#!/usr/bin/env php
+getLibLink();
+cid=1
+pid=1
+
+*/
+
+$caselib = new caselibTest();
+$link1 = $caselib->getLibLinkTest('caselib', 'create', '');
+$link2 = $caselib->getLibLinkTest('caselib', 'test', '');
+$link3 = $caselib->getLibLinkTest('tree', '', '');
+$link4 = $caselib->getLibLinkTest('', '', '');
+
+r($link1) && p() && e('model/caselib/getliblink.php?m=caselib&f=browse&t=&libID=%s'); // 测试参数情况1返回值
+r($link2) && p() && e('model/caselib/getliblink.php?m=caselib&f=test&t=&libID=%s'); // 测试参数情况2返回值
+r($link3) && p() && e('model/caselib/getliblink.php?m=tree&f=&t=&libID=%s&type=caselib¤tModuleID=0'); // 测试参数情况3返回值
+r($link4) && p() && e('model/caselib/getliblink.php?m=caselib&f=browse&t=&libID=%s'); // 测试参数情况4返回值
diff --git a/test/model/caselib/getlibraries.php b/test/model/caselib/getlibraries.php
new file mode 100755
index 0000000000..d36719bf77
--- /dev/null
+++ b/test/model/caselib/getlibraries.php
@@ -0,0 +1,18 @@
+#!/usr/bin/env php
+getLibraries();
+cid=1
+pid=1
+
+*/
+
+$caselib = new caselibTest();
+$list = $caselib->getLibrariesTest();
+
+r($list) && p('201') && e('这是测试套件名称201'); //测试获取用例库的键值对
diff --git a/test/model/caselib/getlist.php b/test/model/caselib/getlist.php
new file mode 100755
index 0000000000..a574b7e285
--- /dev/null
+++ b/test/model/caselib/getlist.php
@@ -0,0 +1,19 @@
+#!/usr/bin/env php
+getList();
+cid=1
+pid=1
+
+*/
+
+$caselib = new caselibTest();
+$list = $caselib->getListTest();
+
+r(count($list)) && p() && e('1'); //测试获取列表的个数,目前只有一个
+r($list) && p('201:name') && e('这是测试套件名称201');//测试获取列表某个用例库的名称信息
diff --git a/test/model/caselib/savelibstate.php b/test/model/caselib/savelibstate.php
new file mode 100755
index 0000000000..fd95b8d816
--- /dev/null
+++ b/test/model/caselib/savelibstate.php
@@ -0,0 +1,19 @@
+#!/usr/bin/env php
+saveLibState();
+cid=1
+pid=1
+
+*/
+
+$caselib = new caselibTest();
+$libs = $tester->loadModel('caselib')->getLibraries();
+$id = $caselib->saveLibStateTest(201, $libs);
+
+r($id) && p() && e('201'); //保存用例库状态之后返回值
diff --git a/test/model/caselib/setlibmenu.php b/test/model/caselib/setlibmenu.php
new file mode 100755
index 0000000000..5d7016e1d1
--- /dev/null
+++ b/test/model/caselib/setlibmenu.php
@@ -0,0 +1,22 @@
+#!/usr/bin/env php
+setLibMenu();
+cid=1
+pid=1
+
+*/
+
+$caselib = new caselibTest();
+$libs = $tester->loadModel('caselib')->getLibraries();
+$info = $caselib->setLibMenuTest($libs, 201);
+
+$menuStr = <<