<?php

use GuzzleHttp\Exception\GuzzleException;

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

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

    private $userDinas = 'user48@mail.com';
    private $userVerifikator = 'user19@mail.com';
    private $instansiId = '290';

    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 Verifikasi Implementasi 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_create_PAKQuestionnaire_for_verification_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 questionnaire/create"
        );

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

        return $data;
    }

    /**
     *  @depends test_create_PAKQuestionnaire_for_verification_test
     */
    public function test_create_PAKJenisDokumenQuestionnaire_for_verification_test($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"
        );

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

        return $data;
    }

    /**
     * @depends test_create_PAKJenisDokumenQuestionnaire_for_verification_test
     */
    public function test_create_PAKImplementasi_for_verification_test($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/implementasi/create',
            [
                'json' => [
                    "instansi_id"=>4,
                    "tahun"=>"2020",
                    "nomor"=>"14",
                    "tentang"=>"Implementasi PAK",
                    "tanggal_ttd"=>"2020-10-10 00:00:00"
                ],
                '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 implementasi/create"
        );

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

        return $data;
    }

    /**
     *  @depends test_create_PAKImplementasi_for_verification_test
     */
    public function test_index_PAKImplementasiVerifikasi($data)
    {
        $response = $this->client->request(
            'GET', 
            'pak/implementasi/verifikasi/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 implementasi/verifikasi/index"
        );
        
        $data['initialTotalRecordPAKImplementasiVerifikasi'] = $jsonResponse['data']['total_record'];
        
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/implementasi/verifikasi/index total_record: " . $data['initialTotalRecordPAKImplementasiVerifikasi'] . " ...passed"]
        );

        return $data;
    }

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

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

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

    /**
     * @depends test_index_PAKImplementasiVerifikasi
     */
    public function test_create_PAKImplementasiVerifikasi($data)
    {
        $response = $this->client->request(
        	'POST', 
        	'pak/implementasi/verifikasi/create',
            [
                'json' => [
                    "implementasi_id" => $data['implementasi_id'],
                    "questionnaire_id" => $data['questionnaire_id'],
                    "nilai_verifikasi" => 60
                ],
                '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 implementasi/verifikasi/create"
        );

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

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

        return $data;
    }

    /**
     * @depends test_create_PAKImplementasiVerifikasi
     */
    public function test_view_PAKImplementasiVerifikasi($data)
    {
        $response = $this->client->request(
        	'GET', 
        	'pak/implementasi/verifikasi/view/' . $data['verifikasi_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 implementasi/verifikasi/view"
        );
        
        self::$messages = array_merge(
        	self::$messages, 
        	["\t\t\tpak/implementasi/verifikasi/view/" . $data['verifikasi_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKImplementasiVerifikasi
     */
    public function test_update_PAKImplementasiVerifikasi($data)
    {
        $response = $this->client->request(
        	'POST', 
        	'pak/implementasi/verifikasi/update/' . $data['verifikasi_id'],
            [
                'json' => [
                    "implementasi_id" => $data['implementasi_id'],
                    "questionnaire_id" => $data['questionnaire_id'],
                    "nilai_verifikasi" => 70
                ],
                '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 implementasi/verifikasi/update"
        );
        
        self::$messages = array_merge(
        	self::$messages, 
        	["\t\t\tpak/implementasi/verifikasi/update/" . $data['verifikasi_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKImplementasiVerifikasi
     */
    public function test_delete_PAKImplementasiVerifikasi($data)
    {
        $response = $this->client->request(
        	'POST', 
        	'pak/implementasi/verifikasi/delete/' . $data['verifikasi_id'],
            [
                'json' => [
                    'id' => $data['verifikasi_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 implementasi/verifikasi/delete"
        );

        $newTotalRecord = $this->getTotalRecordsPAKImplementasiVerifikasi($data);
        $this->assertEquals(
            $data['initialTotalRecordPAKImplementasiVerifikasi'], 
            $newTotalRecord
        );

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

        return $data;
    }

    /**
     * @depends test_create_PAKImplementasiVerifikasi
     */
    public function test_all_PAKImplementasiVerifikasi_should_give_initial_total_records_plus_one($data)
    {
        $response = $this->client->request(
        	'GET', 
        	'pak/implementasi/verifikasi/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 implementasi/verifikasi/all"
        );

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

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

        return $data;
    }

    /**
     * @depends test_create_PAKImplementasiVerifikasi
     */
    public function test_restore_PAKImplementasiVerifikasi($data)
    {
        $response = $this->client->request(
        	'POST', 
        	'pak/implementasi/verifikasi/restore/' . $data['verifikasi_id'],
            [
                'json' => [
                    'id' => $data['verifikasi_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 implementasi/verifikasi/restore"
        );
        
        $newTotalRecord = $this->getTotalRecordsPAKImplementasiVerifikasi($data);
        $this->assertGreaterThan(
            $data['initialTotalRecordPAKImplementasiVerifikasi'], 
            $newTotalRecord
        );

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

        return $data;
    }

	/**
     * @depends test_restore_PAKImplementasiVerifikasi
     */
    public function test_destroy_PAKImplementasiVerifikasi($data)
    {
        $response = $this->client->request(
        	'POST', 
        	'pak/implementasi/verifikasi/destroy/' . $data['verifikasi_id'],
            [
                'json' => [
                    'id' => $data['verifikasi_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 implementasi/verifikasi/destroy"
        );

        $newTotalRecord = $this->getTotalRecordsPAKImplementasiVerifikasi($data);
        $this->assertEquals(
            $data['initialTotalRecordPAKImplementasiVerifikasi'], 
            $newTotalRecord
        );
        
        self::$messages = array_merge(
        	self::$messages, 
        	["\t\t\tpak/implementasi/verifikasi/destroy/". $data['verifikasi_id'] . " ...passed"]
        );
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t------------------------------------------------"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKImplementasi_for_verification_test
     */
    public function test_create_PAKImplementasiVerifikasi_for_verification_attachment_test($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/implementasi/verifikasi/create',
            [
                'json' => [
                    "implementasi_id" => $data['implementasi_id'],
                    "questionnaire_id" => $data['questionnaire_id'],
                    "nilai_verifikasi" => 60
                ],
                '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 implementasi/verifikasi/create"
        );

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

        /*self::$messages = array_merge(
            self::$messages, 
            ["\t\t\t --- create new verification #" . $data['verifikasi_id'] . " ---"]
        );*/

        return $data;
    }

    /**
     * @depends test_create_PAKImplementasiVerifikasi_for_verification_attachment_test
     */
    public function test_upload_PAKImplementasiVerikasiAttachment($data)
    {
        $filename = 'test.pdf';
        $filepath = dirname(__FILE__).'/sample-files/'.$filename;

        $response = $this->client->request(
            'POST', 
            'pak/implementasi/attachmentverifikasi/upload',
            [
                'multipart' => [
                    [
                        'name'     => 'file',
                        'contents' => fopen($filepath, 'r'),
                        'headers'  => ['Content-Type' => 'application/pdf']
                    ],
                ],
                '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 implementasi/attachmentverifikasi/upload"
        );

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

        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/implementasi/attachmentverifikasi/upload ...passed"]
        );

        return $data;
    }

    /**
     *  @depends test_upload_PAKImplementasiVerikasiAttachment
     */
    public function test_index_PAKImplementasiVerifikasiAttachment($data)
    {
        $response = $this->client->request(
            'GET', 
            'pak/implementasi/attachmentverifikasi/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 implementasi/attachmentverifikasi/index"
        );
        
        $data['initialTotalRecordPAKImplementasiVerifikasiAttachment'] = $jsonResponse['data']['total_record'];
        
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/implementasi/attachmentverifikasi/index total_record: " . $data['initialTotalRecordPAKImplementasiVerifikasiAttachment'] . " ...passed"]
        );

        return $data;
    }

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

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

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

    /**
     * @depends test_index_PAKImplementasiVerifikasiAttachment
     */
    public function test_create_PAKImplementasiVerifikasiAttachment($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/implementasi/attachmentverifikasi/create',
            [
                'json' => [
                    "verifikasi_id" => $data['verifikasi_id'],
                    "attachment_id" => $data['attachment_id'],
                    "jenis_dokumen_id" => $data['document_id'],
                    "tahun"=>2020,
                    "nomor"=>"14",
                    "tentang"=>"Implementasi PAK",
                    "tanggal_ttd"=>"2020-10-10 00:00:00"
                ],
                '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 implementasi/attachmentverifikasi/create"
        );

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

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

        return $data;
    }

    /**
     * @depends test_create_PAKImplementasiVerifikasiAttachment
     */
    public function test_view_PAKImplementasiVerifikasiAttachment($data)
    {
        $response = $this->client->request(
            'GET', 
            'pak/implementasi/attachmentverifikasi/view/' . $data['verifikasiAttachment_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 implementasi/attachmentverifikasi/view"
        );
        
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/implementasi/attachmentverifikasi/view/" . $data['verifikasiAttachment_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKImplementasiVerifikasiAttachment
     */
    public function test_update_PAKImplementasiVerifikasiAttachment($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/implementasi/attachmentverifikasi/update/' . $data['verifikasiAttachment_id'],
            [
                'json' => [
                    "verifikasi_id" => $data['verifikasi_id'],
                    "attachment_id" => $data['attachment_id'],
                    "jenis_dokumen_id" => $data['document_id'],
                    "tahun"=>2020,
                    "nomor"=>"14",
                    "tentang"=>"Implementasi PAK Edited",
                    "tanggal_ttd"=>"2020-10-10 00:00:00"
                ],
                '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 implementasi/attachmentverifikasi/update"
        );
        
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/implementasi/attachmentverifikasi/update/" . $data['verifikasiAttachment_id'] . " ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKImplementasiVerifikasiAttachment
     */
    public function test_delete_PAKImplementasiVerifikasiAttachment($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/implementasi/attachmentverifikasi/delete/' . $data['verifikasiAttachment_id'],
            [
                'json' => [
                    'id' => $data['verifikasiAttachment_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 implementasi/attachmentverifikasi/delete"
        );

        $newTotalRecord = $this->getTotalRecordsPAKImplementasiVerifikasiAttachment($data);
        $this->assertEquals(
            $data['initialTotalRecordPAKImplementasiVerifikasiAttachment'], 
            $newTotalRecord
        );

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

        return $data;
    }

    /**
     * @depends test_create_PAKImplementasiVerifikasiAttachment
     */
    public function test_all_PAKImplementasiVerifikasiAttachment_should_give_initial_total_records_plus_one($data)
    {
        $response = $this->client->request(
            'GET', 
            'pak/implementasi/attachmentverifikasi/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 implementasi/attachmentverifikasi/all"
        );

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

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

        return $data;
    }

    /**
     * @depends test_create_PAKImplementasiVerifikasiAttachment
     */
    public function test_restore_PAKImplementasiVerifikasiAttachment($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/implementasi/attachmentverifikasi/restore/' . $data['verifikasiAttachment_id'],
            [
                'json' => [
                    'id' => $data['verifikasiAttachment_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 implementasi/attachmentverifikasi/restore"
        );
        
        $newTotalRecord = $this->getTotalRecordsPAKImplementasiVerifikasiAttachment($data);
        $this->assertGreaterThan(
            $data['initialTotalRecordPAKImplementasiVerifikasiAttachment'], 
            $newTotalRecord
        );

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

        return $data;
    }

    /**
     * @depends test_restore_PAKImplementasiVerifikasiAttachment
     */
    public function test_destroy_PAKImplementasiVerifikasiAttachment($data)
    {
        $response = $this->client->request(
            'POST', 
            'pak/implementasi/attachmentverifikasi/destroy/' . $data['verifikasiAttachment_id'],
            [
                'json' => [
                    'id' => $data['verifikasiAttachment_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 implementasi/attachmentverifikasi/destroy"
        );

        $newTotalRecord = $this->getTotalRecordsPAKImplementasiVerifikasiAttachment($data);
        $this->assertEquals(
            $data['initialTotalRecordPAKImplementasiVerifikasiAttachment'], 
            $newTotalRecord
        );
        
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t\tpak/implementasi/attachmentverifikasi/destroy/". $data['verifikasiAttachment_id'] . " ...passed"]
        );
        self::$messages = array_merge(
            self::$messages, 
            ["\t\t------------------------------------------------"]
        );

        return $data;
    }

    private function testLoginUserDinas()
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n\n\t\t---Test Verifikasi Implementasi PAK---"]
        );

        $response = $this->client->request(
            'POST',
            'auth/login',
            [
                'json' => [
                    'username' => $this->userDinas,
                    '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;
    }

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

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            $startMessage . " ...failed"
        );

        self::$messages = array_merge(
            self::$messages,
            [$startMessage." [" . $jsonResponse['data']['user_id']. "] ...passed"]
        );

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

    private function loginUserDinas()
    {
        return self::doLogin($this->userDinas, "loginUserDinas");
    }

    private function loginUserVerifikator()
    {
        return self::doLogin($this->userVerifikator, "loginUserVerifikator");
    }

    private function uploadPAKImplementasiAttachment(&$data) {
        $filename = 'test.pdf';
        $filepath = dirname(__FILE__).'/sample-files/'.$filename;

        $response = $this->client->request(
            'POST',
            'pak/implementasi/attachment/upload',
            [
                'multipart' => [
                    [
                        'name'     => 'file',
                        'contents' => fopen($filepath, 'r'),
                        'headers'  => ['Content-Type' => 'application/pdf']
                    ],
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "uploadPAKImplementasiAttachment ...failed"
        );

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

        self::$messages = array_merge(
            self::$messages,
            ["uploadPAKImplementasiAttachment ...passed"]
        );

        return $data;
    }

    private function submitPAKImplementasi(&$data) {
        $response = $this->client->request(
            'POST',
            'pak/implementasi/create-and-submit',
            [
                'json' => [
                    "verifications" => [
                        [
                            "questionnaire_id" => $data['questionnaire_id'],
                            "attachment" => [
                                [
                                    "jenis_dokumen_id" => $data['document_id'],
                                    "nomor" => "01",
                                    "tahun" => "2021",
                                    "tentang" => "Implementasi PAK via PHPUnit",
                                    "tanggal_ttd" => date('Y-m-d'),
                                    "attachment_id" => $data['attachment_id']
                                ]
                            ]
                        ]
                    ]
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "submitPAKImplementasi ...passed"
        );

        $data['implementasi_id'] = $jsonResponse['data']['result'][0]['id'];
        $data['verifikasi_id'] = $jsonResponse['data']['result'][0]['verifications'][0]['id'];

        self::$messages = array_merge(
            self::$messages,
            ["submitPAKImplementasi ...passed"]
        );

        return $data;
    }

    /**
     * @depends test_create_PAKJenisDokumenQuestionnaire_for_verification_test
     * @param $data
     * @return mixed
     */
    public function testCreateAndSubmitPAKImplementasi(&$data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Create And Submit PAK Implementasi---"]
        );

        $data['token'] = $this->loginUserDinas();
        $data = $this->uploadPAKImplementasiAttachment($data);
        self::submitPAKImplementasi($data);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Create And Submit PAK Implementasi---"]
        );

        return $data;
    }

    /**
     * @depends testCreateAndSubmitPAKImplementasi
     * @param $data
     */
    public function testReturnedPAKImplementasi(&$data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Returned PAK Implementasi---"]
        );

        $data['token'] = $this->loginUserVerifikator();
        $response = $this->client->request(
            'POST',
            'pak/implementasi/returned',
            [
                'json' => [
                    'verifikasi_id' => $data['verifikasi_id']
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "returnedPAKImplementasi ...passed"
        );
        self::$messages = array_merge(
            self::$messages,
            ["returnedPAKImplementasi ...passed"]
        );

        self::$messages = array_merge(
            self::$messages,
            ["--- End Returned PAK Implementasi---"]
        );

        return $data;
    }

    /**
     * @depends testReturnedPAKImplementasi
     * @param $data
     * @return mixed
     * @throws GuzzleException
     */
    public function testUpdateAndSubmitPAKImplementasi(&$data) {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Update And Submit PAK Implementasi---"]
        );

        $data['token'] = $this->loginUserDinas();
        $response = $this->client->request(
            'POST',
            'pak/implementasi/update-and-submit/' . $data['implementasi_id'],
            [
                'json' => [
                    "id" => $data['implementasi_id'],
                    "verifications" => [
                        [
                            "questionnaire_id" => $data['questionnaire_id'],
                            "attachment" => [
                                [
                                    "attachment_id" => $data['attachment_id']
                                ]
                            ]
                        ]
                    ]
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "updatePAKImplementasi ...passed"
        );

        $data['implementasi_id'] = $jsonResponse['data']['result'][0]['id'];
        $data['verifikasi_id'] = $jsonResponse['data']['result'][0]['verifications'][0]['id'];

        self::$messages = array_merge(
            self::$messages,
            ["updatePAKImplementasi ...passed"]
        );

        self::$messages = array_merge(
            self::$messages,
            ["--- End Update And Submit PAK Implementasi---"]
        );
        return $data;
    }

    /**
     * @depends testUpdateAndSubmitPAKImplementasi
     * @param $data
     */
    public function testVerifyPAKImplementasi(&$data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Verify PAK Implementasi---"]
        );

        $data['token'] = $this->loginUserVerifikator();
        $response = $this->client->request(
            'POST',
            'pak/implementasi/batch-verify',
            [
                'json' => [
                    "verifications" => [
                        [
                            "nilai_verifikasi" => 50,
                            "verifikasi_id" => $data['verifikasi_id']
                        ]
                    ]
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "verifyPAKImplementasi ...passed"
        );

        self::$messages = array_merge(
            self::$messages,
            ["verifyPAKImplementasi ...passed"]
        );

        self::$messages = array_merge(
            self::$messages,
            ["--- End Verify PAK Implementasi---"]
        );
    }
}

?>