<?php

$dotenv = new Dotenv\Dotenv(__DIR__ . '/../');
$dotenv->load();

class PAKQuestionnaireTest extends \PHPUnit\Framework\TestCase
{
    private $username = 'user50@mail.com';
    private $password = 'password12345';

    protected $client;
    protected static $messages = [];
    public function setUp()
    {
        $this->client = new GuzzleHttp\Client(['base_uri' => getenv('TEST_BASE_URL')]);
    }

    public static function tearDownAfterClass()
    {
        echo implode("\n", self::$messages);
    }

    public function testLoginPAK()
    {
        self::$messages = array_merge(
        	self::$messages, 
        	["\n\n\t\t---Test Questionnaire PAK---"]
        );

        $response = $this->client->request(
        	'POST', 
        	'auth/login',
            [
                'json' => [
                    'username' => $this->username,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on auth/login"
        );

        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tLogin PAK Sukses User [" . $jsonResponse['data']['user_id']. "]"]
        );
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     *  @depends testLoginPAK
     */
    public function test_index_PAKQuestionnaire($data)
    {
        $response = $this->client->request(
            'GET', 
            'pak/questionnaire/index',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/index"
        );
        
        $data['initialTotalRecordPAKQuestionnaire'] = $jsonResponse['data']['total_record'];
        
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/questionnaire/index total_record: " . $data['initialTotalRecordPAKQuestionnaire'] . " ...passed"]
        );

        return $data;
    }

    protected function getTotalRecordsPAKQuestionnaire($data)
    {
        $response = $this->client->request(
            'GET', 
            'pak/questionnaire/index',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $jsonResponse = json_decode($response->getBody(), TRUE);

        return $jsonResponse['data']['total_record'];
    }

    /**
     * @depends test_index_PAKQuestionnaire
     */
    public function test_create_PAKQuestionnaire($data)
    {
        $response = $this->client->request(
        	'POST', 
        	'pak/questionnaire/create',
            [
                'json' => [
                    'nama' => 'Lorem ipsum dolor sit amet',
                    'deskripsi' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/create"
        );

        $newTotalRecord = $this->getTotalRecordsPAKQuestionnaire($data);
        $this->assertGreaterThan(
            $data['initialTotalRecordPAKQuestionnaire'], 
            $newTotalRecord
        );
               
        self::$messages = array_merge(
        	self::$messages, 
        	["\t\t\tpak/questionnaire/create #" . $jsonResponse['data']['result'][0]['id']. " ...passed"]
        );

        $data['questionnaire_id'] = $jsonResponse['data']['result'][0]['id'];

        return $data;
    }

    /**
     * @depends test_create_PAKQuestionnaire
     */
    public function test_activate_PAKQuestionnaire($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/questionnaire/activate/' . $data['questionnaire_id'],
            [
                'json' => [
                    'id' => $data['questionnaire_id']
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $is_active = $jsonResponse['data']['result'][0]['is_active'];
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/activate"
        );

        $this->assertEquals(true, $is_active);

        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/questionnaire/activate/" . $data['questionnaire_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKQuestionnaire
     */
    public function test_deactivate_PAKQuestionnaire($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/questionnaire/deactivate/' . $data['questionnaire_id'],
            [
                'json' => [
                    'id' => $data['questionnaire_id']
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $is_active = $jsonResponse['data']['result'][0]['is_active'];
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/deactivate"
        );

        $this->assertEquals(false, $is_active);

        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/questionnaire/deactivate/" . $data['questionnaire_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKQuestionnaire
     */
    public function test_view_PAKQuestionnaire($data)
    {
        $response = $this->client->request(
        	'GET', 
        	'pak/questionnaire/view/' . $data['questionnaire_id'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/view"
        );
        
        self::$messages = array_merge(
        	self::$messages, 
        	["\t\t\tpak/questionnaire/view/" . $data['questionnaire_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKQuestionnaire
     */
    public function test_update_PAKQuestionnaire($data)
    {
        $response = $this->client->request(
        	'POST', 
        	'pak/questionnaire/update/' . $data['questionnaire_id'],
            [
                'json' => [
                    'nama' => 'Lorem ipsum dolor sit amet updated',
                    'deskripsi' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/update"
        );
        
        self::$messages = array_merge(
        	self::$messages, 
        	["\t\t\tpak/questionnaire/update/" . $data['questionnaire_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKQuestionnaire
     */
    public function test_delete_PAKQuestionnaire($data)
    {
        $response = $this->client->request(
        	'POST', 
        	'pak/questionnaire/delete/' . $data['questionnaire_id'],
            [
                'json' => [
                    'id' => $data['questionnaire_id']
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/delete"
        );

        $newTotalRecord = $this->getTotalRecordsPAKQuestionnaire($data);
        $this->assertEquals(
            $data['initialTotalRecordPAKQuestionnaire'], 
            $newTotalRecord
        );

        self::$messages = array_merge(
        	self::$messages, 
        	["\t\t\tpak/questionnaire/delete/" . $data['questionnaire_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKQuestionnaire
     */
    public function test_all_PAKQuestionnaire_should_give_initial_total_records_plus_one($data)
    {
        $response = $this->client->request(
        	'GET', 
        	'pak/questionnaire/all',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/all"
        );

        
        $this->assertGreaterThan(
            $data['initialTotalRecordPAKQuestionnaire'], 
            $jsonResponse['data']['total_record']
        );

        self::$messages = array_merge(
        	self::$messages, 
        	["\t\t\tpak/questionnaire/all ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKQuestionnaire
     */
    public function test_restore_PAKQuestionnaire($data)
    {
        $response = $this->client->request(
        	'POST', 
        	'pak/questionnaire/restore/' . $data['questionnaire_id'],
            [
                'json' => [
                    'id' => $data['questionnaire_id']
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/restore"
        );
        
        $newTotalRecord = $this->getTotalRecordsPAKQuestionnaire($data);
        $this->assertGreaterThan(
            $data['initialTotalRecordPAKQuestionnaire'], 
            $newTotalRecord
        );

        self::$messages = array_merge(
        	self::$messages, 
        	["\t\t\tpak/questionnaire/restore/". $data['questionnaire_id'] . " ...passed"]
        );

        return $data;
    }

	/**
     * @depends test_restore_PAKQuestionnaire
     */
    public function test_destroy_PAKQuestionnaire($data)
    {
        $response = $this->client->request(
        	'POST', 
        	'pak/questionnaire/destroy/' . $data['questionnaire_id'],
            [
                'json' => [
                    'id' => $data['questionnaire_id']
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/destroy"
        );

        $newTotalRecord = $this->getTotalRecordsPAKQuestionnaire($data);
        $this->assertEquals(
            $data['initialTotalRecordPAKQuestionnaire'], 
            $newTotalRecord
        );
        
        self::$messages = array_merge(
        	self::$messages, 
        	["\t\t\tpak/questionnaire/destroy/". $data['questionnaire_id'] . " ...passed"]
        );
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t------------------------------------------------"]
        );

        return $data;
    }

    /**
     * @depends testLoginPAK
     */
    public function test_create_PAKQuestionnaire_for_type_document_test($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/questionnaire/create',
            [
                'json' => [
                    'nama' => 'Lorem ipsum dolor sit amet',
                    'deskripsi' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/create"
        );

        $data['questionnaire_id'] = $jsonResponse['data']['result'][0]['id'];

        return $data;
    }

    /**
     *  @depends test_create_PAKQuestionnaire_for_type_document_test
     */
    public function test_index_PAKJenisDokumenQuestionnaire($data)
    {
        $response = $this->client->request(
            'GET', 
            'pak/questionnaire/document/index',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/document/index"
        );
        
        $data['initialTotalRecordPAKJenisDokumenQuestionnaire'] = $jsonResponse['data']['total_record'];
        
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/questionnaire/document/index total_record: " . $data['initialTotalRecordPAKJenisDokumenQuestionnaire'] . " ...passed"]
        );

        return $data;
    }

    protected function getTotalRecordsPAKJenisDokumenQuestionnaire($data)
    {
        $response = $this->client->request(
            'GET', 
            'pak/questionnaire/document/index',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $jsonResponse = json_decode($response->getBody(), TRUE);

        return $jsonResponse['data']['total_record'];
    }

    /**
     * @depends test_index_PAKJenisDokumenQuestionnaire
     */
    public function test_create_PAKJenisDokumenQuestionnaire($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/questionnaire/document/create',
            [
                'json' => [
                    'questionnaire_id' => $data['questionnaire_id'],
                    'jenis_dokumen' => 'Draft Perkada',
                    'is_using_doc_info' => true
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/document/create"
        );

        $newTotalRecord = $this->getTotalRecordsPAKJenisDokumenQuestionnaire($data);
        $this->assertGreaterThan(
            $data['initialTotalRecordPAKJenisDokumenQuestionnaire'], 
            $newTotalRecord
        );
               
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/questionnaire/document/create #" . $jsonResponse['data']['result'][0]['id']. " ...passed"]
        );

        $data['document_id'] = $jsonResponse['data']['result'][0]['id'];

        return $data;
    }

    /**
     * @depends test_create_PAKJenisDokumenQuestionnaire
     */
    public function test_view_PAKJenisDokumenQuestionnaire($data)
    {
        $response = $this->client->request(
            'GET', 
            'pak/questionnaire/document/view/' . $data['document_id'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/document/view"
        );
        
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/questionnaire/document/view/" . $data['document_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKJenisDokumenQuestionnaire
     */
    public function test_update_PAKJenisDokumenQuestionnaire($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/questionnaire/document/update/' . $data['document_id'],
            [
                'json' => [
                    'questionnaire_id' => $data['questionnaire_id'],
                    'jenis_dokumen' => 'Draft Perkada Edited',
                    'is_using_doc_info' => false
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/document/update"
        );
        
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/questionnaire/document/update/" . $data['document_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKJenisDokumenQuestionnaire
     */
    public function test_delete_PAKJenisDokumenQuestionnaire($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/questionnaire/document/delete/' . $data['document_id'],
            [
                'json' => [
                    'id' => $data['document_id']
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/document/delete"
        );

        $newTotalRecord = $this->getTotalRecordsPAKJenisDokumenQuestionnaire($data);
        $this->assertEquals(
            $data['initialTotalRecordPAKJenisDokumenQuestionnaire'], 
            $newTotalRecord
        );

        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/questionnaire/document/delete/" . $data['document_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKJenisDokumenQuestionnaire
     */
    public function test_all_PAKJenisDokumenQuestionnaire_should_give_initial_total_records_plus_one($data)
    {
        $response = $this->client->request(
            'GET', 
            'pak/questionnaire/document/all',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/document/all"
        );

        
        $this->assertGreaterThan(
            $data['initialTotalRecordPAKJenisDokumenQuestionnaire'], 
            $jsonResponse['data']['total_record']
        );

        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/questionnaire/document/all ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKJenisDokumenQuestionnaire
     */
    public function test_restore_PAKJenisDokumenQuestionnaire($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/questionnaire/document/restore/' . $data['document_id'],
            [
                'json' => [
                    'id' => $data['document_id']
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/document/restore"
        );
        
        $newTotalRecord = $this->getTotalRecordsPAKJenisDokumenQuestionnaire($data);
        $this->assertGreaterThan(
            $data['initialTotalRecordPAKJenisDokumenQuestionnaire'], 
            $newTotalRecord
        );

        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/questionnaire/document/restore/". $data['document_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_restore_PAKJenisDokumenQuestionnaire
     */
    public function test_destroy_PAKJenisDokumenQuestionnaire($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/questionnaire/document/destroy/' . $data['document_id'],
            [
                'json' => [
                    'id' => $data['document_id']
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on pak/questionnaire/document/destroy"
        );

        $newTotalRecord = $this->getTotalRecordsPAKJenisDokumenQuestionnaire($data);
        $this->assertEquals(
            $data['initialTotalRecordPAKJenisDokumenQuestionnaire'], 
            $newTotalRecord
        );
        
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/questionnaire/document/destroy/". $data['document_id'] . " ...passed"]
        );
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t------------------------------------------------"]
        );

        return $data;
    }    

}

?>