share(function ($DI) { return $this->loadApp('/lib/Alchemy/Phrasea/Application/Root.php'); }); self::$DI['cli'] = self::$DI->share(function ($DI) { return $this->loadCLI(); }); self::$DI['client'] = self::$DI->share(function ($DI) { return new Client($DI['app'], []); }); self::$DI['user'] = self::$DI->share(function ($DI) { $user = User_Adapter::getInstance(self::$fixtureIds['user']['test_phpunit'], $DI['app']); $user->purgePreferences(); return $user; }); self::$DI['user_notAdmin'] = self::$DI->share(function ($DI) { return User_Adapter::getInstance(self::$fixtureIds['user']['test_phpunit_not_admin'], $DI['app']); }); self::$DI['user_alt1'] = self::$DI->share(function ($DI) { return User_Adapter::getInstance(self::$fixtureIds['user']['test_phpunit_alt1'], $DI['app']); }); self::$DI['user_alt2'] = self::$DI->share(function ($DI) { return User_Adapter::getInstance(self::$fixtureIds['user']['test_phpunit_alt2'], $DI['app']); }); self::$DI['logger'] = self::$DI->share(function () { $logger = new Logger('tests'); $logger->pushHandler(new NullHandler()); return $logger; }); self::$DI['collection'] = self::$DI->share(function ($DI) { return collection::get_from_base_id($DI['app'], self::$fixtureIds['collection']['coll']); }); self::$DI['collection_no_access'] = self::$DI->share(function ($DI) { return collection::get_from_base_id($DI['app'], self::$fixtureIds['collection']['coll_no_access']); }); self::$DI['collection_no_access_by_status'] = self::$DI->share(function ($DI) { return collection::get_from_base_id($DI['app'], self::$fixtureIds['collection']['coll_no_status']); }); if (!self::$booted) { if (!self::$DI['app']['phraseanet.configuration-tester']->isInstalled()) { echo "\033[0;31mPhraseanet is not set up\033[0;37m\n"; exit(1); } $this->createSetOfUserTests(self::$DI['app']); self::setCollection(self::$DI['app']); self::resetUsersRights(self::$DI['app'], self::$DI['user']); self::resetUsersRights(self::$DI['app'], self::$DI['user_notAdmin']); self::$booted = true; } self::$DI['record_id_resolver'] = self::$DI->protect(function ($id) { if (isset(self::$fixtureIds['records'][$id])) { return self::$fixtureIds['records'][$id]; } self::$recordsInitialized[] = $id; $file = new File(self::$DI['app'], self::$DI['app']['mediavorus']->guess(__DIR__ . '/../files/' . ($id < 10 ? 'test00' . $id . '.jpg' : 'test0' . $id . '.jpg')), self::$DI['collection']); $record = record_adapter::createFromFile($file, self::$DI['app']); $record->generate_subdefs($record->get_databox(), self::$DI['app']); self::$fixtureIds['records'][$id] = $record->get_record_id(); return self::$fixtureIds['records'][$id]; }); self::$DI['story_id_resolver'] = self::$DI->protect(function ($id) { $id = 'story_'.$id; if (isset(self::$fixtureIds['records'][$id])) { return self::$fixtureIds['records'][$id]; } self::$recordsInitialized[] = $id; $story = record_adapter::createStory(self::$DI['app'], self::$DI['collection']); $media = self::$DI['app']['mediavorus']->guess(__DIR__ . '/../files/cestlafete.jpg'); $story->substitute_subdef('preview', $media, self::$DI['app']); $story->substitute_subdef('thumbnail', $media, self::$DI['app']); self::$fixtureIds['records'][$id] = $story->get_record_id(); return self::$fixtureIds['records'][$id]; }); foreach (range(1, 24) as $i) { self::$DI['record_' . $i] = self::$DI->share(function ($DI) use ($i) { return new \record_adapter($DI['app'], self::$fixtureIds['databox']['records'], $DI['record_id_resolver']($i)); }); } foreach (range(1, 2) as $i) { self::$DI['record_story_' . $i] = self::$DI->share(function ($DI) use ($i) { return new \record_adapter($DI['app'], self::$fixtureIds['databox']['records'], $DI['story_id_resolver']($i)); }); } self::$DI['record_no_access_resolver'] = self::$DI->protect(function () { $id = 'no_access'; if (isset(self::$fixtureIds['records'][$id])) { return self::$fixtureIds['records'][$id]; } self::$recordsInitialized[] = $id; $file = new File(self::$DI['app'], self::$DI['app']['mediavorus']->guess(__DIR__ . '/../files/cestlafete.jpg'), self::$DI['collection_no_access']); $record = record_adapter::createFromFile($file, self::$DI['app']); $record->generate_subdefs($record->get_databox(), self::$DI['app']); self::$fixtureIds['records'][$id] = $record->get_record_id(); return self::$fixtureIds['records'][$id]; }); self::$DI['record_no_access_by_status_resolver'] = self::$DI->protect(function () { $id = 'no_access_by_status'; if (isset(self::$fixtureIds['records'][$id])) { return self::$fixtureIds['records'][$id]; } self::$recordsInitialized[] = $id; $file = new File(self::$DI['app'], self::$DI['app']['mediavorus']->guess(__DIR__ . '/../files/cestlafete.jpg'), self::$DI['collection_no_access_by_status']); $record = record_adapter::createFromFile($file, self::$DI['app']); $record->generate_subdefs($record->get_databox(), self::$DI['app']); self::$fixtureIds['records'][$id] = $record->get_record_id(); return self::$fixtureIds['records'][$id]; }); self::$DI['record_no_access'] = self::$DI->share(function ($DI) { return new \record_adapter($DI['app'], self::$fixtureIds['databox']['records'], $DI['record_no_access_resolver']()); }); self::$DI['record_no_access_by_status'] = self::$DI->share(function ($DI) { return new \record_adapter($DI['app'], self::$fixtureIds['databox']['records'], $DI['record_no_access_by_status_resolver']()); }); if (!self::$testCaseBooted) { $this->bootTestCase(); } self::$testCaseBooted = true; } public static function tearDownAfterClass() { self::$testCaseBooted = false; } protected function bootTestCase() { } protected function loadCLI($environment = Application::ENV_TEST) { $cli = new CLI('cli test', null, $environment); $this->addMocks($cli); return $cli; } protected function loadApp($path = null, $environment = Application::ENV_TEST) { if (null !== $path) { $app = require __DIR__ . '/../../' . $path; } else { $app = new Application($environment); } $this->addMocks($app); return $app; } protected function addMocks(Application $app) { $app['debug'] = true; $app['form.csrf_provider'] = $app->share(function () { return new CsrfTestProvider(); }); $app['url_generator'] = $app->share($app->extend('url_generator', function ($generator, $app) { $host = parse_url($app['conf']->get(['main', 'servername']), PHP_URL_HOST); $generator->setContext(new RequestContext('', 'GET', $host)); return $generator; })); $app['translator'] = $this->createTranslatorMock(); $app['phraseanet.SE.subscriber'] = $this->getMock('Symfony\Component\EventDispatcher\EventSubscriberInterface'); $app['phraseanet.SE.subscriber']::staticExpects($this->any()) ->method('getSubscribedEvents') ->will($this->returnValue([])); $app['translator'] = $this->createTranslatorMock(); $app['EM'] = $app->share($app->extend('EM', function ($em) { $this->initializeSqliteDB(); return $em; })); $app['browser'] = $app->share($app->extend('browser', function ($browser) { $browser->setUserAgent(self::USER_AGENT_FIREFOX8MAC); return $browser; })); $app['notification.deliverer'] = $this->getMockBuilder('Alchemy\Phrasea\Notification\Deliverer') ->disableOriginalConstructor() ->getMock(); $app['notification.deliverer']->expects($this->any()) ->method('deliver') ->will($this->returnCallback(function () { $this->fail('Notification deliverer must be mocked'); })); } public function tearDown() { /** * Kris Wallsmith pro-tip * @see http://kriswallsmith.net/post/18029585104/faster-phpunit */ $refl = new ReflectionObject($this); foreach ($refl->getProperties() as $prop) { if (!$prop->isStatic() && 0 !== strpos($prop->getDeclaringClass()->getName(), 'PHPUnit_') && 0 !== strpos($prop->getDeclaringClass()->getName(), 'Phraseanet')) { $prop->setAccessible(true); $prop->setValue($this, null); } } $refl = null; parent::tearDown(); //In case some executed script modify 'max_execution_time' ini var //Initialize set_time_limit(0) which is the default value for PHP CLI set_time_limit(0); } protected function assertForbiddenResponse(Response $response) { $this->assertEquals(403, $response->getStatusCode()); $this->assertTrue(false !== stripos($response->getContent(), 'Sorry, you do have access to the page you are looking for')); } protected function assertBadResponse(Response $response) { $this->assertEquals(400, $response->getStatusCode()); $this->assertTrue(false !== stripos($response->getContent(), 'bad request')); } protected function assertNotFoundResponse(Response $response) { $this->assertEquals(404, $response->getStatusCode()); $this->assertTrue(false !== stripos($response->getContent(), 'Sorry, the page you are looking for could not be found')); } protected function assertDateAtom($date) { return $this->assertRegExp('/\d{4}[-]\d{2}[-]\d{2}[T]\d{2}[:]\d{2}[:]\d{2}[+]\d{2}[:]\d{2}/', $date); } protected function set_user_agent($user_agent, Application $app) { $app['browser']->setUserAgent($user_agent); $app->register(new \Silex\Provider\TwigServiceProvider()); $app->setupTwig(); self::$DI['client'] = self::$DI->share(function ($DI) use ($app) { return new Client($app, []); }); } /** * Inserts two tasks. * * @return Task[] */ public function insertTwoTasks() { $task1 = new Task(); $task1 ->setName('task 1') ->setJobId('Null'); $task2 = new Task(); $task2 ->setName('task 2') ->setJobId('Null'); self::$DI['app']['EM']->persist($task1); self::$DI['app']['EM']->persist($task2); self::$DI['app']['EM']->flush(); return [$task1, $task2]; } /** * Inserts one basket. * * @param User_Adapter $user * * @return Basket */ protected function insertOneBasket(\User_Adapter $user = null) { $basket = new Basket(); $basket->setOwner($user ?: self::$DI['user']); $basket->setName('test'); $basket->setDescription('description test'); self::$DI['app']['EM']->persist($basket); self::$DI['app']['EM']->flush(); return $basket; } /** * Inserts one feed. * * @param User_Adapter $user * @param string|null $title * @param bool $public * * @return Feed */ protected function insertOneFeed(\User_Adapter $user = null , $title = null, $public = false) { $feed = new Feed(); $publisher = new FeedPublisher(); $user = $user ?: self::$DI['user']; $publisher->setUsrId($user->get_id()); $publisher->setIsOwner(true); $publisher->setFeed($feed); $feed->addPublisher($publisher); $feed->setTitle($title ?: "test"); $feed->setIsPublic($public); $feed->setSubtitle("description"); self::$DI['app']['EM']->persist($feed); self::$DI['app']['EM']->persist($publisher); self::$DI['app']['EM']->flush(); return $feed; } /** * Inserts one feed entry. * * @param User_Adapter $user * @param bool $public * * @return FeedEntry */ protected function insertOneFeedEntry(\User_Adapter $user = null, $public = false) { $feed = $this->insertOneFeed($user, null, $public); $entry = new FeedEntry(); $entry->setFeed($feed); $entry->setTitle("test"); $entry->setSubtitle("description"); $entry->setAuthorName('user'); $entry->setAuthorEmail('user@email.com'); $publisher = $feed->getPublisher($user ?: self::$DI['user']); if ($publisher !== null) { $entry->setPublisher($publisher); } $feed->addEntry($entry); self::$DI['app']['EM']->persist($entry); self::$DI['app']['EM']->persist($feed); self::$DI['app']['EM']->flush(); return $entry; } /** * Inserts one feed token. * * @param Feed $feed * @param User_Adapter $user * * @return FeedToken */ protected function insertOneFeedToken(Feed $feed, \User_Adapter $user = null) { $user = $user ?: self::$DI['user']; $token = new FeedToken(); $token->setValue(self::$DI['app']['tokens']->generatePassword(12)); $token->setFeed($feed); $token->setUsrId($user->get_id()); $feed->addToken($token); self::$DI['app']['EM']->persist($token); self::$DI['app']['EM']->persist($feed); self::$DI['app']['EM']->flush(); return $token; } /** * Insert one aggregate token. * * @param User_Adapter $user * * @return AggregateToken */ protected function insertOneAggregateToken(\User_Adapter $user = null) { $user = $user ?: self::$DI['user']; $token = new AggregateToken(); $token->setValue(self::$DI['app']['tokens']->generatePassword(12)); $token->setUsrId($user->get_id()); self::$DI['app']['EM']->persist($token); self::$DI['app']['EM']->flush(); return $token; } /** * Inserts one feed item. * * @param User_Adapter $user * @param boolean $public * @param integer $qty * @param record_adapter $record * * @return FeedItem */ protected function insertOneFeedItem(\User_Adapter $user = null, $public = false, $qty = 1, \record_adapter $record = null) { $entry = $this->insertOneFeedEntry($user, $public); for ($i = 0; $i < $qty; $i++) { $item = new FeedItem(); $item->setEntry($entry); if (null === $record) { $actual = self::$DI['record_'.($i+1)]; } else { $actual = $record; } $item->setRecordId($actual->get_record_id()); $item->setSbasId($actual->get_sbas_id()); $item->setEntry($entry); $entry->addItem($item); self::$DI['app']['EM']->persist($item); } self::$DI['app']['EM']->persist($entry); self::$DI['app']['EM']->flush(); return $item; } /** * Inserts one lazaret file. * * @param User_Adapter $user * * @return LazaretFile */ protected function insertOneLazaretFile(\User_Adapter $user = null) { $user = $user ?: self::$DI['user']; $lazaretSession = new LazaretSession(); $lazaretSession->setUsrId($user->get_id()); $lazaretSession->setUpdated(new \DateTime('now')); $lazaretSession->setCreated(new \DateTime('-1 day')); $lazaretFile = new LazaretFile(); $lazaretFile->setOriginalName('test'); $lazaretFile->setFilename('test.jpg'); $lazaretFile->setThumbFilename('thumb_test.jpg'); $lazaretFile->setBaseId(self::$DI['collection']->get_base_id()); $lazaretFile->setSession($lazaretSession); $lazaretFile->setSha256('3191af52748620e0d0da50a7b8020e118bd8b8a0845120b0bb'); $lazaretFile->setUuid('7b8ef0e3-dc8f-4b66-9e2f-bd049d175124'); $lazaretFile->setCreated(new \DateTime('now')); $lazaretFile->setUpdated(new \DateTime('-1 day')); self::$DI['app']['EM']->persist($lazaretFile); self::$DI['app']['EM']->flush(); return $lazaretFile; } /** * Inserts one user list owner. * * @param User_Adapter $user * * @return UsrListOwner */ protected function insertOneUsrListOwner(\User_Adapter $user = null) { $user = $user ?: self::$DI['user']; $owner = new UsrListOwner(); $owner->setRole(UsrListOwner::ROLE_ADMIN); $owner->setUser($user); self::$DI['app']['EM']->persist($owner); self::$DI['app']['EM']->flush(); return $owner; } /** * Inserts one user list. * * @param User_Adapter $user * * @return UsrListOwner */ protected function insertOneUsrList(\User_Adapter $user = null) { $owner = $this->insertOneUsrListOwner($user); $list = new UsrList(); $list->setName('new list'); $list->addOwner($owner); $owner->setList($list); self::$DI['app']['EM']->persist($list); self::$DI['app']['EM']->flush(); return $list; } /** * Insert one user list entry. * * @param User_adapter $owner * @param User_adapter $user * * @return UsrListEntry */ protected function insertOneUsrListEntry(\User_adapter $owner, \User_adapter $user) { $list = $this->insertOneUsrList($owner); $entry = new UsrListEntry(); $entry->setUser($user); $entry->setList($list); $list->addEntrie($entry); self::$DI['app']['EM']->persist($entry); self::$DI['app']['EM']->persist($list); self::$DI['app']['EM']->flush(); return $entry; } /** * Inserts five baskets. * * @return Basket[] */ protected function insertFiveBasket() { $baskets = []; for ($i = 0; $i < 5; $i ++) { $basket = new Basket(); $basket->setName('test ' . $i); $basket->setDescription('description'); $basket->setOwner(self::$DI['user']); self::$DI['app']['EM']->persist($basket); $baskets[] = $basket; } self::$DI['app']['EM']->flush(); return $baskets; } /** * Inserts one basket element. * * @param User_Adapter $user * @param record_adapter $record * * @return BasketElement */ protected function insertOneBasketElement(\User_Adapter $user = null, \record_adapter $record = null) { $element = new BasketElement(); $element->setRecord($record ?: self::$DI['record_1']); $basket = $this->insertOneBasket($user); $basket->addElement($element); $element->setBasket($basket); self::$DI['app']['EM']->persist($basket); self::$DI['app']['EM']->flush(); return $element; } /** * Inserts one validation basket. * * @param array $parameters * * @return Basket */ protected function insertOneValidationBasket(array $parameters = []) { $basketElement = $this->insertOneBasketElement(); $basket = $basketElement->getBasket(); $validation = new ValidationSession(); $validation->setBasket($basket); $validation->setInitiator(self::$DI['user']); if (isset($parameters['expires']) && $parameters['expires'] instanceof \DateTime) { $validation->setExpires($parameters['expires']); } $basket->setValidation($validation); $participant = new ValidationParticipant(); $participant->setUser(self::$DI['user']); $participant->setCanAgree(true); $participant->setCanSeeOthers(true); $validation->addParticipant($participant); $participant->setSession($validation); $data = new ValidationData(); $data->setBasketElement($basketElement); $data->setParticipant($participant); $basketElement->addValidationData($data); self::$DI['app']['EM']->persist($basket); self::$DI['app']['EM']->persist($validation); self::$DI['app']['EM']->persist($participant); self::$DI['app']['EM']->persist($data); self::$DI['app']['EM']->persist($basketElement); self::$DI['app']['EM']->flush(); return $basket; } /** * - Creates a new basket with current authenticated user as owner. * - Creates a new sessionValidation with the newly created basket. * - Sets current authenticated user as sessionValidation initiator. * - Adds 2 records as elements of the newly created basket. * - Adds 2 participants to the newly created sessionValidation. * * @return Basket */ protected function insertOneBasketEnv() { $basket = new Basket(); $basket->setName('test'); $basket->setDescription('description'); $basket->setOwner(self::$DI['user']); self::$DI['app']['EM']->persist($basket); foreach ([self::$DI['record_1'], self::$DI['record_2']] as $record) { $basketElement = new BasketElement(); $basketElement->setRecord($record); $basketElement->setBasket($basket); $basket->addElement($basketElement); self::$DI['app']['EM']->persist($basketElement); } $validationSession = new ValidationSession(); $validationSession->setBasket($basket); $basket->setValidation($validationSession); $expires = new \DateTime(); $expires->modify('+1 week'); $validationSession->setExpires($expires); $validationSession->setInitiator(self::$DI['user']); foreach ([self::$DI['user_alt1'], self::$DI['user_alt2']] as $user) { $validationParticipant = new ValidationParticipant(); $validationParticipant->setUser($user); $validationParticipant->setSession($validationSession); $validationSession->addParticipant($validationParticipant); self::$DI['app']['EM']->persist($validationParticipant); } self::$DI['app']['EM']->flush(); return $basket; } /** * Inserts one story. * * @param User_Adapter $user * @param record_adapter $record * * @return StoryWZ */ protected function insertOneStory(User_Adapter $user = null, \record_adapter $record = null) { $story = new StoryWZ(); $story->setRecord($record ?: self::$DI['record_1']); $story->setUser($user ?: self::$DI['user']); self::$DI['app']['EM']->persist($story); self::$DI['app']['EM']->flush(); return $story; } /** * Inserts one validation session. * * @param Basket $basket * @param User_Adapter $user * * @return ValidationSession */ protected function insertOneValidationSession(Basket $basket = null, \User_Adapter $user = null) { $validationSession = new ValidationSession(); $validationSession->setBasket($basket ?: $this->insertOneBasket()); $expires = new \DateTime(); $expires->modify('+1 week'); $validationSession->setExpires($expires); $validationSession->setInitiator($user ?: self::$DI['user']); self::$DI['app']['EM']->persist($validationSession); self::$DI['app']['EM']->flush(); return $validationSession; } /** * Loads One WZ with one basket, one story and one ValidationSession with one participant. */ protected function insertOneWZ() { $this->insertOneStory(); $this->insertOneValidationSession($this->insertOneBasket(), self::$DI['user_alt1']); } /** * Inserts one user. * * @param string $login * @param null $email * @param bool $admin * * @return User */ protected function insertOneUser($login, $email = null, $admin = false) { return self::$DI['app']['manipulator.user']->createUser($login, uniqid('pass'), $email, $admin); } /** * Calls a URI as XMLHTTP request. * * @param string $method The request method * @param string $uri The URI to fetch * @param array $parameters The Request parameters * @param string $httpAccept Contents of the Accept header * * @return Crawler */ protected function XMLHTTPRequest($method, $uri, array $parameters = [], $httpAccept = 'application/json') { return self::$DI['client']->request($method, $uri, $parameters, [], [ 'HTTP_ACCEPT' => $httpAccept, 'HTTP_X-Requested-With' => 'XMLHttpRequest', ]); } protected static function resetUsersRights(Application $app, \User_Adapter $user) { switch ($user->get_login()) { case 'test_phpunit': self::giveRightsToUser($app, $user); $app['acl']->get($user)->set_admin(true); $app['acl']->get(self::$DI['user'])->revoke_access_from_bases([self::$DI['collection_no_access']->get_base_id()]); $app['acl']->get(self::$DI['user'])->set_masks_on_base(self::$DI['collection_no_access_by_status']->get_base_id(), '00000000000000000000000000010000', '00000000000000000000000000010000', '00000000000000000000000000010000', '00000000000000000000000000010000'); break; case 'test_phpunit_not_admin': case 'test_phpunit_alt2': case 'test_phpunit_alt1': self::giveRightsToUser(self::$DI['app'], $user); $app['acl']->get($user)->set_admin(false); $app['acl']->get(self::$DI['user'])->revoke_access_from_bases([self::$DI['collection_no_access']->get_base_id()]); $app['acl']->get(self::$DI['user'])->set_masks_on_base(self::$DI['collection_no_access_by_status']->get_base_id(), '00000000000000000000000000010000', '00000000000000000000000000010000', '00000000000000000000000000010000', '00000000000000000000000000010000'); break; default: throw new \InvalidArgumentException(sprintf('User %s not found', $user->get_login())); } } private function createSetOfUserTests(Application $application) { if (false === $usr_id = User_Adapter::get_usr_id_from_login($application, 'test_phpunit')) { $user = User_Adapter::create($application, 'test_phpunit', random::generatePassword(), 'noone@example.com', false); $usr_id = $user->get_id(); } else { $user = User_Adapter::getInstance($usr_id, $application); } $user->set_email('valid@phraseanet.com'); self::$fixtureIds['user']['test_phpunit'] = $usr_id; if (false === $usr_id = User_Adapter::get_usr_id_from_login($application, 'test_phpunit_not_admin')) { $user = User_Adapter::create($application, 'test_phpunit_not_admin', random::generatePassword(), 'noone_not_admin@example.com', false); $usr_id = $user->get_id(); } else { $user = User_Adapter::getInstance($usr_id, $application); } self::$fixtureIds['user']['test_phpunit_not_admin'] = $usr_id; if (false === $usr_id = User_Adapter::get_usr_id_from_login($application, 'test_phpunit_alt1')) { $user = User_Adapter::create($application, 'test_phpunit_alt1', random::generatePassword(), 'noonealt1@example.com', false); $usr_id = $user->get_id(); } self::$fixtureIds['user']['test_phpunit_alt1'] = $usr_id; if (false === $usr_id = User_Adapter::get_usr_id_from_login($application, 'test_phpunit_alt2')) { $user = User_Adapter::create($application, 'test_phpunit_alt2', random::generatePassword(), 'noonealt2@example.com', false); $usr_id = $user->get_id(); } self::$fixtureIds['user']['test_phpunit_alt2'] = $usr_id; } /** * Gives Bases Rights to User. * * @param \User_Adapter $user */ public static function giveRightsToUser(Application $app, \User_Adapter $user, $base_ids = null) { $app['acl']->get($user)->give_access_to_sbas(array_keys($app['phraseanet.appbox']->get_databoxes())); foreach ($app['phraseanet.appbox']->get_databoxes() as $databox) { $rights = [ 'bas_manage' => '1' , 'bas_modify_struct' => '1' , 'bas_modif_th' => '1' , 'bas_chupub' => '1' ]; $app['acl']->get($user)->update_rights_to_sbas($databox->get_sbas_id(), $rights); foreach ($databox->get_collections() as $collection) { if (null !== $base_ids && !in_array($collection->get_base_id(), (array) $base_ids, true)) { continue; } $base_id = $collection->get_base_id(); $app['acl']->get($user)->give_access_to_base([$base_id]); $app['acl']->get($user)->update_rights_to_base($base_id, ['order_master' => true]); $rights = [ 'canputinalbum' => '1' , 'candwnldhd' => '1' , 'candwnldsubdef' => '1' , 'nowatermark' => '1' , 'candwnldpreview' => '1' , 'cancmd' => '1' , 'canadmin' => '1' , 'canreport' => '1' , 'canpush' => '1' , 'creationdate' => '1' , 'canaddrecord' => '1' , 'canmodifrecord' => '1' , 'candeleterecord' => '1' , 'chgstatus' => '1' , 'imgtools' => '1' , 'manage' => '1' , 'modify_struct' => '1' , 'manage' => '1' , 'bas_modify_struct' => '1' ]; $app['acl']->get($user)->update_rights_to_base($collection->get_base_id(), $rights); } } } /** * Sets self::$DI['collection']. */ private static function setCollection(Application $application) { $coll = $collection_no_acces = $collection_no_acces_by_status = $db = null; foreach ($application['phraseanet.appbox']->get_databoxes() as $databox) { foreach ($databox->get_collections() as $collection) { if ($collection_no_acces instanceof collection && !$collection_no_acces_by_status) { $collection_no_acces_by_status = $collection; } if ($coll instanceof collection && !$collection_no_acces) { $collection_no_acces = $collection; } if (!$coll) { $coll = $collection; } if ($coll instanceof collection && $collection_no_acces instanceof collection && $collection_no_acces_by_status instanceof collection) { break 2; } } } self::$fixtureIds['databox']['records'] = $coll->get_databox()->get_sbas_id(); self::$fixtureIds['collection']['coll'] = $coll->get_base_id(); if (!$collection_no_acces instanceof collection) { $collection_no_acces = collection::create($application, $databox, $application['phraseanet.appbox'], 'BIBOO', self::$DI['user']); } self::$fixtureIds['collection']['coll_no_access'] = $collection_no_acces->get_base_id(); if (!$collection_no_acces_by_status instanceof collection) { $collection_no_acces_by_status = collection::create($application, $databox, $application['phraseanet.appbox'], 'BIBOONOACCESBYSTATUS', self::$DI['user']); } self::$fixtureIds['collection']['coll_no_status'] = $collection_no_acces_by_status->get_base_id(); return; } /** * Deletes previously created Resources. */ private static function deleteResources() { if (self::$recordsInitialized !== false) { foreach (self::$recordsInitialized as $i) { self::$DI['record_' . $i]->delete(); } self::$recordsInitialized = []; } return; } /** * Authenticates self::['user'] against application. * * @param Application $app */ protected function authenticate(Application $app) { $app['session']->clear(); $app['session']->set('usr_id', self::$DI['user']->get_id()); $session = new Session(); $session->setUsrId(self::$DI['user']->get_id()); $session->setUserAgent(''); self::$DI['app']['EM']->persist($session); self::$DI['app']['EM']->flush(); $app['session']->set('session_id', $session->getId()); self::$DI['app']['authentication']->reinitUser(); } /** * Logout authenticated user from application. * * @param Application $app */ protected function logout(Application $app) { $app['session']->clear(); self::$DI['app']['authentication']->reinitUser(); } protected function assertXMLHTTPBadJsonResponse(Response $response) { $this->assertEquals(200, $response->getStatusCode()); $data = json_decode($response->getContent(), true); $this->assertTrue(is_array($data)); $this->assertFalse($data['success']); } protected function mockNotificationDeliverer($expectedMail, $qty = 1, $receipt = null) { self::$DI['app']['notification.deliverer'] = $this->getMockBuilder('Alchemy\Phrasea\Notification\Deliverer') ->disableOriginalConstructor() ->getMock(); self::$DI['app']['notification.deliverer']->expects($this->exactly($qty)) ->method('deliver') ->with($this->isInstanceOf($expectedMail), $this->equalTo($receipt)); } protected function mockNotificationsDeliverer(array &$expectedMails) { self::$DI['app']['notification.deliverer'] = $this->getMockBuilder('Alchemy\Phrasea\Notification\Deliverer') ->disableOriginalConstructor() ->getMock(); self::$DI['app']['notification.deliverer']->expects($this->any()) ->method('deliver') ->will($this->returnCallback(function ($email, $receipt) use (&$expectedMails) { $this->assertTrue(isset($expectedMails[get_class($email)])); $expectedMails[get_class($email)]++; })); } public function createRandomMock() { return $this->getMockBuilder('\random') ->setMethods(['generatePassword']) ->disableOriginalConstructor() ->getMock(); } public function createAppboxMock() { return $this->getMockBuilder('appbox') ->disableOriginalConstructor() ->getMock(); } } class CsrfTestProvider implements CsrfProviderInterface { public function generateCsrfToken($intention) { return mt_rand(); } public function isCsrfTokenValid($intention, $token) { return true; } }