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();
 }
 /**
  * Insertion test
  *
  * @return void
  */
 public function testInsert()
 {
     // create users
     $user1 = factory(App\Models\User::class)->create();
     $user2 = factory(App\Models\User::class)->create();
     // create OpenBattle
     $openBattle = new OpenBattle();
     $openBattle->rapper1_id = $user1->id;
     $openBattle->rapper2_id = $user2->id;
     $openBattle->phase = 2;
     $openBattle->beat1_id = 1;
     $openBattle->beat2_id = 2;
     $openBattle->rapper1_round1 = '/somewhere/somefile';
     $openBattle->rapper2_round1 = '/somewhere/otherfile';
     $openBattle->rapper1_round2 = '/somewhere/file3';
     $openBattle->rapper2_round2 = '/somewhere/file4';
     $openBattle->save();
     // check if it is in database
     $this->seeInDatabase('open_battles', ['rapper1_id' => $user1->id, 'rapper2_id' => $user2->id, 'beat1_id' => 1, 'beat2_id' => 2, 'rapper1_round1' => '/somewhere/somefile', 'rapper2_round1' => '/somewhere/otherfile', 'rapper1_round2' => '/somewhere/file3', 'rapper2_round2' => '/somewhere/file4']);
     // can rappers be retrieved from OpenBattle?
     $this->assertNotNull($openBattle->rapper1()->get()->values()->keyBy('id')->get($user1->id));
     $this->assertNotNull($openBattle->rapper2()->get()->values()->keyBy('id')->get($user2->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]]]]);
 }
 /**
  * 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);
 }
 /**
  * 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);
     }
 }
 /**
  * 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();
 }