<?php

require_once 'ABaseTest.php';

class ScopesTest extends BaseTest
{
    const BASE_URL = "scopes";
    protected $token;

    public function setUp()
    {
        parent::setUp();
        $this->token = $this->doLogin();
    }

    public function doLogin()
    {
        $login = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $this->assertContains(
            [
                'success' => true
            ],
            $login,
            "login Failed"
        );
        return $login['data']['token'];
    }

    public function testCreateShouldGiveSuccessResponse()
    {
        $res = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/create',
            [
                'json' => [
                    'name' => 'user_phpunit',
                    'label' => 'User PHPUnit Test',
                    'description' => 'User PHPUnit Test Description'
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "\ncreate Passed"
        );

        return $res['data']['result'][0];
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     * @return mixed
     */
    public function testUpdateShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/update/' . $data['id'],
            [
                'json' => [
                    'name' => 'user_phpunit_edit',
                    'label' => 'User PHPUnit Test Edit',
                    'description' => 'User PHPUnit Test Description Edit'
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "update Passed"
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     */
    public function testDetailShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            self::BASE_URL . '/detail/' . $data['id'],
            [
                'headers' => [
                    'Authorization'=> 'Bearer ' . $this->token
                ]
            ],
            200,
            "detail Passed"
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     */
    public function testRemoveShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/remove/' . $data['id'],
            [
                'headers' => [
                    'Authorization' => "Bearer " . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ],
            200,
            "remove Passed"
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     */
    public function testRestoreShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            "POST",
            self::BASE_URL . '/restore/' . $data['id'],
            [
                'headers' => [
                    'Authorization' => "Bearer " . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ],
            200,
            "restore Passed"
        );
    }

    public function testListShouldGiveSuccessResponse()
    {
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            self::BASE_URL . '/list',
            [
                'headers' => [
                    'Authorization'=> 'Bearer ' . $this->token
                ]
            ],
            200,
            "list Passed"
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     * @return mixed
     */
    public function testAddRolesShouldGiveSuccessResponse($data)
    {
        $roleIds = [1, 2, 3];
        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/roles/' . $data['id'],
            [
                'json' => [
                    'role_id' => $roleIds
                ],
                'headers' => [
                    'Authorization'=> 'Bearer ' . $this->token
                ]
            ],
            200,
            "add roles Passed"
        );

        return array_merge($data, ['role_ids' => $roleIds]);
    }

    /**
     * @depends testAddRolesShouldGiveSuccessResponse
     * @param $data
     */
    public function testListRolesShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            self::BASE_URL . '/roles/' . $data['id'],
            [
                'headers' => [
                    'Authorization'=> 'Bearer ' . $this->token
                ]
            ],
            200,
            "list roels Passed"
        );
    }

    /**
     * @depends testAddRolesShouldGiveSuccessResponse
     * @param $data
     */
    public function testDeleteRolesShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/delete/roles/' . $data['id'],
            [
                'json' => [
                    'role_id' => $data['role_ids']
                ],
                'headers' => [
                    'Authorization'=> 'Bearer ' . $this->token
                ]
            ],
            200,
            "add roles Passed"
        );
    }
}
