/** * Tests saving a sfGuardUserSubredditMembership that identifies a User as * "blocked" for a particular Subreddit. When this occurs, all existing * future EpisodeAssignments should be deleted because blocked users cannot * participate with the Subreddit. */ public function testSavingBlockedUser() { // Establish fake Subreddit $subreddit = new Subreddit(); $subreddit->setName(rand(0, 1000)); $subreddit->setDomain(rand(0, 1000)); $subreddit->save(); // Establish User $user = new sfGuardUser(); $user->setEmailAddress(rand(0, 100000)); $user->setUsername(rand(0, 10000)); $user->setIsValidated(1); $user->save(); $user_id = $user->getIncremented(); $this->assertNotEquals(0, $user_id); // Establish Episode for Subreddit $episode = new Episode(); $episode->setSubreddit($subreddit); $episode->setReleaseDate(date('Y-m-d H:i:s', time() + 34000)); $episode->save(); $author_type = AuthorTypeTable::getInstance()->findOneBy('type', 'squid'); $deadline = new Deadline(); $deadline->setSubreddit($subreddit); $deadline->setAuthorType($author_type); $deadline->setSeconds(0); $deadline->save(); $episode_assignment = new EpisodeAssignment(); $episode_assignment->setSfGuardUser($user); $episode_assignment->setEpisode($episode); $episode_assignment->setAuthorType($author_type); $episode_assignment->save(); $number_of_episodes = EpisodeAssignmentTable::getInstance()->createQuery()->select('COUNT(EpisodeAssignment.id)')->leftJoin('Episode')->where('subreddit_id = ?', $subreddit->getIncremented())->andWhere('EpisodeAssignment.sf_guard_user_id = ?', $user_id)->andWhere('Episode.release_date > NOW()')->groupBy('EpisodeAssignment.id')->count(); $this->assertEquals(1, $number_of_episodes); // Establish User Membership as Blocked $blocked = MembershipTable::getInstance()->findOneBy('type', 'blocked'); $user_membership = new sfGuardUserSubredditMembership(); $user_membership->setSubreddit($subreddit); $user_membership->setSfGuardUser($user); $user_membership->setMembership($blocked); // Save Membership $user_membership->save(); // Asert that User has zero Episodes $number_of_episodes = EpisodeAssignmentTable::getInstance()->createQuery()->select('COUNT(EpisodeAssignment.id)')->leftJoin('Episode')->where('subreddit_id = ?', $subreddit->getIncremented())->andWhere('EpisodeAssignment.sf_guard_user_id = ?', $user_id)->andWhere('Episode.release_date > NOW()')->groupBy('EpisodeAssignment.id'); $sql = $number_of_episodes->getSqlQuery(); $number_of_episodes = $number_of_episodes->count(); $this->assertTrue(0 == $number_of_episodes, $sql . "\n" . $subreddit->getIncremented() . "\n" . $user_id); // Remove User Membership $user_membership->delete(); // Delete User $user->delete(); // Delete Episode $episode->delete(); // Delete Deadline $deadline->delete(); // Delete Subreddit $subreddit->delete(); }
/** * Blocked users should not be able to sign up for an Episode. */ public function testBlockSaveForBlockedUsers() { $subreddit = new Subreddit(); $subreddit->setName(rand(0, 10000)); $subreddit->setDomain(rand(0, 10000)); $subreddit->save(); $user = new sfGuardUser(); $user->setUsername(rand(0, 10000)); $user->setEmailAddress(rand(0, 10000)); $user->setIsValidated(1); $user->save(); $first = AuthorTypeTable::getInstance()->findOneByType('squid'); $deadline = new Deadline(); $deadline->setSubreddit($subreddit); $deadline->setAuthorType($first); $deadline->setSeconds(0); $deadline->save(); $episode = new Episode(); $episode->setReleaseDate(date('Y-m-d H:i:s', time() + 100000)); $episode->setSubreddit($subreddit); $episode->save(); // Establish conditions to trip up test. $blocked = MembershipTable::getInstance()->findOneByType('blocked'); $user_membership = new sfGuardUserSubredditMembership(); $user_membership->setSfGuardUser($user); $user_membership->setSubreddit($subreddit); $user_membership->setMembership($blocked); $user_membership->save(); // Try to save episode assignment. $assignment = new EpisodeAssignment(); $assignment->setEpisode($episode); $assignment->setSfGuardUser($user); $assignment->setAuthorType($first); $exception_thrown = false; try { $assignment->save(); } catch (sfException $exception) { $this->assertEquals(101, $exception->getCode()); $exception_thrown = true; unset($exception); } // Remvoe test data. $episode->delete(); $user->delete(); $deadline->delete(); $subreddit->delete(); $this->assertTrue($exception_thrown); }
public function validateCreate($payload, sfWebRequest $request = null) { $params = $this->parsePayload($payload); $user = $this->getUser()->getGuardUser(); if (!$user) { throw new sfException('Action requires an auth token.', 401); } $subreddit_id = $params['subreddit_id']; $pending = MembershipTable::getInstance()->findOneByType('pending'); $admin = sfGuardUserSubredditMembershipTable::getInstance()->getFirstByUserSubredditAndMemberships($user->getIncremented(), $subreddit_id, array('admin')); // All non-admin users create a pending membership in a Subreddit. if ($params['sf_guard_user_id'] == $user->getIncremented() && !$admin && !$this->getUser()->isSuperAdmin()) { $params['membership_id'] = $pending->getIncremented(); } if (!$admin && !$this->getUser()->isSuperAdmin() && $params['membership_id'] != $pending->getIncremented()) { throw new sfException("Your user does not have permissions to " . "create new user memberships in this Subreddit.", 403); } parent::validateCreate($payload, $request); }
/** * Since a User can only have one membership in a Subreddit, this tests that * the first returned sfGuardUserSubredditMembership is the exact same as * the only one made. The limitation on sfGuardUserSubredditMemberships is * in place using Unique indexes in the database, so we depend upon that to * prevent multiple Subreddit Memberships. */ public function testGetFirstByUserSubredditAndMemberships() { $user = new sfGuardUser(); $user->setEmailAddress(rand(0, 1000)); $user->setUsername(rand(0, 1000)); $user->setIsValidated(1); $user->save(); $subreddit = new Subreddit(); $subreddit->setName(rand(0, 1000)); $subreddit->setDomain(rand(0, 1000)); $subreddit->save(); $membership = MembershipTable::getInstance()->findOneByType('user'); $second_membership = MembershipTable::getInstance()->findOneByType('admin'); $user_subreddit_membership = new sfGuardUserSubredditMembership(); $user_subreddit_membership->setSfGuardUserId($user->getIncremented()); $user_subreddit_membership->setSubredditId($subreddit->getIncremented()); $user_subreddit_membership->setMembership($membership); $user_subreddit_membership->save(); $second_user_subreddit_membership = new sfGuardUserSubredditMembership(); $second_user_subreddit_membership->setSfGuardUserId($user->getIncremented()); $second_user_subreddit_membership->setSubredditId($subreddit->getIncremented()); $second_user_subreddit_membership->setMembership($second_membership); $exception_thrown = false; try { $second_user_subreddit_membership->save(); } catch (Exception $exception) { unset($exception); $exception_thrown = true; } $retrieved_object = sfGuardUserSubredditMembershipTable::getInstance()->getFirstByUserSubredditAndMemberships($user->getIncremented(), $subreddit->getIncremented(), array($membership->getType())); $this->assertEquals($retrieved_object->getIncremented(), $user_subreddit_membership->getIncremented()); $user_subreddit_membership->delete(); $subreddit->delete(); $user->delete(); $this->assertTrue($exception_thrown); }
/** * We set up the following situation: * We have three users, each of different AuthorTypes, who have * EpisodeAssignments with the Episode in question. The deadline for the * first user has passed, but the deadline for the second has not. The * third user is in an AuthorType that should prevent creating an * AuthorType for the Episode before the second user's deadline passes, even * though that User is an admin. * * The second user (the one who is able to submit their episode) is a * moderator, but she should not be able to approve her own episode. */ public function setUp() { ProjectConfiguration::registerAws(); $original_filename = '1234567890abcde.mp3'; $this->episode_filename = 'abcde0123456789.mp3'; $this->unapproved_file_location = sfConfig::get('sf_data_dir') . '/temp/'; if (!copy($this->unapproved_file_location . $original_filename, $this->unapproved_file_location . $this->episode_filename)) { echo "failed to copy {$this->unapproved_file_location}{$original_filename}...\n"; } $this->aws = new AmazonS3(); $this->subreddit = new Subreddit(); $this->subreddit->setName(rand(0, 1000)); $this->subreddit->setDomain(rand(0, 1000)); $this->subreddit->save(); $first = AuthorTypeTable::getInstance()->findOneByType('squid'); $understudy = AuthorTypeTable::getInstance()->findOneByType('shark'); $dark_horse = AuthorTypeTable::getInstance()->findOneByType('blue_whale'); $this->first_deadline = new Deadline(); $this->first_deadline->setAuthorType($first); $this->first_deadline->setSeconds(1000); $this->first_deadline->setSubreddit($this->subreddit); $this->first_deadline->save(); $this->second_deadline = new Deadline(); $this->second_deadline->setAuthorType($understudy); $this->second_deadline->setSeconds(500); $this->second_deadline->setSubreddit($this->subreddit); $this->second_deadline->save(); $this->third_deadline = new Deadline(); $this->third_deadline->setAuthorType($dark_horse); $this->third_deadline->setSeconds(100); $this->third_deadline->setSubreddit($this->subreddit); $this->third_deadline->save(); $this->user = new sfGuardUser(); $this->user->setEmailAddress(rand(0, 1000)); $this->user->setUsername(rand(0, 1000)); $this->user->setIsValidated(1); $this->user->save(); $this->after_deadline_user = new sfGuardUser(); $this->after_deadline_user->setEmailAddress(rand(0, 1000)); $this->after_deadline_user->setUsername(rand(0, 1000)); $this->after_deadline_user->setIsValidated(1); $this->after_deadline_user->save(); $this->dark_horse_user = new sfGuardUser(); $this->dark_horse_user->setEmailAddress(rand(0, 1000)); $this->dark_horse_user->setUsername(rand(0, 1000)); $this->dark_horse_user->setIsValidated(1); $this->dark_horse_user->save(); $this->approver = new sfGuardUser(); $this->approver->setEmailAddress(rand(0, 1000)); $this->approver->setUsername(rand(0, 1000)); $this->approver->setIsValidated(1); $this->approver->save(); $moderator = MembershipTable::getInstance()->findOnebyType('moderator'); $admin = MembershipTable::getInstance()->findOnebyType('admin'); $member = MembershipTable::getInstance()->findOnebyType('user'); $this->first_membership = new sfGuardUserSubredditMembership(); $this->first_membership->setMembership($member); $this->first_membership->setSubreddit($this->subreddit); $this->first_membership->setSfGuardUser($this->after_deadline_user); $this->first_membership->save(); $this->second_membership = new sfGuardUserSubredditMembership(); $this->second_membership->setMembership($moderator); $this->second_membership->setSubreddit($this->subreddit); $this->second_membership->setSfGuardUser($this->user); $this->second_membership->save(); $this->third_membership = new sfGuardUserSubredditMembership(); $this->third_membership->setMembership($admin); $this->third_membership->setSubreddit($this->subreddit); $this->third_membership->setSfGuardUser($this->dark_horse_user); $this->third_membership->save(); $this->fourth_membership = new sfGuardUserSubredditMembership(); $this->fourth_membership->setMembership($moderator); $this->fourth_membership->setSubreddit($this->subreddit); $this->fourth_membership->setSfGuardUser($this->approver); $this->fourth_membership->save(); $this->episode = new Episode(); $this->episode->setReleaseDate(date('Y-m-d H:i:s', time() + 20000)); $this->episode->setAudioFile($this->episode_filename); $this->episode->setNiceFilename('14. We Will Rock You.mp3'); //$this->episode->setSfGuardUserId($this->user); $this->episode->setDescription('This is a test.'); $this->episode->setTitle('Test Episode'); $this->episode->setIsNsfw(false); $this->episode->setSubreddit($this->subreddit); $this->episode->save(); $this->first_ep_assignment = new EpisodeAssignment(); $this->first_ep_assignment->setEpisodeId($this->episode->getIncremented()); $this->first_ep_assignment->setAuthorType($first); $this->first_ep_assignment->setSfGuardUser($this->after_deadline_user); $this->first_ep_assignment->save(); $this->second_ep_assignment = new EpisodeAssignment(); $this->second_ep_assignment->setEpisodeId($this->episode->getIncremented()); $this->second_ep_assignment->setAuthorType($understudy); $this->second_ep_assignment->setSfGuardUser($this->user); $this->second_ep_assignment->save(); $this->third_ep_assignment = new EpisodeAssignment(); $this->third_ep_assignment->setEpisodeId($this->episode->getIncremented()); $this->third_ep_assignment->setAuthorType($dark_horse); $this->third_ep_assignment->setSfGuardUser($this->dark_horse_user); try { $this->third_ep_assignment->save(); } catch (sfException $exception) { unset($exception); } $this->episode->setReleaseDate(date('Y-m-d H:i:s', time() + 750)); $this->episode->save(); }
/** * Tests for success at creating the object. */ public function testCreate() { $t = MembershipTable::getInstance(); $this->assertTrue($t instanceof Doctrine_Table); }