Skip to content

Commit

Permalink
Add test trait for account handling
Browse files Browse the repository at this point in the history
  • Loading branch information
MGatner committed May 30, 2020
1 parent 988da19 commit be33a55
Show file tree
Hide file tree
Showing 2 changed files with 182 additions and 0 deletions.
115 changes: 115 additions & 0 deletions src/Test/FirebaseUserTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
<?php namespace Tatter\Firebase\Test;

use CodeIgniter\Test\Fabricator;
use Kreait\Firebase\Auth\UserRecord;
use Tatter\Firebase\Model;

/**
* Trait to use when testing requires a valid Firebase user account.
*/
trait FirebaseUserTrait
{
/**
* Instance of the Firebase SDK.
*
* @var Kreait\Firebase\Auth
*/
protected static $auth;

/**
* Fabricator for generating faux content.
*
* @var CodeIgniter\Test\Fabricator
*/
protected static $fabricator;

/**
* Array of user account UIDs to be removed.
*
* @var array
*/
protected $firebaseUserCache;

/**
* Ensures the static instances are loaded.
*
* @param array $data
*
* @return $this
*/
protected function initAuth()
{
if (! self::$auth)
{
self::$auth = service('firebase')->auth;
}

if (! self::$fabricator)
{
self::$fabricator = new Fabricator('Tatter\Firebase\Model', [
'email' => 'email',
'displayName' => 'name',
//'phoneNumber' => 'phoneNumber', // Faker phone numbers aren't currently acceptable
]);
}
}

/**
* Creates a random Firebase Auth user on-the-fly.
*
* @param array|null $overrides Overriding data to use with the Fabricator
*
* @return Kreait\Firebase\Auth\UserRecord
*/
protected function createFirebaseUser(array $overrides = null): UserRecord
{
$this->initAuth();

if ($overrides)
{
self::$fabricator->setOverrides($overrides, false);
}

// Generate random data from the fabricator
$data = self::$fabricator->makeArray();

// Make sure there is a password
if (empty($data['password']))
{
$data['password'] = bin2hex(random_bytes(16));
}

// Create the user account
$user = self::$auth->createUser($data);

// Store it in the cache for removal later
$this->firebaseUserCache[] = $user->uid;

return $user;
}

/**
* Removes a Firebase Auth user.
*
* @param string $uid
*/
protected function removeFirebaseUser(string $uid)
{
$this->initAuth();

self::$auth->deleteUser($uid);

$this->firebaseUserCache = array_diff($this->firebaseUserCache, [$uid]);
}

/**
* Removes any Firebase Auth users in the cache.
*/
protected function firebaseUserTearDown()
{
foreach ($this->firebaseUserCache as $uid)
{
$this->removeFirebaseUser($uid);
}
}
}
67 changes: 67 additions & 0 deletions tests/unit/FirebaseUserTraitTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

use Kreait\Firebase\Auth\UserRecord;
use Kreait\Firebase\Exception\Auth\UserNotFound;

class FirebaseUserTraitTest extends \CodeIgniter\Test\CIUnitTestCase
{
use \Tatter\Firebase\Test\FirebaseUserTrait;

/**
* Instance of the Firebase SDK.
*
* @var Kreait\Firebase\Auth
*/
protected $firebase;

public function setUp(): void
{
parent::setUp();

$this->firebase = service('firebase')->auth;
}

public function tearDown(): void
{
parent::tearDown();

$this->firebaseUserTearDown();
}

public function testCreateUserReturnsUserRecord()
{
$user = $this->createFirebaseUser();

$this->assertInstanceOf(UserRecord::class, $user);
}

public function testCreateUserCreatesUser()
{
$user = $this->createFirebaseUser();

$test = $this->firebase->getUser($user->uid);

$this->assertInstanceOf(UserRecord::class, $test);
$this->assertEquals($user->email, $test->email);
}

public function testRemoveUserRemovesUser()
{
$user = $this->createFirebaseUser();
$this->removeFirebaseUser($user->uid);

$this->expectException(UserNotFound::class);

$test = $this->firebase->getUser($user->uid);
}

public function testTearDownRemovesUser()
{
$user = $this->createFirebaseUser();
$this->firebaseUserTearDown();

$this->expectException(UserNotFound::class);

$test = $this->firebase->getUser($user->uid);
}
}

0 comments on commit be33a55

Please sign in to comment.