znt/module/user/test/lib/ui/todo.ui.class.php

212 lines
9.1 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
require_once dirname(__FILE__, 6) . '/test/lib/ui.php';
define('COLUMNS', array('id', 'name', 'pri', 'date', 'begin', 'end', 'status', 'type'));
define("MENUS", array('all', 'before', 'future', 'thisWeek', 'thisMonth', 'thisYear', 'assignedToOther', 'cycle'));
define('PAGESIZE', array(5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 100, 200, 500, 1000, 2000));
class todoTester extends tester
{
/**
* 校验user模块todo视图的内容及分页功能是否正确
* Verify user module todo view content and pagination
*
* @param array $users
* @param array $todos
* @param int $pageSize
* @access public
* @return object
*/
public function verifyUserTodoContentAndPagination($users = array(), $todos = array(), $pageSize = 5)
{
if(!in_array($pageSize, PAGESIZE, true)) return $this->failed('pageSize不支持该值');
if(empty($users)) return $this->failed('用户列表不能为空');
$this->login();
$form = $this->initForm('user', 'todo', array('userID' => $users[0]->id), 'appIframe-system');
$form->wait(2);
$weekStart = date('Y-m-d', strtotime('monday this week'));
$weekEnd = date('Y-m-d', strtotime('sunday this week'));
$monthStart = date('Y-m-01');
$monthEnd = date('Y-m-t');
$yearStart = date('Y-01-01');
$yearEnd = date('Y-12-31');
foreach($users as $user)
{
$form->dom->userPicker->picker($user->realname);
$form->wait(1);
if($form->dom->userPicker->getText() != $user->realname) return $this->failed('testcase页面切换用户显示失败');
$assignedToSelf = array_values(array_filter($todos, fn($t) => ($t->assignedTo ?? null) === $user->account && (!($t->cycle ?? null))));
$assignedToOther = array_values(array_filter($todos, fn($t) => ($t->account ?? null) === $user->account && ($t->assignedTo ?? null) !== $user->account));
foreach(MENUS as $menu)
{
$form->dom->{$menu}->click();
$form->wait(1);
switch($menu)
{
case 'all':
$userTodos = $assignedToSelf;
break;
case 'before':
$userTodos = array_values(array_filter($assignedToSelf, fn($t) => ($t->status ?? '') !== 'done' && ($t->date ?? '') !== FUTURE_DATE));
break;
case 'future':
$userTodos = array_values(array_filter($assignedToSelf, fn($t) => ($t->date ?? '') >= FUTURE_DATE));
break;
case 'thisWeek':
$userTodos = array_values(array_filter($assignedToSelf, fn($t) => ($t->date ?? '') >= $weekStart && ($t->date ?? '') <= $weekEnd));
break;
case 'thisMonth':
$userTodos = array_values(array_filter($assignedToSelf, fn($t) => ($t->date ?? '') >= $monthStart && ($t->date ?? '') <= $monthEnd));
break;
case 'thisYear':
$userTodos = array_values(array_filter($assignedToSelf, fn($t) => ($t->date ?? '') >= $yearStart && ($t->date ?? '') <= $yearEnd));
break;
case 'assignedToOther':
$userTodos = array_values(array_filter($assignedToOther, fn($t) => ($t->account ?? '') !== ($t->assignedTo ?? '')));
break;
case 'cycle':
$userTodos = array_values(array_filter($todos, fn($t) => ($t->assignedTo ?? null) === $user->account && ($t->cycle ?? null)));
break;
}
$ret = $this->verifyTodoColumns($form, $userTodos, $user, $menu, $pageSize);
if($ret) return $ret;
$ret = $this->verifyTodoPagination($form, $userTodos, $pageSize);
if($ret) return $ret;
}
}
return $this->success('用户待办页面内容测试成功');
}
/**
* 验证待办列数据
* Verify todo column data
*
* @param object $form
* @param array $todos
* @param object $user
* @param string $menu
* @param int $pageSize
* @access private
* @return object
*/
private function verifyTodoColumns($form, $todos, $user, $menu, $pageSize = 5)
{
// Make sure all todos are displayed on one page first
if(count($todos) > $pageSize)
{
$form->dom->pagerSizeMenu->click();
$form->wait(1);
$form->dom->dropdownPicker(2000);
}
$display = array();
$menuInLang = $this->lang->todo->periods->{$menu};
$viewerAccount = $this->config->uitest->defaultAccount;
foreach(COLUMNS as $column)
{
$display[$column] = $form->dom->getElementListByXpathKey($column, true);
$header = $this->lang->todo->{$column};
if(count($display[$column]) != count($todos)) return $this->failed("用户'{$user->realname}'的'{$menuInLang}'菜单'{$header}'列数据数量与实际不匹配");
if($column == 'id') continue;
foreach($display[$column] as $i => $item)
{
$id = $display['id'][$i];
$data = array_column($todos, $column, 'id')[$id];
$private = array_column($todos, 'private', 'id')[$id];
$account = array_column($todos, 'account', 'id')[$id];
if(($column == 'name') and $private and ($account != $viewerAccount)) $data = $this->lang->todo->thisIsPrivate;
if($column == 'date' && $data == FUTURE_DATE) $data = $this->lang->todo->periods->future;
if($column == 'begin' || $column == 'end') $data = sprintf('%02d:%02d', intval($data) / 100, intval($data) % 100);
if($column == 'status') $data = $this->lang->todo->statusList->{$data} ?? $data;
if($column == 'type') $data = $this->lang->todo->typeList->{$data} ?? $data;
if($data != $item) return $this->failed("用户'{$user->realname}'的'{$menuInLang}'菜单'{$header}'列'id={$id}'时数据不匹配:期望'{$data}',实际’{$item}'");
}
}
return null;
}
/**
* 验证分页功能
* Verify pagination functionality
* @param object $form
* @param array $todos
* @param int $pageSize
* @access public
* @return object
*/
private function verifyTodoPagination($form, $todos, $pageSize = 5)
{
$totalTodos = count($todos);
$pages = (int) ceil($totalTodos / $pageSize);
if(count($todos) > $pageSize)
{
$form->dom->pagerSizeMenu->click();
$form->wait(1);
$form->dom->dropdownPicker($pageSize);
$form->dom->firstPage->click();
$form->wait(1);
}
$waitLabel = $this->lang->todo->statusList->wait ?? 'wait';
$doingLabel = $this->lang->todo->statusList->doing ?? 'doing';
$todosById = array();
foreach($todos as $t)
{
$id = is_object($t) ? ($t->id ?? null) : ($t['id'] ?? null);
if($id !== null) $todosById[$id] = $t;
}
for($i = 1; $i <= $pages; $i++)
{
$ids = $form->dom->getElementListByXpathKey('id', true);
$statusTexts = $form->dom->getElementListByXpathKey('status', true);
$totalActual = count($statusTexts);
$waitActual = 0;
$doingActual = 0;
foreach ($statusTexts as $st)
{
$st = trim($st);
if ($st === $waitLabel) $waitActual++;
if ($st === $doingLabel) $doingActual++;
}
$waitExpected = 0;
$doingExpected = 0;
foreach($ids as $id)
{
$id = (int)trim($id);
if(!isset($todosById[$id])) continue;
$todo = $todosById[$id];
$status = is_object($todo) ? ($todo->status ?? '') : ($todo['status'] ?? '');
if($status === 'wait') $waitExpected++;
if($status === 'doing') $doingExpected++;
}
$totalExpected = ($pages === 1) ? $totalTodos : ($i < $pages ? $pageSize : ($totalTodos - $pageSize * ($pages - 1)));
if($totalActual !== $totalExpected) return $this->failed("分页第{$i}页数量不匹配:期望{$totalExpected},实际{$totalActual}");
if($waitActual !== $waitExpected) return $this->failed("分页第{$i}页状态计数不匹配wait期望{$waitExpected}/实际{$waitActual}");
if($doingActual !== $doingExpected) return $this->failed("分页第{$i}页状态计数不匹配doing期望{$doingExpected}/实际{$doingActual}");
if($i < $pages && $form->dom->nextPage)
{
$form->dom->nextPage->click();
$form->wait(1);
}
}
return null;
}
}