<?php
declare(strict_types=1);

namespace common\tests\unit\tasks;

use common\models\OauthClient;
use common\models\OauthSession;
use common\tasks\ClearOauthSessions;
use common\tests\fixtures;
use common\tests\unit\TestCase;
use yii\queue\Queue;

class ClearOauthSessionsTest extends TestCase {

    public function _fixtures(): array {
        return [
            'oauthClients' => fixtures\OauthClientFixture::class,
            'oauthSessions' => fixtures\OauthSessionFixture::class,
        ];
    }

    public function testCreateFromClient() {
        $client = new OauthClient();
        $client->id = 'mocked-id';

        $result = ClearOauthSessions::createFromOauthClient($client);
        $this->assertInstanceOf(ClearOauthSessions::class, $result);
        $this->assertSame('mocked-id', $result->clientId);
        $this->assertNull($result->notSince);

        $result = ClearOauthSessions::createFromOauthClient($client, time());
        $this->assertInstanceOf(ClearOauthSessions::class, $result);
        $this->assertSame('mocked-id', $result->clientId);
        $this->assertEqualsWithDelta(time(), $result->notSince, 1);
    }

    public function testExecute() {
        $task = new ClearOauthSessions('deleted-oauth-client-with-sessions', 1519510065);
        $task->execute($this->createMock(Queue::class));

        $this->assertFalse(OauthSession::find()->andWhere(['legacy_id' => 3])->exists());
        $this->assertTrue(OauthSession::find()->andWhere(['legacy_id' => 4])->exists());

        $task = new ClearOauthSessions('deleted-oauth-client-with-sessions');
        $task->execute($this->createMock(Queue::class));

        $this->assertFalse(OauthSession::find()->andWhere(['legacy_id' => 4])->exists());

        $task = new ClearOauthSessions('some-not-exists-client-id');
        $task->execute($this->createMock(Queue::class));
    }

}