results.html.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. <?php
  2. /**
  3. * The results view file of testcase module of ZenTaoPMS.
  4. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
  5. * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  6. * @author Mengyi Liu <liumengyi@easycorp.ltd>
  7. * @package testcase
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. jsVar('tab', $app->tab);
  12. modalHeader(set::title($lang->testtask->lblResults), set::entityText($case->title), set::entityID($case->id));
  13. div
  14. (
  15. setClass('border-b'),
  16. div
  17. (
  18. h::strong($lang->testcase->precondition)
  19. ),
  20. div
  21. (
  22. setClass('leading-6 my-2', empty($case->precondition) ? 'h-6' : ''),
  23. nl2br($case->precondition)
  24. )
  25. );
  26. $count = count($results);
  27. $trs = array();
  28. $fileModals = array();
  29. $trCount = 1;
  30. $failCount = 0;
  31. $isEn = $app->getClientLang() == 'en';
  32. foreach($results as $i => $result)
  33. {
  34. $class = ($result->caseResult == 'pass' ? 'success' : ($result->caseResult == 'fail' ? 'danger' : ($result->caseResult == 'blocked' ? 'warning' : '')));
  35. $fileCount = count($result->files);
  36. $isChinese = strpos($app->getClientLang(), 'zh-') !== false;
  37. if($result->node == 0 && $result->task > 0)
  38. {
  39. $taskResult = $isChinese ? sprintf($lang->testtask->runInTask, zget($testtasks, $result->task, ''), zget($builds, $result->build, '')) : sprintf($lang->testtask->runInTask, zget($testtasks, $result->task, ''), zget($users, $result->lastRunner), zget($builds, $result->build, ''));
  40. }
  41. else
  42. {
  43. $taskResult = !$isChinese ? ' by <strong>' . zget($users, $result->lastRunner) . '</strong>' : '';
  44. }
  45. if($class != 'success') $failCount ++;
  46. $trs[] = h::tr
  47. (
  48. setClass("result-item result{$class} h-12 is-collapsed"),
  49. on::click('toggleShowResults'),
  50. set('data-id', $result->id),
  51. set('data-status', $result->node > 0 && empty($result->ZTFResult) ? 'running': 'ready'),
  52. h::td
  53. (
  54. span(setClass('toggle-icon inline-block align-middle mr-2')),
  55. width('120px'),
  56. label(setClass('mx-2 gray-pale'), "#{$result->id}"),
  57. $result->date,
  58. $result->node > 0 ? sprintf($lang->testtask->runNode, zget($users, $result->lastRunner), $result->nodeName, $lang->testtask->runCase) : '',
  59. $result->node == 0 || !empty($result->ZTFResult) ? html
  60. (
  61. $isChinese ? sprintf($lang->testtask->runCaseResult, zget($users, $result->lastRunner), $taskResult, $class, $lang->testcase->resultList[$result->caseResult]) : sprintf($lang->testtask->runCaseResult, $taskResult, $class, $lang->testcase->resultList[$result->caseResult])
  62. ) : h::strong
  63. (
  64. setClass('text-waring'),
  65. $lang->testtask->running
  66. ),
  67. $result->node > 0 ? span
  68. (
  69. setClass('label'),
  70. $lang->testtask->auto
  71. ) : null
  72. )
  73. );
  74. $stepResultTrs = array();
  75. foreach($result->stepResults as $key => $stepResult)
  76. {
  77. if(empty($stepResult['id'])) $stepResult['id'] = 0;
  78. if(empty($stepResult['type'])) $stepResult['type'] = 'step';
  79. if(empty($stepResult['parent'])) $stepResult['parent'] = 0;
  80. if(empty($stepResult['result'])) $stepResult['result'] = 0;
  81. if(empty($stepResult['grade'])) $stepResult['grade'] = 0;
  82. $itemTds = array();
  83. $modalID = $result->id . '-' . $key;
  84. $fileCount = count($stepResult['files']);
  85. $resultFile = !empty($stepResult['files']) ? a
  86. (
  87. on::click('setFileModalHeight'),
  88. set::href("#stepResult{$modalID}"),
  89. set('data-toggle', 'modal'),
  90. set('data-position', 'center'),
  91. icon('paper-clip'),
  92. $fileCount
  93. ) : '';
  94. $expectWidth = $isEn ? 'calc(25%)' : 'calc(25% + 2px)';
  95. $versionWidth = $isEn ? '94px' : '80px';
  96. $resultWidth = $isEn ? '90px' : '56px';
  97. $stepWidth = $isEn ? 'calc(75% - 504px)' : 'calc(75% - 292px)';
  98. $itemTds[] = div
  99. (
  100. setClass('text-left flex border-r break-all'),
  101. width($expectWidth),
  102. isset($stepResult['expect']) ? html(nl2br($stepResult['expect'])) : ''
  103. );
  104. $itemTds[] = div
  105. (
  106. setClass('text-left flex border-r text-gray'),
  107. width($versionWidth),
  108. isset($stepResult['version']) ? "#{$stepResult['version']}" : ''
  109. );
  110. $itemTds[] = !empty($stepResult['result']) ? div
  111. (
  112. setClass("status-{$stepResult['result']} text-center flex border-r"),
  113. width('80px'),
  114. $lang->testcase->resultList[$stepResult['result']]
  115. ) : div
  116. (
  117. setClass('border-r'),
  118. width('80px')
  119. );
  120. $itemTds[] = !empty($stepResult['result']) ? div
  121. (
  122. setClass('text-left flex border-r break-all'),
  123. width('240px'),
  124. html(nl2br($stepResult['real'] ?? ''))
  125. ) : div
  126. (
  127. setClass('border-r'),
  128. width('240px')
  129. );
  130. if(empty($stepResult['result']))
  131. {
  132. $itemTds[] = div(width('56px'));
  133. }
  134. else
  135. {
  136. $itemTds[] = div
  137. (
  138. setClass('text-center flex'),
  139. width('56px'),
  140. !empty($stepResult['files']) ? a
  141. (
  142. on::click('setFileModalHeight'),
  143. set::href("#stepResultFileModal{$modalID}"),
  144. set('data-toggle', 'modal'),
  145. set('data-position', 'center'),
  146. icon('paper-clip'),
  147. $fileCount
  148. ) : ''
  149. );
  150. }
  151. $fileModals[] = modal
  152. (
  153. set::id("stepResultFileModal{$modalID}"),
  154. !empty($stepResult['files']) ? fileList(set::extra($stepResult['id']), set::files($stepResult['files'])) : ''
  155. );
  156. $stepResultTrs[] = div
  157. (
  158. setClass("step flex border-b step-{$stepResult['type']} "),
  159. set('data-parent', $stepResult['parent']),
  160. set('data-grade', $stepResult['grade']),
  161. set('data-id', $key),
  162. div
  163. (
  164. setClass('step-id flex border-r check-item'),
  165. width($stepWidth),
  166. $result->caseResult == 'fail' ? checkbox
  167. (
  168. on::click('toggleCheckChildItem'),
  169. set::id("stepIdList[{$result->id}][{$stepResult['id']}]"),
  170. set('name', "stepIdList[{$result->id}][{$stepResult['id']}]"),
  171. set('value', $key)
  172. ) : '',
  173. div
  174. (
  175. setClass('inputGroup row', 'pl-' . ((zget($stepResult, 'grade', 1) - 1) * 2)),
  176. span
  177. (
  178. setClass('step-item-id mr-2'),
  179. zget($stepResult, 'name', '')
  180. ),
  181. div(setClass('wrap break-all'), html(nl2br(zget($stepResult, 'desc', ''))))
  182. )
  183. ),
  184. $itemTds
  185. );
  186. }
  187. $stepResultTrs[] = !empty($result->ZTFResult) && $result->node > 0 ? div
  188. (
  189. h::p($lang->testtask->runningLog),
  190. h::p(html($result->ZTFResult))
  191. ) : '';
  192. $projectParam = $this->app->tab == 'project' ? "projectID={$this->session->project}," : '';
  193. $executionParam = $this->app->tab == 'execution' ? "executionID={$this->session->execution}" : "";
  194. $executionParam = isset($testtask) ? "executionID={$testtask->execution}" : $executionParam;
  195. $params = isset($testtask) ? ",testtask={$testtask->id}" : "";
  196. $params = $params . ',buildID=' . (isset($testtask->build) ? $testtask->build : $result->build);
  197. $linkParams = "product={$case->product}&branch={$case->branch}&extras={$projectParam}caseID={$case->id},version={$case->version},resultID={$result->id},runID={$result->run}{$params}";
  198. if($executionParam) $params .= ',' . $executionParam;
  199. $trs[] = h::tr
  200. (
  201. set::id('tr-detail_' . $trCount ++),
  202. setClass('result-detail hidden'),
  203. h::td
  204. (
  205. setClass('pd-0'),
  206. form
  207. (
  208. set('data-params', $linkParams),
  209. set::actions(array()),
  210. div
  211. (
  212. setClass('resultSteps ' . $result->caseResult),
  213. div
  214. (
  215. setClass('steps-header flex border-b'),
  216. div
  217. (
  218. width($stepWidth),
  219. setClass('text-left desc border-r'),
  220. $lang->testcase->stepDesc
  221. ),
  222. div
  223. (
  224. width('calc(25%)'),
  225. setClass('text-left border-r'),
  226. $lang->testcase->stepExpect
  227. ),
  228. div
  229. (
  230. width($versionWidth),
  231. setClass('text-center border-r'),
  232. $lang->testcase->version
  233. ),
  234. div
  235. (
  236. width('80px'),
  237. setClass('text-center border-r'),
  238. $lang->testcase->resultAB
  239. ),
  240. div
  241. (
  242. width('240px'),
  243. setClass('text-left border-r'),
  244. $lang->testcase->real
  245. ),
  246. div
  247. (
  248. width($resultWidth),
  249. setClass('text-left'),
  250. $lang->attach
  251. )
  252. ),
  253. div
  254. (
  255. setClass($isEn ? 'steps-body' : 'steps-body ml-2'),
  256. $stepResultTrs
  257. ),
  258. $result->caseResult == 'fail' && common::hasPriv('testcase', 'createBug') ? div
  259. (
  260. setClass('check-all flex items-center h-12 pl-4 border-t'),
  261. checkbox
  262. (
  263. on::click('toggleCheckAll'),
  264. set::id("checkAll[{$i}]"),
  265. set('type', 'checkbox'),
  266. set('name', 'checkAll'),
  267. set::text($lang->selectAll)
  268. ),
  269. div
  270. (
  271. btn
  272. (
  273. setClass('btn h-7 px-6 ml-8 to-bug-button'),
  274. set::type('primary'),
  275. on::click('createBug'),
  276. $lang->testcase->createBug
  277. )
  278. )
  279. ) : ''
  280. )
  281. )
  282. )
  283. );
  284. }
  285. $resultItem = array();
  286. $resultItem[] = span
  287. (
  288. setClass('px-3 my-1 border-r'),
  289. html(sprintf($lang->testtask->showResult, $count))
  290. );
  291. $resultItem[] = span
  292. (
  293. setClass('pl-3 my-1'),
  294. html(sprintf($lang->testtask->showFail, $failCount))
  295. );
  296. div
  297. (
  298. div
  299. (
  300. setClass('main' . ($type != 'fail' ? ' mt-6' : '')),
  301. set::id('casesResults'),
  302. $case->auto != 'unit' && $type != 'fail' ? formRowGroup
  303. (
  304. set::title($lang->testcase->resultAB),
  305. set::items
  306. (
  307. $resultItem
  308. )
  309. ) : null,
  310. h::table
  311. (
  312. setClass('table border'),
  313. $trs
  314. ),
  315. $fileModals
  316. )
  317. );
  318. render();