public function testPostRound()
 {
     $user1 = factory(App\Models\User::class)->create();
     $user2 = factory(App\Models\User::class)->create();
     // create two open battles
     $battle1 = new OpenBattle();
     $battle1->rapper1_id = $user1->id;
     $battle1->rapper2_id = $user2->id;
     $battle1->phase = 1;
     $battle1->beat1_id = 1;
     $battle1->rapper1_round1 = "/path/to/rapper1_round1";
     $battle1->rapper2_round2 = "/path/to/rapper2_round2";
     $battle1->beat2_id = 2;
     $battle1->rapper2_round1 = "/path/to/rapper2_round1";
     $battle1->rapper1_round2 = "/path/to/rapper1_round2";
     $battle1->save();
     $this->post('/open-battle/' . $battle1->id . '/round', ['beat_id' => 2, 'video' => "abc.mp4"]);
     // TODO: check if OpenBattle changed, video expects an actual video file, not sure if there is a way to fake one
     $this->markTestIncomplete();
 }
示例#2
0
 public function scopeOpen($query)
 {
     $start = Carbon::parse($this->phase_start);
     $startMinPhase1 = Carbon::now()->subHours(config('rap-battle.phase1time', 24));
     $startMinPhase2 = Carbon::now()->subHours(config('rap-battle.phase2time', 24));
     $query1 = $query;
     $query2 = clone $query;
     $ids1 = $query1->where('phase', 1)->where('phase_start', '>=', $startMinPhase1->toDateTimeString())->lists('id')->toArray();
     $ids2 = $query2->where('phase', 2)->where('phase_start', '>=', $startMinPhase2->toDateTimeString())->lists('id')->toArray();
     return OpenBattle::whereIn('id', array_merge($ids1, $ids2));
 }
 public function postRound(Request $request, $id)
 {
     $this->validate($request, ['beat_id' => 'required|integer', 'video' => 'required|mimes:mp4,mpg,3gp,h264,ogv,mov,webm,flv,wmv,mkv']);
     // get battle and user instances
     $battle = OpenBattle::findOrFail($id);
     $user = $request->user();
     if (!$battle->isOpen()) {
         return response('Gone', 410);
     }
     // get rapper number
     $rapperNumber = 0;
     if ($user == $battle->rapper1) {
         $rapperNumber = 1;
     } elseif ($user == $battle->rapper2) {
         $rapperNumber = 2;
     } else {
         return response('Unauthorized.', 401);
     }
     // TODO: check video file?
     // Name of the column the video needs to be saved in
     $videoColumn = 'rapper' . $rapperNumber . '_round' . $battle->phase;
     // Name of the video
     $videoName = $battle->id . '_' . $videoColumn;
     $video = $request->file('video');
     // Name of video on the disk
     $videoFilename = $videoName . '.mp4';
     // target file format: mp4
     $videoFilenameTmp = $videoName;
     Storage::disk('videos')->put($videoFilenameTmp, file_get_contents($video->getRealPath()));
     Log::info('Uploading video', ['rapperNumber' => $rapperNumber, 'phase' => $battle->phase, 'userID' => $user->id, 'videoFilenameTmp' => $videoFilenameTmp, 'videoFilename' => $videoFilename]);
     // convert video/fire events and delete temporary file
     $inFilePath = Storage::disk('videos')->getAdapter()->applyPathPrefix($videoFilenameTmp);
     $outFilePath = Storage::disk('videos')->getAdapter()->applyPathPrefix($videoFilename);
     /*
      * The event 'VideoWasUploaded' will be pushed on the queue and convert
      * the uploaded video. If the conversion succeds a following event will
      * be fired, in this case 'OpenBattleVideoConverted'. 'OpenBattleVideoConverted'
      * writes $videoFileName to the file column $videoColumn of $battle and
      * sets the beat_id. When all videos are uploaded 'OpenBattleVideoConverted
      * fires another event ('OpenBattleCompleted') to concatenate the video
      * files and to convert the OpenBattle to a Battle. This approach was choosen
      * since these steps depend on each other. When one step fails but the
      * following gets executed the OpenBattle may get 'corrupted' (eg. by
      * missing video files) and the conversion to a finished Battle will fail.
      */
     \Event::fire(new VideoWasUploaded($outFilePath, $inFilePath, true, new OpenBattleVideoConverted($battle, $videoFilename, $videoColumn, $rapperNumber, $request->input('beat_id'))));
 }
 /**
  * Test for postAnswer
  */
 public function testPostAnswer()
 {
     $user1 = factory(App\Models\User::class)->create();
     $user2 = factory(App\Models\User::class)->create();
     // create two battles
     $br = new BattleRequest();
     $br->challenger_id = $user1->id;
     $br->challenged_id = $user2->id;
     $br->save();
     // execute postAnswer()
     $this->actingAs($user1)->post('/request/' . $br->id, ['accepted' == TRUE]);
     $oP = OpenBattle::find($br->challenger_id);
     //checking the output
     $this->assertNotNull($oP);
     $this->assertEquals($user1->id, $oP->rapper1_id);
     $this->assertEquals($user2->id, $oP->rapper2_id);
 }
 /**
  * Test for getOpen
  */
 public function testGetOpen()
 {
     $user1 = factory(App\Models\User::class)->create();
     $user2 = factory(App\Models\User::class)->create();
     // create two open battles
     $battle1 = new OpenBattle();
     $battle1->rapper1_id = $user1->id;
     $battle1->rapper2_id = $user2->id;
     $battle1->phase = 1;
     $battle1->beat1_id = 1;
     $battle1->rapper1_round1 = "/path/to/rapper1_round1";
     $battle1->rapper2_round2 = "/path/to/rapper2_round2";
     $battle1->beat2_id = 2;
     $battle1->rapper2_round1 = "/path/to/rapper2_round1";
     $battle1->rapper1_round2 = "/path/to/rapper1_round2";
     $battle1->save();
     $battle2 = new OpenBattle();
     $battle2->rapper1_id = $user1->id;
     $battle2->rapper2_id = $user2->id;
     $battle2->phase = 2;
     $battle2->beat1_id = 2;
     $battle2->rapper1_round1 = "/path/to/rapper1_round1_b";
     $battle2->rapper2_round2 = "/path/to/rapper2_round2_b";
     $battle2->beat2_id = 1;
     $battle2->rapper2_round1 = "/path/to/rapper2_round1_b";
     $battle2->rapper1_round2 = "/path/to/rapper1_round2_b";
     $battle2->save();
     $this->actingAs($user1)->get('/battles/open')->seeJson(['current_page' => 1, 'data' => [['battle_id' => (string) $battle1->id, 'rapper1' => ['user_id' => (string) $user1->id, 'username' => $user1->username, 'profile_picture' => $user1->picture], 'rapper2' => ['user_id' => (string) $user2->id, 'username' => $user2->username, 'profile_picture' => $user2->picture]], ['battle_id' => (string) $battle2->id, 'rapper1' => ['user_id' => (string) $user1->id, 'username' => $user1->username, 'profile_picture' => $user1->picture], 'rapper2' => ['user_id' => (string) $user2->id, 'username' => $user2->username, 'profile_picture' => $user2->picture]]]]);
 }
示例#6
0
 /**
  * Test for openBattles()
  *
  * @return void
  */
 public function testOpenBattles()
 {
     $user1 = factory(App\Models\User::class)->create();
     $user2 = factory(App\Models\User::class)->create();
     $user3 = factory(App\Models\User::class)->create();
     $user4 = factory(App\Models\User::class)->create();
     $battle1 = new OpenBattle();
     $battle1->rapper1_id = $user1->id;
     $battle1->rapper2_id = $user2->id;
     $battle1->save();
     $battle2 = new OpenBattle();
     $battle2->rapper1_id = $user2->id;
     $battle2->rapper2_id = $user3->id;
     $battle2->save();
     $battle3 = new OpenBattle();
     $battle3->rapper1_id = $user3->id;
     $battle3->rapper2_id = $user1->id;
     $battle3->save();
     // get open battles of user2
     $battles = $user2->openBattles()->lists('id')->toArray();
     $this->assertCount(2, $battles);
     $this->assertContains($battle1->id, $battles);
     $this->assertContains($battle2->id, $battles);
     $this->assertNotContains($battle3->id, $battles);
     // tests for hasOpenBattleAgainst()
     $this->assertTrue($user1->hasOpenBattleAgainst($user2));
     $this->assertTrue($user1->hasOpenBattleAgainst($user3));
     $this->assertTrue($user2->hasOpenBattleAgainst($user1));
     $this->assertTrue($user2->hasOpenBattleAgainst($user3));
     $this->assertFalse($user1->hasOpenBattleAgainst($user4));
     $this->assertFalse($user4->hasOpenBattleAgainst($user3));
     // tests for scopeNoBattleRequestsAgainst()
     $noba1 = $user1->noOpenBattleAgainst($user4)->lists('id')->toArray();
     $this->assertContains($user4->id, $noba1);
     $noba4 = $user4->noOpenBattleAgainst($user4)->lists('id')->toArray();
     $this->assertContains($user1->id, $noba4);
     $this->assertContains($user2->id, $noba4);
     $this->assertContains($user3->id, $noba4);
 }
 /**
  * Test for isOpen(), scopeOpen() and setPhaseAttribute()
  */
 public function testIsOpen()
 {
     $battle11 = factory(App\Models\OpenBattle::class)->create();
     $battle12 = factory(App\Models\OpenBattle::class)->create();
     $battle21 = factory(App\Models\OpenBattle::class)->create();
     $battle22 = factory(App\Models\OpenBattle::class)->create();
     //$battle3 = factory(App\Models\OpenBattle::class)->create();
     $battle11->setPhaseAttribute(1);
     $battle21->setPhaseAttribute(2);
     //$battle3->setPhaseAttribute(3);
     $battle11->save();
     $battle21->save();
     //$battle3->save();
     $now = Carbon::now();
     Carbon::setTestNow(Carbon::now()->subHours(config('rap-battle.phase1time', 24) + 1));
     $battle12->setPhaseAttribute(1);
     $battle12->save();
     Carbon::setTestNow(Carbon::now()->subHours(config('rap-battle.phase2time', 24) + 1));
     $battle22->setPhaseAttribute(2);
     $battle22->save();
     // test phase
     $this->assertEquals(1, $battle11->phase);
     $this->assertEquals(1, $battle12->phase);
     $this->assertEquals(2, $battle21->phase);
     $this->assertEquals(2, $battle22->phase);
     Carbon::setTestNow($now);
     $this->assertTrue($battle11->isOpen());
     $this->assertTrue($battle21->isOpen());
     $this->assertFalse($battle12->isOpen());
     $this->assertFalse($battle22->isOpen());
     //$this->assertFalse($battle3->isOpen());
     // test scopeOpen()
     $cnt = OpenBattle::open()->count();
     $this->assertEquals(2, $cnt);
     // TODO: check if $battle11 and $battle21 are in $cnt
 }
 /**
  * Accept or decline a battle request.
  *
  * @param  \Illuminate\Http\Request  $request
  * @param  integer  $id
  * @return void|\Illuminate\Http\Response
  */
 public function postAnswer(Request $request, $id)
 {
     $this->validate($request, ['accepted' => 'required|boolean']);
     $user = Auth::user();
     if (is_null($user)) {
         return response('Unauthorized', 401);
     }
     $battleRequest = BattleRequest::findOrFail($id);
     // Check if authenticated user is challenged user
     if ($battleRequest->challenged_id == $user->id) {
         if ($request->input('accepted')) {
             $battle = new OpenBattle();
             $battle->start($battleRequest->challenger, $battleRequest->challenged);
             $battle->save();
         }
         $battleRequest->delete();
     } else {
         return response('Unauthorized', 401);
     }
 }
示例#9
0
 /**
  * Run the database seeds.
  *
  * @return void
  */
 public function run()
 {
     Model::unguard();
     // config
     $usercnt = 20;
     $userRappercnt = 20;
     $battlecnt = 20;
     $battleRequestcnt = rand($userRappercnt / 4, $userRappercnt / 2);
     // max $userRappercnt / 2
     $openBattlecnt = rand($userRappercnt / 4, $userRappercnt / 2);
     // max $userRappercnt / 2
     // create users
     $users = factory(App\Models\User::class, $usercnt)->create();
     // rapper and non-rapper
     $usersRapper = factory(App\Models\User::class, 'rapper', $userRappercnt)->create();
     // rapper only
     //----------------------------------------------
     // create battles
     for ($i = 0; $i < $battlecnt; $i++) {
         $battle = new Battle();
         // get first rapper
         $battle->rapper1_id = $usersRapper->random()->id;
         // get second rapper != first rapper
         do {
             $battle->rapper2_id = $usersRapper->random()->id;
         } while ($battle->rapper1_id == $battle->rapper2_id);
         $battle->save();
         //-----------------------------------------
         // create votes
         // create list of all created users
         $usersAll = $users->keyBy('id')->merge($usersRapper->keyBy('id'));
         $usersAll->shuffle();
         $userVotescnt = rand(0, $usersAll->count());
         for ($j = 0; $j < $userVotescnt; $j++) {
             $vote = new Vote();
             $vote->user_id = $usersAll->get($j)->id;
             $vote->battle_id = $battle->id;
             $vote->rapper_number = rand(0, 1);
             $vote->save();
             // update vote counter
             if ($vote->rapper_number == 0) {
                 $battle->votes_rapper1++;
             } else {
                 $battle->votes_rapper2++;
             }
         }
         // save vote count in battle
         $battle->save();
         $battle->rapper1->updateRating();
         $battle->rapper2->updateRating();
     }
     //----------------------------------------------
     // create battle_requests
     for ($i = 0; $i < $battleRequestcnt * 2; $i += 2) {
         $battleRequest = new BattleRequest();
         $battleRequest->challenger_id = $usersRapper->get($i)->id;
         $battleRequest->challenged_id = $usersRapper->get($i + 1)->id;
         $battleRequest->save();
     }
     //----------------------------------------------
     // create open battles
     $usersRapper->shuffle();
     for ($i = 0; $i < $openBattlecnt * 2; $i += 2) {
         $openBattle = new OpenBattle();
         $openBattle->rapper1_id = $usersRapper->get($i)->id;
         $openBattle->rapper2_id = $usersRapper->get($i + 1)->id;
         $openBattle->phase = rand(1, 2);
         // TODO: how many phases?
         $openBattle->beat1_id = rand(0, 2);
         $openBattle->beat2_id = rand(0, 2);
         $openBattle->save();
     }
     Model::reguard();
 }
示例#10
0
 /**
  * Check if this user has an open battle $user
  */
 public function hasOpenBattleAgainst(User $user)
 {
     //$cnt = $this->openBattles()->where('rapper1_id', $user->id)->orWhere('rapper2_id', $user->id)->count();
     //return $cnt > 0;
     // possibly naive solution, other one had really ugly bugs
     $cnt1 = OpenBattle::where('rapper1_id', $this->id)->where('rapper2_id', $user->id)->open()->count();
     $cnt2 = OpenBattle::where('rapper2_id', $this->id)->where('rapper1_id', $user->id)->open()->count();
     return $cnt1 > 0 || $cnt2 > 0;
 }