. */ namespace Tests\Feature; use App\Account; use App\PhoneChangeCode; use App\PhoneCountry; use Tests\TestCase; class ApiAccountPhoneChangeTest extends TestCase { protected $route = '/api/accounts/me/phone'; protected $method = 'POST'; public function testRequest() { $account = Account::factory()->withConsumedAccountCreationToken()->create(); $account->generateUserApiKey(); $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ 'phone' => 'blabla' ]) ->assertStatus(422); // Send a SMS $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ 'phone' => '+33216412664' ]) ->assertStatus(200); $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ 'phone' => '+33216412664' ]) ->assertStatus(200); $this->assertEquals(2, PhoneChangeCode::where('account_id', $account->id)->count()); } public function testCodeExpiration() { $account = Account::factory()->withConsumedAccountCreationToken()->create(); $account->generateUserApiKey(); $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ 'phone' => '+33612312312' ]) ->assertStatus(200); config()->set('app.phone_change_code_expiration_minutes', 10); PhoneChangeCode::where('id', $account->phoneChangeCode->id) ->update(['created_at' => $account->phoneChangeCode->created_at->subMinutes(1000)]); $this->keyAuthenticated($account) ->json($this->method, $this->route, [ 'code' => $account->phoneChangeCode->code ]) ->assertStatus(410); } public function testCreatePhoneByCountry() { $account = Account::factory()->withConsumedAccountCreationToken()->create(); $account->generateUserApiKey(); $frenchPhoneNumber = '+33612121212'; $dutchPhoneNumber = '+31612121212'; $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ 'phone' => $frenchPhoneNumber ]) ->assertStatus(200); $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ 'phone' => $dutchPhoneNumber ]) ->assertJsonValidationErrors(['phone']); PhoneCountry::where('code', 'NL')->update(['activated' => true]); $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ 'phone' => $dutchPhoneNumber ]) ->assertStatus(200); } public function testUnvalidatedAccount() { $account = Account::factory()->create(); $account->generateUserApiKey(); $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ 'phone' => 'blabla' ]) ->assertStatus(403); } public function testConfirmWrongCode() { $phoneChange = PhoneChangeCode::factory()->create(); $this->keyAuthenticated($phoneChange->account) ->json($this->method, $this->route, [ 'code' => 'wrong' ]) ->assertStatus(422); } public function testConfirmGoodCode() { $phoneChange = PhoneChangeCode::factory()->create(); $phone = $phoneChange->phone; $admin = Account::factory()->admin()->create(); $admin->generateUserApiKey(); $this->keyAuthenticated($phoneChange->account) ->get('/api/accounts/me') ->assertStatus(200) ->assertJson([ 'phone' => null ]); // Check who can see the code $this->keyAuthenticated($admin) ->json('GET', '/api/accounts/' . $phoneChange->account->id) ->assertStatus(200) ->assertSee($phoneChange->code); $this->keyAuthenticated($phoneChange->account) ->json('GET', '/api/accounts/me') ->assertStatus(200) ->assertDontSee($phoneChange->code); $this->keyAuthenticated($phoneChange->account) ->json($this->method, $this->route, [ 'code' => $phoneChange->code ]) ->assertStatus(200) ->assertJson([ 'phone' => $phone, ]); $this->keyAuthenticated($phoneChange->account) ->get('/api/accounts/me') ->assertStatus(200) ->assertJson([ 'phone' => $phone ]); // Check that the code is gone $this->keyAuthenticated($admin) ->json('GET', '/api/accounts/' . $phoneChange->account->id) ->assertStatus(200) ->assertDontSee($phoneChange->code); } }