. */ namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; use App\Password; use App\Admin; use App\Account as DBAccount; use App\AuthToken; class AccountProvisioningTest extends TestCase { use RefreshDatabase; protected $route = '/provisioning'; protected $accountRoute = '/provisioning/me'; protected $method = 'GET'; protected $pnProvider = 'provider'; protected $pnParam = 'param'; protected $pnPrid = 'id'; public function testBaseProvisioning() { $response = $this->get($this->route); $response->assertStatus(200); $response->assertHeader('Content-Type', 'application/xml'); $response->assertDontSee('ha1'); } public function testAuthenticatedProvisioning() { $response = $this->get($this->accountRoute); $response->assertStatus(302); $password = Password::factory()->create(); $password->account->generateApiKey(); // Ensure that we get the authentication password once $response = $this->keyAuthenticated($password->account) ->get($this->accountRoute) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') ->assertSee('ha1') ->assertSee('contacts-vcard-list'); // And then twice $response = $this->keyAuthenticated($password->account) ->get($this->accountRoute) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') ->assertSee('ha1'); } public function testAuthenticatedReProvisioning() { $password = Password::factory()->create(); $password->account->generateApiKey(); $provisioningToken = $password->account->provisioning_token; // Regenerate a new provisioning token from the authenticated account $this->keyAuthenticated($password->account) ->get('/api/accounts/me/provision') ->assertStatus(200) ->assertSee('provisioning_token') ->assertDontSee($provisioningToken); $password->account->refresh(); // And use the fresh provisioning token $this->get($this->route.'/'.$password->account->provisioning_token) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') ->assertSee($password->account->username) ->assertSee('ha1'); } public function testConfirmationKeyProvisioning() { $response = $this->get($this->route.'/1234'); $response->assertStatus(200); $response->assertHeader('Content-Type', 'application/xml'); $response->assertDontSee('ha1'); $password = Password::factory()->create(); $password->account->generateApiKey(); $password->account->activated = false; $password->account->save(); // Ensure that we get the authentication password once $response = $this->get($this->route.'/'.$password->account->provisioning_token) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') ->assertSee('ha1'); // Check if the account has been activated $this->assertEquals(true, DBAccount::where('id', $password->account->id)->first()->activated); // And then twice $response = $this->get($this->route.'/'.$password->account->provisioning_token) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') ->assertDontSee('ha1'); $password->account->refresh(); $provisioningToken = $password->account->provisioning_token; // Refresh the provisioning_token $admin = Admin::factory()->create(); $admin->account->generateApiKey(); $this->keyAuthenticated($admin->account) ->json($this->method, '/api/accounts/'.$password->account->id.'/provision') ->assertStatus(200) ->assertSee('provisioning_token') ->assertDontSee($provisioningToken); $password->account->refresh(); $this->assertNotEquals($provisioningToken, $password->account->provisioning_token); // And then provision one last time $this->get($this->route.'/'.$password->account->provisioning_token) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') ->assertSee('ha1'); } public function testAuthTokenProvisioning() { // Generate a public auth_token and attach it $response = $this->json('POST', '/api/accounts/auth_token') ->assertStatus(201) ->assertJson([ 'token' => true ])->content(); $authToken = json_decode($response)->token; $password = Password::factory()->create(); $password->account->generateApiKey(); $this->keyAuthenticated($password->account) ->json($this->method, '/api/accounts/auth_token/' . $authToken . '/attach') ->assertStatus(200); // Use the auth_token to provision the account $this->assertEquals(AuthToken::count(), 1); $this->get($this->route.'/auth_token/'.$authToken) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') ->assertSee('ha1'); $this->assertEquals(AuthToken::count(), 0); // Try to re-use the auth_token $this->get($this->route.'/auth_token/'.$authToken) ->assertStatus(404); } }