/**
  * 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);
 }
예제 #3
0
 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);
 }
예제 #5
0
 /**
  * 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);
 }