* @copyright 2017 * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 * @category Stud.IP * @package tests * @since 4.2 */ require_once __DIR__ . '/../../../_bootstrap.php'; class RoomTest extends \Codeception\Test\Unit { protected $db_handle; protected $oldPerm; protected $oldUser; private $test_user_username; private $test_user; private $location_cat; private $building_cat; private $room_cat; private $location; private $building; private $room; private $request_begin_date; private $request_end_date; private $course_date; private $room_request; protected function setUp(): void { //First we must initialise the StudipPDO database connection: $this->db_handle = new \StudipPDO( 'mysql:host=' . $GLOBALS['DB_STUDIP_HOST'] . ';dbname=' . $GLOBALS['DB_STUDIP_DATABASE'], $GLOBALS['DB_STUDIP_USER'], $GLOBALS['DB_STUDIP_PASSWORD'] ); //Then we must start a transaction before we access the database, //otherwise we would spam the live database with test data! $this->db_handle->beginTransaction(); //Now we tell the DBManager about the connection //we have established to the Stud.IP database: \DBManager::getInstance()->setConnection('studip', $this->db_handle); // Workaround old-style Stud.IP-API using $GLOBALS['user'] $this->oldUser = $GLOBALS['user'] ?? null; $GLOBALS['user'] = new \Seminar_User( \User::findByUsername('root@studip') ); $this->oldPerm = $GLOBALS['perm'] ?? null; $GLOBALS['perm'] = new \Seminar_Perm(); //As a final step we create the SORM objects for our test cases: $this->test_user_username = 'test_user_' . date('YmdHis'); $this->test_user = User::create([ 'username' => $this->test_user_username, 'vorname' => 'Test', 'nachname' => 'User', 'perms' => 'admin', ]); ResourcePermission::create([ 'user_id' => $this->test_user->id, 'resource_id' => 'global', 'perms' => 'tutor', ]); $this->location_cat = ResourceManager::createLocationCategory('TestLocation'); $this->building_cat = ResourceManager::createBuildingCategory('TestBuilding'); $this->room_cat = ResourceManager::createRoomCategory('TestRoom'); $this->location = $this->location_cat->createResource('Test location object'); $this->building = $this->building_cat->createResource( 'Test building object', '', $this->location->id ); $this->room = $this->room_cat->createResource( 'Test room object', '', $this->building->id ); //The room must have at least than 22 seats or we won't find //it when we're testing finding rooms by a room request. //The request we create is for a room with at least 22 seats. $this->room->seats = 25; $this->room->requestable = true; $this->room->store(); $this->request_begin_date = new DateTime(); $this->request_begin_date->setTime(12,0,0); $this->request_end_date = clone $this->request_begin_date; $this->request_end_date->setTime(14,0,0); $this->course_date = CourseDate::create([ 'date' => $this->request_begin_date->getTimestamp(), 'end_time' => $this->request_end_date->getTimestamp(), ]); $this->room_request = $this->room->createRequest( $this->test_user, $this->course_date->id, 'test', [ 'seats' => 22 ] ); //Everything is set up for the test cases. } protected function tearDown(): void { //We must roll back the changes we made in this test //so that the live database remains unchanged after //all the test cases of this test have been finished: $this->db_handle->rollBack(); // Workaround old-style Stud.IP-API using $GLOBALS['user'] $GLOBALS['perm'] = $this->oldPerm; $GLOBALS['user'] = $this->oldUser; } //The tests for findParentByClassName and findChildrenByClassName //could have been placed in the ResourceTest class. But since //we must create a resource hierarchy in the RoomTest class //anyways to test the Room class, we can also test those methods //in here. public function testFindParentByClassName() { $location = $this->room->findParentByClassName('Location'); $this->assertEquals( $this->location->name, $location->name ); $this->assertEquals( $this->room->parent->parent->id, $location->id ); } public function testFindChildrenByClassName() { $room = $this->location->findChildrenByClassName('Room')[0]; $this->assertEquals( $this->room->name, $room->name ); //The location and the building each have one child. $this->assertEquals( $room->id, $this->location->children[0]->children[0]->id ); } public function testFindBuilding() { $building = $this->room->findBuilding(); $this->assertEquals( $building->id, $this->building->id ); } public function testFindByBuilding() { $rooms = Room::findByBuilding($this->building->id); $this->assertEquals( $rooms[0]->id, $this->room->id ); $this->assertEquals( $rooms[0]->name, $this->room->name ); } public function testFindByRoomRequestAndProperties() { $room = Room::findByRoomRequestAndProperties( $this->room_request, $this->test_user, 0, 0, [$this->room] )[0]; $this->assertEquals( $this->room->id, $room->id ); } }