synergy/server/db/RunDAO.php (761 lines of code) (raw):

<?php namespace Synergy\DB; use DateTime; use PDO; use Synergy\Controller\Mediator; use Synergy\Misc\Util; use Synergy\Model\AssignmentProgress; use Synergy\Model\AssignmentDuration; use Synergy\Model\RunAttachment; use Synergy\Model\TestAssignment; use Synergy\Model\TestRun; use Synergy\Model\TestRunList; use Synergy\Model\User; use Synergy\App\Synergy; use Synergy\Model\Project\Project; /** * Description of RunDAO * * @author vriha */ class RunDAO { /** * Deletes all test assignments for given specification * @param type $id */ public function deleteAssignmentsForSpecification($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM test_assignement WHERE specification_id=:id "); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } } /** * Deletes all test assignments for given platform * @param type $id */ public function deleteAssignmentsForPlatform($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM test_assignement WHERE platform_id=:id "); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } } /** * Deletes all test assignments for test run * @param type $id */ public function deleteAssignmentsForTestRun($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM test_assignement WHERE test_run_id=:id "); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } return true; } /** * Removes given test assignment * @param type $id * @return boolean */ public function deleteAssignment($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM test_assignement WHERE id=:id "); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } Mediator::emit("assignmentDeleted", $id); return true; } /** * Returns all test runs * @param type $page */ public function getRuns($page) { $start = intval((($page - 1) * RUNS_PAGE)); $stop = intval((RUNS_PAGE)); // sum total cases, cases finished, members DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT count(a.user_id) as members, sum(a.number_of_cases) as cases, sum(a.number_of_completed_cases) as completed, r.title, r.start, r.end, r.id, r.is_active, project.name as pname FROM test_run r LEFT JOIN test_assignement a ON r.id=a.test_run_id LEFT JOIN project ON project.id = r.project_id GROUP BY r.id ORDER BY r.start DESC LIMIT " . $start . "," . $stop); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $runs = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $tr = new TestRun($row['title'], $row['id'], $row['start'], $row['end']); $tr->membersCount = intval($row['members']); $tr->total = intval($row['cases']); $tr->completed = intval($row['completed']); $tr->isActive = intval($row["is_active"]); $tr->projectName = $row["pname"]; if ($tr->completed === $tr->total) { $tr->status = "finished"; } if ($tr->total > $tr->completed) { date_default_timezone_set('UTC'); $today = strtotime(date("Y-m-d H:i:s")); $end = strtotime($row['end']); if ($today > $end) $tr->status = "unfinished"; else $tr->status = "pending"; } array_push($runs, $tr); } $result = new TestRunList($page, $runs); if (count($result->testRuns) < RUNS_PAGE) { $result->nextUrl = ""; } return $result; } /** * Returns list of latest test runs (maximum number of runs is $limit) where end date is >= today, ordered by start date DESC * @param int $limit * @return \TestRunList */ public function getLatestRuns($limit) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT count(a.user_id) as members, sum(a.number_of_cases) as cases, sum(a.number_of_completed_cases) as completed, r.title, r.start, r.end, r.id, project.name as pname FROM test_run r LEFT JOIN test_assignement a ON r.id=a.test_run_id LEFT JOIN project ON project.id = r.project_id WHERE r.end>=NOW() GROUP BY r.id ORDER BY r.start DESC LIMIT " . intval($limit)); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $runs = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $tr = new TestRun($row['title'], $row['id'], $row['start'], $row['end']); $tr->membersCount = intval($row['members']); $tr->total = intval($row['cases']); $tr->completed = intval($row['completed']); $tr->projectName = $row["pname"]; if ($tr->completed === $tr->total) { $tr->status = "finished"; } if ($tr->total > $tr->completed) { date_default_timezone_set('UTC'); $today = strtotime(date("Y-m-d H:i:s")); $end = strtotime($row['end']); if ($today > $end) $tr->status = "unfinished"; else $tr->status = "pending"; } array_push($runs, $tr); } $result = new TestRunList($limit, $runs); if (count($result->testRuns) !== RUNS_PAGE) { $result->nextUrl = ""; } return $result; } /** * Creates new test run * @param type $title * @param type $desc * @param type $start * @param type $stop * @return int ID of new test run */ public function createRun($title, $desc, $start, $stop, $notifications, $projectId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("INSERT INTO test_run (title, description, start, end, notifications_deadline,project_id) VALUES (:title, :desc, :s, :e, :n,:p)"); $handler->bindValue(':title', Util::purifyHTML($title)); $handler->bindValue(':n', $notifications); $handler->bindValue(':p', $projectId); $handler->bindValue(':desc', Util::purifyHTML($desc)); date_default_timezone_set('UTC'); $handler->bindValue(':s', date("Y-m-d H:i:s", strtotime($start))); $handler->bindValue(':e', date("Y-m-d H:i:s", strtotime($stop))); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $newid = DB_DAO::getDB()->lastInsertId(); Mediator::emit("testRunCreated", $newid); return $newid; } /** * Returns basic test run info * @param \TestRun|null $id */ public function getRun($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT title, description, start, end, is_active, notifications_deadline, p.bug_tracking_system, p.name, p.id as pid FROM test_run LEFT JOIN project p ON p.id=test_run.project_id WHERE test_run.id=:id"); $handler->bindParam(":id", $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $tr = new TestRun($row["title"], $id, $row["start"], $row["end"]); $tr->projectName = $row["name"]; $tr->id = intval($id, 10); $tr->projectId = intval($row["pid"], 10); $tr->setBugTrackingSystem($row["bug_tracking_system"]); $tr->notifications = intval($row["notifications_deadline"]); $tr->desc = $row["description"]; $tr->isActive = intval($row["is_active"]); return $tr; } return null; } /** * Updates basic test run information * @param type $id * @param type $title * @param type $desc * @param type $start * @param type $stop * @return boolean true if successful */ public function editRun($id, $title, $desc, $start, $stop, $notifications, $projectId) { DB_DAO::connectDatabase(); date_default_timezone_set('UTC'); $handler = DB_DAO::getDB()->prepare("UPDATE test_run SET title=:t, description=:d, start=:s, end=:e, notifications_deadline=:n, project_id=:p WHERE id=:id"); $handler->bindValue(':id', ($id)); $handler->bindValue(':n', $notifications); $handler->bindValue(':p', $projectId); $handler->bindValue(':t', Util::purifyHTML($title)); $handler->bindValue(':d', Util::purifyHTML($desc)); $handler->bindValue(':s', date("Y-m-d H:i:s", strtotime($start))); $handler->bindValue(':e', date("Y-m-d H:i:s", strtotime($stop))); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } Mediator::emit("testRunEdited", $id); return true; } /** * Removes given test run and all assignments * @param type $id * @return boolean true if successful */ public function deleteRun($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM test_run WHERE id=:id "); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } Mediator::emit("testRunDeleted", $id); return true; } /** * Returns array of assignments for given test run * @param type $id */ public function getAssignments($id, $withIssues) { DB_DAO::connectDatabase(); if ($withIssues) { $handler = DB_DAO::getDB()->prepare("SELECT GROUP_CONCAT( mof.tribe_id SEPARATOR ';' ) AS tribes_id, u.id AS uid, u.username, a.last_updated, a.started, a.issues, a.time_taken, u.first_name,a.keyword_id, u.last_name, p.name, a.state, a.number_of_cases, a.number_of_completed_cases,a.failed_cases,a.passed_cases, a.skipped_cases, k.keyword, a.specification_id,a.id as aid, sp.title as sptitle, a.created_by FROM (test_assignement a, user u, platform p, specification sp) LEFT JOIN keyword k ON k.id=a.keyword_id LEFT JOIN user_is_member_of mof ON mof.user_id = u.id WHERE a.test_run_id=:id AND a.specification_id=sp.id AND p.id=a.platform_id AND a.user_id=u.id GROUP BY a.id "); } else { $handler = DB_DAO::getDB()->prepare("SELECT GROUP_CONCAT( mof.tribe_id SEPARATOR ';' ) AS tribes_id, u.username, u.id AS uid, a.last_updated, a.started, u.first_name,a.keyword_id, u.last_name, p.name, a.state, a.number_of_cases, a.number_of_completed_cases,a.failed_cases,a.passed_cases, a.skipped_cases, k.keyword, a.specification_id,a.id as aid, sp.title as sptitle, a.created_by FROM (test_assignement a, user u, platform p, specification sp) LEFT JOIN keyword k ON k.id=a.keyword_id LEFT JOIN user_is_member_of mof ON mof.user_id = u.id WHERE a.test_run_id=:id AND a.specification_id=sp.id AND p.id=a.platform_id AND a.user_id=u.id GROUP BY a.id "); } $handler->bindValue(":id", $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $assignments = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $tr = new TestAssignment($row["username"], $row["name"], $id, $row["keyword"], $row["number_of_cases"]); $tr->completed = intval($row["number_of_completed_cases"]); $tr->createdBy = intval($row["created_by"]); if (strlen($row["keyword"]) < 1) { $tr->labelId = -1; } else { $tr->labelId = intval($row["keyword_id"]); } $tr->setLastUpdated($row["last_updated"]); $tr->setStarted($row["started"]); $tr->userDisplayName = $row["first_name"] . " " . $row["last_name"]; $tr->failed = intval($row["failed_cases"]); $tr->passed = intval($row["passed_cases"]); $tr->skipped = intval($row["skipped_cases"]); $tr->userId = intval($row["uid"]); $tr->state = $row["state"]; $tr->id = intval($row["aid"]); $tr->specification = $row["sptitle"]; $tr->specificationId = intval($row["specification_id"]); if ($tr->completed === $tr->total) { if ($tr->failed > 0) { $tr->info = "warning"; } else { $tr->info = "finished"; } } else { if ($tr->completed > 0) { $tr->info = "unfinished"; } else { $tr->info = "pending"; } } if ($withIssues) { $tr->timeToComplete = intval($row["time_taken"]); $tr->issues = explode(";", $row["issues"]); if (count($tr->issues) === 1 && strlen($tr->issues[0]) === 0) { $tr->issues = array(); } } $tr->setTribesId($row["tribes_id"]); array_push($assignments, $tr); } return $assignments; } /** * Returns array of assignments for given test run * @param type $id */ public function getAssignmentsInPeriod($id, $from, $to) { date_default_timezone_set('UTC'); DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT u.id AS uid, u.username, a.last_updated, a.started, a.issues, a.time_taken, u.first_name,a.keyword_id, u.last_name, p.name, a.state, a.number_of_cases, a.number_of_completed_cases,a.failed_cases,a.passed_cases, a.skipped_cases, k.keyword, a.specification_id,a.id as aid, sp.title as sptitle, a.created_by FROM (test_assignement a, user u, platform p, specification sp) LEFT JOIN keyword k ON k.id=a.keyword_id WHERE a.test_run_id=:id AND a.specification_id=sp.id AND p.id=a.platform_id AND a.user_id=u.id AND a.last_updated<=:t AND a.last_updated>=:f GROUP BY a.id "); $handler->bindValue(":id", $id); $handler->bindValue(":t", $to); $handler->bindValue(":f", $from); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $assignments = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $tr = new TestAssignment($row["username"], $row["name"], $id, $row["keyword"], $row["number_of_cases"]); $tr->completed = $row["number_of_completed_cases"]; $tr->createdBy = intval($row["created_by"]); if (strlen($row["keyword"]) < 1) { $tr->labelId = -1; } else { $tr->labelId = intval($row["keyword_id"]); } $tr->setLastUpdated($row["last_updated"]); $tr->setStarted($row["started"]); $tr->userDisplayName = $row["first_name"] . " " . $row["last_name"]; $tr->failed = intval($row["failed_cases"]); $tr->passed = intval($row["passed_cases"]); $tr->skipped = intval($row["skipped_cases"]); $tr->userId = intval($row["uid"]); $tr->state = $row["state"]; $tr->id = intval($row["aid"]); $tr->specification = $row["sptitle"]; $tr->specificationId = intval($row["specification_id"]); if ($tr->completed === $tr->total) { if ($tr->failed > 0) { $tr->info = "warning"; } else { $tr->info = "finished"; } } else { if ($tr->completed > 0) { $tr->info = "unfinished"; } else { $tr->info = "pending"; } } $tr->timeToComplete = intval($row["time_taken"]); $tr->issues = explode(";", $row["issues"]); $tr->setTribesId($row["tribes_id"]); array_push($assignments, $tr); } return $assignments; } /** * Returns plain assignment - no progress or test run information included * @param type $assignmentId * @return \TestAssignment|null */ public function getAssignment($assignmentId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT a.last_updated as lup, u.username, p.name, a.state, a.number_of_cases, a.number_of_completed_cases, k.keyword, k.id AS kid, a.specification_id,a.id as aid, sp.title as sptitle, t.id as tid, t.end AS finishedBy FROM (test_assignement a, user u, platform p, specification sp, test_run t) LEFT JOIN keyword k ON k.id=a.keyword_id WHERE a.id=:id AND a.test_run_id=t.id AND a.specification_id=sp.id AND p.id=a.platform_id AND a.user_id=u.id GROUP BY a.id "); $handler->bindValue(":id", $assignmentId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $tr = new TestAssignment($row['username'], $row['name'], $row['tid'], $row['keyword'], $row['number_of_cases']); $tr->completed = intval($row['number_of_completed_cases']); $tr->state = $row['state']; $tr->id = intval($row['aid']); $tr->labelId = (!is_null($row["kid"]) && strlen($row["kid"]) > 0) ? intval($row["kid"]) : -1; $tr->specification = $row['sptitle']; if (is_null($row["lup"])) { date_default_timezone_set('UTC'); $tr->lastUpdated = date('Y-m-d H:i:s'); } else { $tr->lastUpdated = $row["lup"]; } $tr->specificationId = intval($row['specification_id']); $tr->deadline = $row["finishedBy"]; if ($tr->completed === $tr->total) { $tr->info = "finished"; } else { $tr->info = "pending"; } return $tr; } return null; } /** * Returns array of RunAttachment * @param type $id */ public function getAttachments($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT s.id, s.path FROM run_attachement s WHERE s.test_run_id=:id"); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $data = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { array_push($data, new RunAttachment($row['path'], $row['id'], $id)); } return $data; } /** * Creates new assignment * @param type $specificationId * @param type $platformId * @param type $labelId * @param type $testRunId * @param type $userId * @param type $numberOfCases s * @return boolean true if successful */ public function createAssignment($specificationId, $platformId, $labelId, $testRunId, $userId, $numberOfCases, $createdBy) { DB_DAO::connectDatabase(); if (intval($labelId) < 1) { $handler = DB_DAO::getDB()->prepare("INSERT INTO test_assignement (user_id, platform_id, specification_id, test_run_id, number_of_cases, number_of_completed_cases, state, created_by) VALUES (:u, :p, :s, :t, :c, 0, '', :x)"); } else { $handler = DB_DAO::getDB()->prepare("INSERT INTO test_assignement (user_id, platform_id, specification_id, test_run_id, keyword_id, number_of_cases, number_of_completed_cases, state, created_by) VALUES (:u, :p, :s, :t, :k, :c, 0, '', :x)"); $handler->bindValue(':k', intval($labelId)); } $handler->bindValue(':s', intval($specificationId)); $handler->bindValue(':p', intval($platformId)); $handler->bindValue(':t', intval($testRunId)); $handler->bindValue(':u', $userId); $handler->bindValue(':c', $numberOfCases); $handler->bindValue(':x', $createdBy); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } Mediator::emit("assignmentCreated", DB_DAO::getDB()->lastInsertId()); return true; } /** * For each assignment, get list of cases ordered by SUITE_TITLE + CASE_TITLE. If these data are not yet in DB, it will be * created (not stored though) and returned to user so he'll get empty/blank progress * @param int $id assignment id * @return AssignmentProgress $data */ public function getAssigmentProgress($id, $label = '') { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT data FROM assignment_progress s WHERE test_assignement_id=:id"); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $handler->bindColumn(1, $data, PDO::PARAM_LOB); while ($handler->fetch()) { return json_decode(gzuncompress($data)); } return null; // OBSOLETE - but to be sure let it be here until its all fixed //// so nothing found here :/ // $assignment = RunDAO::getSkeletonAssignment($id); // if (is_null($assignment)) // return null; // // // no we need to get all test suits and for each suit its cases // // $specification = SpecificationDAO::getSkeletonSpecificationWithSuites($assignment->specificationId); // if (is_null($specification)) { // return null; // } // // foreach ($specification->testSuites as $ts) { // $ts->testCases = SuiteDAO::getSkeletonTestCases($ts->id, $label); // } // return new AssignmentProgress($id, $specification, $assignment->userId); } /** * Returns basic information about assignment * @deprecated * @param int $id assignment ID * @return \TestAssignment|null */ public static function getSkeletonAssignment($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT a.user_id, a.specification_id FROM test_assignement a WHERE a.id=:id"); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $ta = new TestAssignment('', '', $id, '', 0); $ta->specificationId = intval($row['specification_id']); $ta->userId = intval($row['user_id']); return $ta; } return null; } /** * Checks if given user is assigned to given test assignment * @param type $id * @param type $username * @return boolean true if user is assigned for given assignment */ public function checkUserIsAssigned($id, $username) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT a.user_id FROM test_assignement a, user u WHERE a.user_id=u.id AND u.username=:u AND a.id=:id"); $handler->bindParam(':id', $id); $handler->bindParam(':u', $username); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return true; } return false; } /** * Saves assignment progress to DB * @param type $json data * @param type $id assignment ID */ public function saveAssignmentProgress($json, $id) { DB_DAO::connectDatabase(); $handler2 = DB_DAO::getDB()->prepare("INSERT INTO assignment_progress (`data`, test_assignement_id) VALUES (:d,:id)"); $handler2->bindParam(':id', $id); $c = gzcompress($json); $handler2->bindParam(':d', $c, PDO::PARAM_LOB); if (!$handler2->execute()) { DB_DAO::throwDbError($handler2->errorInfo()); } } /** * Updates cases count based on data retrieved from finished test assignment * @param type $id assignment ID * @param type $numberOfCases * @param type $numberOfCasesCompleted * @param type $failedCases * @param type $skippedCases * @param type $passedCases */ public function updateAssignment($id, $numberOfCases, $numberOfCasesCompleted, $failedCases, $skippedCases, $passedCases, $totalTime = 0) { DB_DAO::connectDatabase(); if ($numberOfCases < 0) { $handler2 = DB_DAO::getDB()->prepare("UPDATE test_assignement SET last_updated=:lt, number_of_completed_cases=:ncom, failed_cases=:fc, passed_cases=:pc, skipped_cases=:sc, time_taken=:ti WHERE id=:id"); } else { $handler2 = DB_DAO::getDB()->prepare("UPDATE test_assignement SET last_updated=:lt, number_of_cases=:noc, number_of_completed_cases=:ncom, failed_cases=:fc, passed_cases=:pc, skipped_cases=:sc, time_taken=:ti WHERE id=:id"); $handler2->bindParam(':noc', $numberOfCases); } Synergy::log("[" . Synergy::getSessionProvider()->getUsername() . "] updated test assignment " . $id . "; completed cases: " . $numberOfCasesCompleted . "; time taken " . $totalTime . "; total cases " . $numberOfCases); date_default_timezone_set('UTC'); $localTime = date('Y-m-d H:i:s'); $handler2->bindParam(':lt', $localTime); $handler2->bindParam(':id', $id); $handler2->bindParam(':ncom', $numberOfCasesCompleted); $handler2->bindParam(':fc', $failedCases); $handler2->bindParam(':sc', $skippedCases); $handler2->bindParam(':pc', $passedCases); $handler2->bindParam(':ti', $totalTime); if (!$handler2->execute()) { DB_DAO::throwDbError($handler2->errorInfo()); } } /** * Removes assignment progress JSON dump from DB * @param type $id * @return boolean */ public function deleteAssignmentProgress($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM assignment_progress WHERE test_assignement_id=:id "); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } return true; } /** * Returns title of test run for given assignment * @param type $assignmentId * @return string */ public function getRunTitleForAssignment($assignmentId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT t.title FROM test_assignement a, test_run t WHERE a.id=:id AND a.test_run_id=t.id"); $handler->bindParam(':id', $assignmentId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return $row['title']; } return ''; } /** * Returns all users assignments * @param String $username * @return TestAssignment[] Description */ public function getAllUsersAssignments($username) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT p.name, a.state,rn.id as rnid, rn.title as rntitle, a.number_of_cases, a.number_of_completed_cases,a.failed_cases,a.passed_cases, a.skipped_cases, k.keyword, a.specification_id,a.id as aid, sp.title as sptitle FROM (test_assignement a, user u, platform p, specification sp, test_run rn) LEFT JOIN keyword k ON k.id=a.keyword_id WHERE a.test_run_id=rn.id AND a.specification_id=sp.id AND p.id=a.platform_id AND a.user_id=u.id AND u.username=:u GROUP BY a.id "); $handler->bindParam(":u", $username); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $assignments = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $tr = new TestAssignment($username, $row['name'], $row['rnid'], $row['keyword'], $row['number_of_cases']); $tr->completed = intval($row['number_of_completed_cases']); $tr->testRunTitle = $row['rntitle']; $tr->failed = intval($row['failed_cases']); $tr->passed = intval($row['passed_cases']); $tr->skipped = intval($row['skipped_cases']); $tr->state = $row['state']; $tr->id = intval($row['aid']); $tr->specification = $row['sptitle']; $tr->specificationId = intval($row['specification_id']); if ($tr->completed === $tr->total) { $tr->info = "finished"; } else { $tr->info = "pending"; } array_push($assignments, $tr); } return $assignments; } /** * Returns all users assignments that are either unfinished (cases total != cases completed) or are still running (test run's end date >= today) * @param String $username * @return TestAssignment[] Description */ public function getUsersAssignments($username) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT project.name AS prname,p.name, a.state,rn.id as rnid, rn.title as rntitle, a.number_of_cases, a.number_of_completed_cases,a.failed_cases,a.passed_cases, a.skipped_cases, k.keyword, a.specification_id,a.id as aid, sp.title as sptitle FROM (test_assignement a, user u, platform p, specification sp, test_run rn) LEFT JOIN keyword k ON k.id=a.keyword_id LEFT JOIN project ON project.id = rn.project_id WHERE (rn.end>=NOW() AND a.number_of_cases!=a.number_of_completed_cases) AND a.test_run_id=rn.id AND a.specification_id=sp.id AND p.id=a.platform_id AND a.user_id=u.id AND u.username=:u GROUP BY a.id "); $handler->bindParam(":u", $username); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $assignments = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $tr = new TestAssignment($username, $row['name'], $row['rnid'], $row['keyword'], $row['number_of_cases']); $tr->completed = intval($row['number_of_completed_cases']); $tr->testRunProjectName = $row["prname"]; $tr->testRunTitle = $row['rntitle']; $tr->failed = intval($row['failed_cases']); $tr->passed = intval($row['passed_cases']); $tr->skipped = intval($row['skipped_cases']); $tr->state = $row['state']; $tr->id = intval($row['aid']); $tr->specification = $row['sptitle']; $tr->specificationId = intval($row['specification_id']); if ($tr->completed === $tr->total) { $tr->info = "finished"; } else { $tr->info = "pending"; } array_push($assignments, $tr); } return $assignments; } /** * Returns all test runs with start date greater than or equal $startDate and smaller or equal $stopDate * @param DateTime $startDate * @param DateTime $stopDate * @return TestRun[] */ public function getRunsByDate($startDate, $stopDate) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT title, id, description, start, end FROM test_run WHERE start>=:startDate OR end<=:stopDate"); $handler->bindParam(":startDate", $startDate); $handler->bindParam(":stopDate", $stopDate); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $runs = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $tr = new TestRun($row['title'], $row['id'], $row['start'], $row['end']); $tr->desc = $row['description']; array_push($runs, $tr); } return $runs; } /** * Returns only basic information about assignment * @param int $id assignment ID * @return TestAssignment|null Description */ public function getBasicAssignment($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT u.username as uusername, p.name, a.state,rn.id as rnid, rn.title as rntitle, rn.end as rnend, k.keyword, a.specification_id,a.id as aid, sp.title as sptitle FROM (test_assignement a, platform p, specification sp, user u, test_run rn) LEFT JOIN keyword k ON k.id=a.keyword_id WHERE a.id=:id AND a.test_run_id=rn.id AND a.specification_id=sp.id AND p.id=a.platform_id AND a.user_id=u.id"); $handler->bindParam(":id", $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $tr = new TestAssignment($row['uusername'], $row['name'], $row['rnid'], $row['keyword'], -1); $tr->testRunTitle = $row['rntitle']; $tr->id = intval($row['aid']); $tr->deadline = $row['rnend']; $tr->specification = $row['sptitle']; $tr->specificationId = intval($row['specification_id']); return $tr; } return null; } /** * Adds start timestamp to assignment * @param int $assignmentId * @param DateTime $startTime */ public function startAssignment($assignmentId, $startTime) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("UPDATE test_assignement SET started=:s WHERE id=:id"); $handler->bindParam(':id', $assignmentId); $handler->bindParam(':s', $startTime); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } } public function assignmentAlreadyStarted($assignmentId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT started FROM test_assignement WHERE id=:id"); $handler->bindParam(":id", $assignmentId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { if (isset($row['started']) && !is_null($row['started'])) { return true; } } return false; } public function getAssignees($testRunId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT DISTINCT u.username, u.email_notifications,u.email FROM test_assignement t, user u WHERE u.id=t.user_id AND t.test_run_id=:tid"); $handler->bindParam(":tid", $testRunId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $data = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $u = new User($row['username']); $u->email = $row['email']; $u->emailNotifications = (intval($row['email_notifications']) === 1 ? true : false); $data[$row['username']] = $u; } return $data; } public function deleteAssignmentProgressForPlatform($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE a.* FROM assignment_progress a, test_assignement b WHERE a.test_assignement_id=b.id AND b.platform_id=:id "); $handler->bindParam(':id', $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } return true; } public function getIncompleteAssignmIdBySpecId($specificationId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT ta.id FROM test_assignement ta, assignment_progress ap WHERE ta.specification_id=:id AND ta.number_of_cases > ta.number_of_completed_cases AND ta.id=ap.test_assignement_id"); // not yet completed $handler->bindParam(":id", $specificationId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $data = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { array_push($data, intval($row['id'])); } return $data; } public function getAssignmentsBySpecification($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT a.id FROM test_assignement a WHERE a.specification_id=:id"); $handler->bindValue(":id", $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $assignments = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $t = new TestAssignment('', '', -1, '', ''); $t->id = intval($row['id']); array_push($assignments, $t); } return $assignments; } public function setActive($testRunId, $isFrozen) { DB_DAO::connectDatabase(); if ($isFrozen) { $handler = DB_DAO::getDB()->prepare("UPDATE test_run SET is_active=0 WHERE id=:id"); } else { $handler = DB_DAO::getDB()->prepare("UPDATE test_run SET is_active=1 WHERE id=:id"); } $handler->bindParam(':id', $testRunId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } return true; } public static function runIsActive($testRunId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT is_active FROM test_run WHERE id=:id"); $handler->bindValue(":id", $testRunId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return (intval($row["is_active"]) === 1) ? true : false; } return false; } public function getRunIdByAssignmentId($assignmentId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT test_run_id FROM test_assignement WHERE id=:id"); $handler->bindValue(":id", $assignmentId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return intval($row["test_run_id"]); } return -1; } public function deleteAssignmentProgressForRun($testRunId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE a.* FROM assignment_progress a, test_assignement b WHERE a.test_assignement_id=b.id AND b.test_run_id=:id "); $handler->bindParam(':id', $testRunId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } return true; } public function addIssues($id, $issuesString) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("UPDATE test_assignement SET issues=:is WHERE id=:id"); $handler->bindParam(':id', $id); $handler->bindParam(':is', Util::purifyHTML($issuesString)); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } return true; } public function getRunTitle($testRunId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT title FROM test_run WHERE id=:id"); $handler->bindValue(":id", $testRunId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return $row["title"]; } return ""; } public function isRequestUpToDate($assignmentId, $requestedTimestamp) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT id FROM test_assignement WHERE id=:id AND (last_updated<:da OR last_updated IS NULL)"); $handler->bindValue(":id", $assignmentId); $handler->bindValue(":da", $requestedTimestamp); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return true; // existing record is older } return false; } public function getProject($testRunId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT project_id, p.name as pname FROM test_run, project p WHERE p.id=project_id AND test_run.id=:id"); $handler->bindValue(":id", $testRunId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return new Project(intval($row["project_id"], 10), $row["pname"]); } return null; } public function insertBlob($assignmentId, $runId, $blob) { DB_DAO::connectDatabase(); date_default_timezone_set('UTC'); $handler = DB_DAO::getDB()->prepare("INSERT INTO assignment_blob (assignment_id, test_run_id, data, created) VALUES (:a, :r, :d, :c)"); $handler->bindValue(':a', $assignmentId); $handler->bindValue(':r', $runId); $handler->bindValue(':d', $blob); $localTime = date('Y-m-d H:i:s'); $handler->bindValue(':c', $localTime); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $newid = DB_DAO::getDB()->lastInsertId(); return $newid; } public function removeBlob($assignmentId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM assignment_blob WHERE assignment_id=:id "); $handler->bindParam(':id', $assignmentId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } } public function getBlobs($runId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT data FROM assignment_blob WHERE test_run_id=:id "); $handler->bindParam(':id', $runId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $d = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { array_push($d, json_decode($row["data"])); } return $d; } public function getDurations($runId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT time_taken, id FROM test_assignement WHERE test_run_id=:id "); $handler->bindParam(':id', $runId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $d = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { array_push($d, new AssignmentDuration($row["id"], $row["time_taken"])); } return $d; } } ?>