@ -1,95 +1,146 @@
< ? php
namespace codeception\console\unit\controllers ;
use Codeception\Specify ;
use common\components\Mojang\Api ;
use common\components\Mojang\exceptions\NoContentException ;
use common\components\Mojang\response\UsernameToUUIDResponse ;
use common\models\amqp\UsernameChanged ;
use common\models\MojangUsername ;
use console\controllers\AccountQueueController ;
use tests\codeception\common\fixtures\AccountFixture ;
use tests\codeception\common\fixtures\MojangUsernameFixture ;
use tests\codeception\console\unit\Db TestCase ;
use tests\codeception\console\unit\TestCase ;
use Yii ;
/**
* @property array $accounts
* @property array $mojangUsernames
*/
class AccountQueueControllerTest extends DbTestCase {
use Specify ;
class AccountQueueControllerTest extends TestCase {
public function fixtures () {
/**
* @var AccountQueueController
*/
private $controller ;
private $expectedResponse ;
public function _fixtures () {
return [
'accounts' => [
'class' => Account Fixture :: class ,
'dataFile' => '@tests/codeception/common/fixtures/data/accounts.php' ,
],
'mojangUsernames' => [
'class' => MojangUsernameFixture :: class ,
'dataFile' => '@tests/codeception/common/fixtures/data/mojang-usernames.php' ,
],
'accounts' => AccountFixture :: class ,
'mojangUsernames' => MojangUsername Fixture:: class ,
];
}
public function testRouteUsernameChanged () {
// TODO: пропустить тест, если у нас нету интернета
$controller = new AccountQueueController ( 'account-queue' , Yii :: $app );
$this -> specify ( 'Update last_pulled_at time if username exists' , function () use ( $controller ) {
$accountInfo = $this -> accounts [ 'admin' ];
$body = new UsernameChanged ([
'accountId' => $accountInfo [ 'id' ],
'oldUsername' => $accountInfo [ 'username' ],
'newUsername' => 'Notch' ,
]);
$controller -> routeUsernameChanged ( $body );
/** @var MojangUsername|null $mojangUsername */
$mojangUsername = MojangUsername :: findOne ( 'Notch' );
expect ( $mojangUsername ) -> isInstanceOf ( MojangUsername :: class );
expect ( $mojangUsername -> last_pulled_at ) -> greaterThan ( $this -> mojangUsernames [ 'Notch' ][ 'last_pulled_at' ]);
expect ( $mojangUsername -> last_pulled_at ) -> lessOrEquals ( time ());
});
public function _before () {
parent :: _before ();
$this -> specify ( 'Add new MojangUsername if don\'t exists' , function () use ( $controller) {
$ac cou ntInfo = $this -> accounts [ 'admin' ];
$body = new UsernameChanged ([
'accountId' => $accountInfo [ 'id' ],
'oldUsername' => $accountInfo [ 'username' ],
'newUsername' => 'Chest' ,
]);
$controller -> routeUsernameChanged ( $body );
/** @var MojangUsername|null $mojangUsername */
$mojangUsername = MojangUsername :: findOne ( 'Chest' );
expect ( $mojangUsername ) -> isInstanceOf ( MojangUsername :: class );
});
/** @var AccountQueueController|\PHPUnit_Framework_MockObject_MockObject $controller */
$ controller = $this -> getMockBuilder ( AccountQueueController :: class )
-> setMethods ([ 'createMojangApi' ])
-> setConstructorArgs ([ 'account-queue' , Yii :: $app ])
-> getMock ();
$this -> specify ( 'Remove MojangUsername, if now it\'s does\'t exists' , function () use ( $controller ) {
$accountInfo = $this -> accounts [ 'admin' ];
$username = $this -> mojangUsernames [ 'not-exists' ] ['username' ];
$body = new UsernameChanged ([
'accountId' => $accountInfo [ 'id' ],
'oldUsername' => $accountInfo [ 'username' ],
'newUsername' => $username ,
]);
$controller -> routeUsernameChanged ( $body );
/** @var MojangUsername|null $mojangUsername */
$mojangUsername = MojangUsername :: findOne ( $username );
expect ( $mojangUsername ) -> null ();
});
/** @var Api|\PHPUnit_Framework_MockObject_MockObject $apiMock */
$apiMock = $this -> getMockBuilder ( Api :: class )
-> setMethods ( ['usernameToUUID ' ])
-> getMock ();
$this -> specify ( 'Update uuid if username for now owned by other player' , function () use ( $controller ) {
$accountInfo = $this -> accounts [ 'admin' ];
$mojangInfo = $this -> mojangUsernames [ 'uuid-changed ' ];
$username = $mojangInfo [ 'username' ];
$body = new UsernameChanged ([
'accountId' => $accountInfo [ 'id' ],
'oldUsername' => $accountInfo [ 'username' ],
'newUsername' => $usernam e,
]);
$controller -> routeUsernameChanged ( $body );
/** @var MojangUsername|null $mojangUsername */
$mojangUsername = MojangUsername :: findOne ( $username );
expect( $mojangUsername ) -> isInstanceOf ( MojangUsername :: class );
expect ( $mojangUsername -> uuid ) -> notEquals ( $mojangInfo [ 'uuid' ]);
} );
$apiMock
-> expects ( $this -> any ())
-> method ( 'usernameToUUID ' )
-> willReturnCallback ( function () {
if ( $this -> expectedResponse === false ) {
throw new NoContentException ();
} else {
return $this -> expectedRespons e ;
}
} );
$controller
-> expects ( $this -> any ())
-> method ( 'createMojangApi' )
-> willReturn ( $apiMock );
$this -> controller = $controller ;
}
public function testRouteUsernameChangedUsernameExists () {
$expectedResponse = new UsernameToUUIDResponse ();
$expectedResponse -> id = '069a79f444e94726a5befca90e38aaf5' ;
$expectedResponse -> name = 'Notch' ;
$this -> expectedResponse = $expectedResponse ;
/** @var \common\models\Account $accountInfo */
$accountInfo = $this -> tester -> grabFixture ( 'accounts' , 'admin' );
/** @var MojangUsername $mojangUsernameFixture */
$mojangUsernameFixture = $this -> tester -> grabFixture ( 'mojangUsernames' , 'Notch' );
$body = new UsernameChanged ([
'accountId' => $accountInfo -> id ,
'oldUsername' => $accountInfo -> username ,
'newUsername' => 'Notch' ,
]);
$this -> controller -> routeUsernameChanged ( $body );
/** @var MojangUsername|null $mojangUsername */
$mojangUsername = MojangUsername :: findOne ( 'Notch' );
$this -> assertInstanceOf ( MojangUsername :: class , $mojangUsername );
$this -> assertGreaterThan ( $mojangUsernameFixture -> last_pulled_at , $mojangUsername -> last_pulled_at );
$this -> assertLessThanOrEqual ( time (), $mojangUsername -> last_pulled_at );
}
public function testRouteUsernameChangedUsernameNotExists () {
$expectedResponse = new UsernameToUUIDResponse ();
$expectedResponse -> id = '607153852b8c4909811f507ed8ee737f' ;
$expectedResponse -> name = 'Chest' ;
$this -> expectedResponse = $expectedResponse ;
/** @var \common\models\Account $accountInfo */
$accountInfo = $this -> tester -> grabFixture ( 'accounts' , 'admin' );
$body = new UsernameChanged ([
'accountId' => $accountInfo [ 'id' ],
'oldUsername' => $accountInfo [ 'username' ],
'newUsername' => 'Chest' ,
]);
$this -> controller -> routeUsernameChanged ( $body );
/** @var MojangUsername|null $mojangUsername */
$mojangUsername = MojangUsername :: findOne ( 'Chest' );
$this -> assertInstanceOf ( MojangUsername :: class , $mojangUsername );
}
public function testRouteUsernameChangedRemoveIfExistsNoMore () {
$this -> expectedResponse = false ;
/** @var \common\models\Account $accountInfo */
$accountInfo = $this -> tester -> grabFixture ( 'accounts' , 'admin' );
$username = $this -> tester -> grabFixture ( 'mojangUsernames' , 'not-exists' )[ 'username' ];
$body = new UsernameChanged ([
'accountId' => $accountInfo [ 'id' ],
'oldUsername' => $accountInfo [ 'username' ],
'newUsername' => $username ,
]);
$this -> controller -> routeUsernameChanged ( $body );
/** @var MojangUsername|null $mojangUsername */
$mojangUsername = MojangUsername :: findOne ( $username );
$this -> assertNull ( $mojangUsername );
}
public function testRouteUsernameChangedUuidUpdated () {
$expectedResponse = new UsernameToUUIDResponse ();
$expectedResponse -> id = 'f498513ce8c84773be26ecfc7ed5185d' ;
$expectedResponse -> name = 'jeb' ;
$this -> expectedResponse = $expectedResponse ;
/** @var \common\models\Account $accountInfo */
$accountInfo = $this -> tester -> grabFixture ( 'accounts' , 'admin' );
/** @var MojangUsername $mojangInfo */
$mojangInfo = $this -> tester -> grabFixture ( 'mojangUsernames' , 'uuid-changed' );
$username = $mojangInfo [ 'username' ];
$body = new UsernameChanged ([
'accountId' => $accountInfo [ 'id' ],
'oldUsername' => $accountInfo [ 'username' ],
'newUsername' => $username ,
]);
$this -> controller -> routeUsernameChanged ( $body );
/** @var MojangUsername|null $mojangUsername */
$mojangUsername = MojangUsername :: findOne ( $username );
$this -> assertInstanceOf ( MojangUsername :: class , $mojangUsername );
$this -> assertNotEquals ( $mojangInfo -> uuid , $mojangUsername -> uuid );
}
}