<?php

require_once "ABaseTest.php";
class KeluhanFlowTest extends BaseTest {
    private $pengguna = 'user3@mail.com';
    private $adminbansos = 'superuser';
    private $adminkorwil = 'admin.bansos.korwil';
    private $adminklop = 'USER.DAGRI';
    private $adminpemda = 'kab.maluku.tenggara';
    private $namapemda = 'Kab. Maluku Tenggara';
    private $password = 'password12345';
    private $password2 = 'qwe';

    /**
     * Keluhan Kampus
     */
    private $instansiIdKampus = 20113;
    private $namaKampus = 'Universitas Indonesia';
    private $instansiIdItjenDikbud = 20188;
    private $namaItjenDikbud = 'Inspektorat Jenderal Kemendikbudristek';
    private $adminkampus = 'univ.indonesia';
    private $adminklopkampus = 'adm.keluhan.kampus';

    const URL_LOGIN = 'auth/login';
    const URL_SUBMIT = 'bansos/report';
    //const URL_CONFIRM = 'diskusi/komentar/kirim';
    //const URL_FOLLOWUP = 'diskusi/komentar/kirim';
    const URL_CONFIRM = 'keluhan/status/update';
    const URL_FOLLOWUP = 'keluhan/status/update';
    const URL_RETRIEVE1 = 'diskusi/detil_bansos/';
    const URL_RETRIEVE2 = 'bansos/history?limit=99&offset=0&id_diskusi_bansos=';

    /**
     * Keluhan status
     */
    const NEW = 1;
    const CONFIRMED = 2;
    const ON_PROGRESS = 3;
    const DONE = 4;
    const CLOSED = 5;
    const NO_RESPONSE = 6;
    const CONFIRMED_TO_INSTANSI = 20;
    const CONFIRMED_TO_KEMENDAGRI = 27;
    const CONFIRMED_TO_ITJENDIKBUD = 28;
    const DONE_BY_VERIFIKATOR = 40;

    #region keluhan IKN 1
//    scenario keluhan IKN ke kemendagri (1)
//    1. pengguna login
//    2. pengguna submit keluhan IKN
//    3. keluhan IKN diteruskan oleh Admin Bansos Korwil ke kemendagri
//    4. user kemendagri mengubah status keluhan menjadi CONFIRMED (ditindaklanjuti)
//    5. user kemendagri mengubah status keluhan menjadi DONE (selesai)
    public function testLoginPengguna_1()
    {
        $data = array();
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->pengguna,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on testLoginPengguna_1"
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses User Pelapor [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginPengguna_1
     */
    public function testSubmit_1($data) {
        $response = $this->client->request('POST', self::URL_SUBMIT,
            [
                'multipart' => [
                    [
                        'name' => 'produk_id',
                        'contents' => '9',
                    ],
                    [
                        'name' => 'id_topik',
                        'contents' => 17,
                    ],
                    [
                        'name' => 'objek_id',
                        'contents' => 20001,
                    ],
                    [
                        'name' => 'nama_objek',
                        'contents' => 'Kementerian Dalam Negeri',
                    ],
                    [
                        'name' => 'id_instansi',
                        'contents' => 20001,
                    ],
                    [
                        'name' => 'judul',
                        'contents' => 'Keluhan Unit Test IKN - Kemendagri',
                    ],
                    [
                        'name' => 'konten_diskusi',
                        'contents' => 'Keluhan Anggaran IKN oleh pengguna ' . $this->pengguna . ' untuk Kemendagri',
                    ],
                    [
                        'name' => 'link_terkait',
                        'contents' => '-',
                    ],
                    [
                        'name' => 'nik',
                        'contents' => '1234123412341234, 0',
                    ],
                    [
                        'name' => 'phone',
                        'contents' => '081212341234',
                    ],
                    [
                        'name' => 'is_anonymous',
                        'contents' => 0,
                    ],
                ],
                '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 testSubmit_1"
        );
        $diskusiId = $jsonResponse['data']['diskusi_id'];
        $diskusiUuid = $jsonResponse['data']['diskusi_uuid'];
        $this->doCheckKeluhanStatus($diskusiUuid, self::NEW);
        self::$messages = array_merge(self::$messages, ["Submit Keluhan Berhasil | ID : [" . $diskusiId . "]"]);
        $data['diskusi_id'] = $diskusiId;
        $data['diskusi_uuid'] = $diskusiUuid;

        return $data;
    }

    /**
     * @depends testSubmit_1
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testLoginAdminKorwil_1($data) {
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->adminkorwil,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on testLoginAdminKorwil_1"
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses Admin Korwil [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginAdminKorwil_1
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testConfirm_1($data) {
        $response = $this->client->request('POST', self::URL_CONFIRM,
            [
                'multipart' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan diteruskan Unit Test ke Instansi terkait',
                    'confirm_assigned_status' => 20,
                ],
                '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 testConfirm_1"
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::CONFIRMED);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil diteruskan ke instansi terkait"]);

        return $data;
    }

    /**
     * @depends testConfirm_1
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testLoginAdminKlop_1($data) {
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->adminklop,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on testLoginAdminKlop_1"
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses Admin KLOP [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginAdminKlop_1
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testOnprogress_1($data) {
        $response = $this->client->request('POST', self::URL_FOLLOWUP,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan ditindaklanjuti Unit Test oleh Instansi terkait',
                    'follow_up_status' => 3,
                ],
                '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 testOnprogress_1"
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::ON_PROGRESS);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil ditindaklanjuti oleh instansi terkait"]);

        return $data;
    }

    /**
     * @depends testOnprogress_1
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testDone_1($data) {
        $response = $this->client->request('POST', self::URL_FOLLOWUP,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan telah diselesaikan Unit Test oleh Instansi terkait',
                    'follow_up_status' => 4,
                ],
                '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 testDone_1"
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::DONE);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil diselesaikan oleh instansi terkait"]);

        return $data;
    }
    #endregion

    #region keluhan DESA 2
//    scenario keluhan DESA ke kemendagri (2)
//    1. pengguna login
//    2. pengguna submit keluhan IKN
//    3. keluhan IKN diteruskan oleh Admin Bansos Korwil ke kemendagri
//    4. user kemendagri mengubah status keluhan menjadi CONFIRMED (ditindaklanjuti)
//    5. user kemendagri mengubah status keluhan menjadi DONE (selesai)
    public function testLoginPengguna_2()
    {
        $data = array();
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->pengguna,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on testLoginPengguna_2"
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses User Pelapor [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginPengguna_2
     */
    public function testSubmit_2($data) {
        $response = $this->client->request('POST', self::URL_SUBMIT,
            [
                'multipart' => [
                    [
                        'name' => 'produk_id',
                        'contents' => '9',
                    ],
                    [
                        'name' => 'id_topik',
                        'contents' => 22,
                    ],
                    [
                        'name' => 'objek_id',
                        'contents' => 51177,
                    ],
                    [
                        'name' => 'nama_objek',
                        'contents' => 'Tuburlay',
                    ],
                    [
                        'name' => 'id_instansi',
                        'contents' => 0,
                    ],
                    [
                        'name' => 'judul',
                        'contents' => 'Keluhan Unit Test Desa Pengadaan Sarana dan Prasarana Desa ' . date('d-m-Y H:i:s'),
                    ],
                    [
                        'name' => 'konten_diskusi',
                        'contents' => 'Keluhan Pengadaan Sarana dan Prasarana Desa oleh pengguna ' . $this->pengguna . ' untuk Kemendagri',
                    ],
                    [
                        'name' => 'link_terkait',
                        'contents' => '-',
                    ],
                    [
                        'name' => 'nik',
                        'contents' => '1234123412341234, 0',
                    ],
                    [
                        'name' => 'phone',
                        'contents' => '081212341234',
                    ],
                    [
                        'name' => 'is_anonymous',
                        'contents' => 0,
                    ],
                ],
                '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 testSubmit_2"
        );
        $diskusiId = $jsonResponse['data']['diskusi_id'];
        $diskusiUuid = $jsonResponse['data']['diskusi_uuid'];
        $this->doCheckKeluhanStatus($diskusiUuid, self::NEW);
        self::$messages = array_merge(self::$messages, ["Submit Keluhan Berhasil | ID : [" . $diskusiId . "]"]);
        $data['diskusi_id'] = $diskusiId;
        $data['diskusi_uuid'] = $diskusiUuid;

        return $data;
    }

    /**
     * @depends testSubmit_2
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testLoginAdminKorwil_2($data) {
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->adminkorwil,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on testLoginAdminKorwil_2"
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses Admin Korwil [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginAdminKorwil_2
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testConfirm_2($data) {
        $filename = 'test.pdf';
        $filepath = dirname(__FILE__) . '/sample-files/' . $filename;
        $response = $this->client->request('POST', self::URL_CONFIRM,
            [
                'multipart' => [
                    [
                        'name' => 'diskusi_id',
                        'contents' => $data['diskusi_id'],
                    ],
                    [
                        'name' => 'komentar',
                        'contents' => 'Keluhan diteruskan Unit Test ke Kemendagri',
                    ],
                    [
                        'name' => 'confirm_all_status',
                        'contents' => self::CONFIRMED_TO_KEMENDAGRI,
                    ],
                    [
                        'name'     => 'file',
                        'contents' => fopen($filepath, 'r'),
                        'headers'  => ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']
                    ],
                ],
                '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 testConfirm_2"
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::CONFIRMED);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil diteruskan ke Kemendagri"]);

        return $data;
    }

    /**
     * @depends testConfirm_2
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testLoginAdminKlop_2($data) {
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->adminklop,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on testLoginAdminKlop_1"
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses Admin KLOP [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginAdminKlop_2
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testOnprogress_2($data) {
        $response = $this->client->request('POST', self::URL_FOLLOWUP,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan ditindaklanjuti Unit Test oleh Instansi terkait',
                    'follow_up_status' => 3,
                ],
                '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 testOnprogress_2"
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::ON_PROGRESS);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil ditindaklanjuti oleh instansi terkait"]);

        return $data;
    }

    /**
     * @depends testOnprogress_2
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testDone_2($data) {
        $response = $this->client->request('POST', self::URL_FOLLOWUP,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan telah diselesaikan Unit Test oleh Instansi terkait',
                    'follow_up_status' => 4,
                ],
                '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 testDone_2"
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::DONE);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil diselesaikan oleh instansi terkait"]);

        return $data;
    }
    #endregion

    #region keluhan DESA 3
//    scenario keluhan DESA ke inspektorat kabupaten (3)
//    1. pengguna login
//    2. pengguna submit keluhan IKN
//    3. keluhan IKN diteruskan oleh Admin Bansos Korwil ke Pemda Kab. Maluku Tenggara
//    4. user Pemda Kab. Maluku Tenggara mengubah status keluhan menjadi CONFIRMED (ditindaklanjuti)
//    5. user Pemda Kab. Maluku Tenggara mengubah status keluhan menjadi DONE (selesai)
    public function testLoginPengguna_3()
    {
        $data = array();
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->pengguna,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on testLoginPengguna_3"
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses User Pelapor [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginPengguna_3
     */
    public function testSubmit_3($data) {
        $response = $this->client->request('POST', self::URL_SUBMIT,
            [
                'multipart' => [
                    [
                        'name' => 'produk_id',
                        'contents' => '9',
                    ],
                    [
                        'name' => 'id_topik',
                        'contents' => 22,
                    ],
                    [
                        'name' => 'objek_id',
                        'contents' => 51177,
                    ],
                    [
                        'name' => 'nama_objek',
                        'contents' => 'Tuburlay',
                    ],
                    [
                        'name' => 'id_instansi',
                        'contents' => 0,
                    ],
                    [
                        'name' => 'judul',
                        'contents' => 'Keluhan Unit Test Desa Pengadaan Sarana dan Prasarana Desa',
                    ],
                    [
                        'name' => 'konten_diskusi',
                        'contents' => 'Keluhan Pengadaan Sarana dan Prasarana Desa oleh pengguna ' . $this->pengguna . ' untuk ' . $this->namapemda,
                    ],
                    [
                        'name' => 'link_terkait',
                        'contents' => '-',
                    ],
                    [
                        'name' => 'nik',
                        'contents' => '1234123412341234, 0',
                    ],
                    [
                        'name' => 'phone',
                        'contents' => '081212341234',
                    ],
                    [
                        'name' => 'is_anonymous',
                        'contents' => 0,
                    ],
                ],
                '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 testSubmit_3"
        );
        $diskusiId = $jsonResponse['data']['diskusi_id'];
        $diskusiUuid = $jsonResponse['data']['diskusi_uuid'];
        $this->doCheckKeluhanStatus($diskusiUuid, self::NEW);
        self::$messages = array_merge(self::$messages, ["Submit Keluhan Berhasil | ID : [" . $diskusiId . "]"]);
        $data['diskusi_id'] = $diskusiId;
        $data['diskusi_uuid'] = $diskusiUuid;

        return $data;
    }

    /**
     * @depends testSubmit_3
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testLoginAdminKorwil_3($data) {
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->adminkorwil,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on testLoginAdminKorwil_3"
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses Admin Korwil [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginAdminKorwil_3
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testConfirm_3($data) {
        $response = $this->client->request('POST', self::URL_CONFIRM,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan diteruskan Unit Test ke ' . $this->namapemda,
                    'confirm_all_status' => self::CONFIRMED_TO_INSTANSI,
                ],
                '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 testConfirm_3"
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::CONFIRMED);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil diteruskan ke " . $this->namapemda]);

        return $data;
    }

    /**
     * @depends testConfirm_3
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testLoginAdminKlop_3($data) {
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->adminpemda,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on testLoginAdminKlop_1"
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses Admin Pemda [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginAdminKlop_3
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testOnprogress_3($data) {
        $response = $this->client->request('POST', self::URL_FOLLOWUP,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan ditindaklanjuti Unit Test oleh ' . $this->namapemda,
                    'follow_up_status' => 3,
                ],
                '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 testOnprogress_3"
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::ON_PROGRESS);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil ditindaklanjuti oleh " . $this->namapemda]);

        return $data;
    }

    /**
     * @depends testOnprogress_3
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testDone_3($data) {
        $response = $this->client->request('POST', self::URL_FOLLOWUP,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan telah diselesaikan Unit Test oleh ' . $this->namapemda,
                    'follow_up_status' => 4,
                ],
                '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 testDone_3"
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::DONE);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil diselesaikan oleh " . $this->namapemda]);

        return $data;
    }
    #endregion

    #region keluhan KAMPUS 4
//    scenario keluhan KAMPUS Diteruskan ke Perguruan Tinggi (4)
//    1. pengguna login
//    2. pengguna submit keluhan KAMPUS
//    3. keluhan KAMPUS diteruskan oleh Admin Bansos ke Perguruan Tinggi terkait
    public function testLoginPengguna_4()
    {
        $data = array();
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->pengguna,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on testLoginPengguna_4"
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses User Pelapor [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginPengguna_4
     */
    public function testSubmit_4($data) {
        $response = $this->client->request('POST', self::URL_SUBMIT,
            [
                'multipart' => [
                    [
                        'name' => 'produk_id',
                        'contents' => '9',
                    ],
                    [
                        'name' => 'id_topik',
                        'contents' => 26,
                    ],
                    [
                        'name' => 'objek_id',
                        'contents' => $this->instansiIdKampus,
                    ],
                    [
                        'name' => 'nama_objek',
                        'contents' => $this->namaKampus,
                    ],
                    [
                        'name' => 'id_instansi',
                        'contents' => $this->instansiIdKampus,
                    ],
                    [
                        'name' => 'judul',
                        'contents' => 'Keluhan Unit Test Kampus - Program Indonesia Pintar',
                    ],
                    [
                        'name' => 'konten_diskusi',
                        'contents' => 'Keluhan Kampus - Program Indonesia Pintar oleh pengguna ' . $this->pengguna . ' untuk ' . $this->namaKampus,
                    ],
                    [
                        'name' => 'link_terkait',
                        'contents' => '-',
                    ],
                    [
                        'name' => 'nik',
                        'contents' => '1234123412341234, 0',
                    ],
                    [
                        'name' => 'phone',
                        'contents' => '081212341234',
                    ],
                    [
                        'name' => 'is_anonymous',
                        'contents' => 0,
                    ],
                ],
                '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 testSubmit_4"
        );
        $diskusiId = $jsonResponse['data']['diskusi_id'];
        $diskusiUuid = $jsonResponse['data']['diskusi_uuid'];
        $this->doCheckKeluhanStatus($diskusiUuid, self::NEW);
        self::$messages = array_merge(self::$messages, ["Submit Keluhan Berhasil | ID : [" . $diskusiId . "]"]);
        $data['diskusi_id'] = $diskusiId;
        $data['diskusi_uuid'] = $diskusiUuid;

        return $data;
    }

    /**
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @depends testSubmit_4
     */
    public function testLoginAdminKeluhan_4($data) {
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->adminbansos,
                    'password' => $this->password2
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses Admin Keluhan [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @depends testLoginAdminKeluhan_4
     */
    public function testConfirm_4($data) {
        $response = $this->client->request('POST', self::URL_CONFIRM,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan diteruskan Unit Test ke ' . $this->namaKampus,
                    'confirm_all_status' => self::CONFIRMED_TO_INSTANSI,
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        $uuid = $data['diskusi_uuid'];
        $this->doCheckKeluhanStatus($uuid, self::CONFIRMED);
        $this->doCheckKeluhanInstansi($uuid, $this->instansiIdKampus);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil diteruskan ke " . $this->namaKampus]);

        return $data;
    }

    /**
     * @depends testConfirm_4
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testLoginAdminKampus_4($data) {
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->adminkampus,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses Admin Kampus [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginAdminKampus_4
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testOnprogress_4($data) {
        $response = $this->client->request('POST', self::URL_FOLLOWUP,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan ditindaklanjuti Unit Test oleh ' . $this->namaKampus,
                    'follow_up_status' => 3,
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::ON_PROGRESS);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil ditindaklanjuti oleh " . $this->namaKampus]);

        return $data;
    }

    /**
     * @depends testOnprogress_4
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testDone_4($data) {
        $response = $this->client->request('POST', self::URL_FOLLOWUP,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan telah diselesaikan Unit Test oleh ' . $this->namaKampus,
                    'follow_up_status' => 4,
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::DONE);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil diselesaikan oleh " . $this->namaKampus]);

        return $data;
    }
    #endregion

    #region keluhan KAMPUS 5
//    scenario keluhan KAMPUS Diteruskan ke Inspektorat Jenderal Kemendikbudristek(5)
//    1. pengguna login
//    2. pengguna submit keluhan KAMPUS
//    3. keluhan KAMPUS diteruskan oleh Admin Bansos ke Inspektorat Jenderal Kemendikbudristek
    public function testLoginPengguna_5()
    {
        $data = array();
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->pengguna,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses User Pelapor [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginPengguna_5
     */
    public function testSubmit_5($data) {
        $response = $this->client->request('POST', self::URL_SUBMIT,
            [
                'multipart' => [
                    [
                        'name' => 'produk_id',
                        'contents' => '9',
                    ],
                    [
                        'name' => 'id_topik',
                        'contents' => 26,
                    ],
                    [
                        'name' => 'objek_id',
                        'contents' => $this->instansiIdKampus,
                    ],
                    [
                        'name' => 'nama_objek',
                        'contents' => $this->namaKampus,
                    ],
                    [
                        'name' => 'id_instansi',
                        'contents' => $this->instansiIdKampus,
                    ],
                    [
                        'name' => 'judul',
                        'contents' => 'Keluhan Unit Test Kampus - Program Indonesia Pintar',
                    ],
                    [
                        'name' => 'konten_diskusi',
                        'contents' => 'Keluhan Kampus - Program Indonesia Pintar oleh pengguna ' . $this->pengguna . ' untuk Universitas Gadjah Mada',
                    ],
                    [
                        'name' => 'link_terkait',
                        'contents' => '-',
                    ],
                    [
                        'name' => 'nik',
                        'contents' => '1234123412341234, 0',
                    ],
                    [
                        'name' => 'phone',
                        'contents' => '081212341234',
                    ],
                    [
                        'name' => 'is_anonymous',
                        'contents' => 0,
                    ],
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        $diskusiId = $jsonResponse['data']['diskusi_id'];
        $diskusiUuid = $jsonResponse['data']['diskusi_uuid'];
        $this->doCheckKeluhanStatus($diskusiUuid, self::NEW);
        self::$messages = array_merge(self::$messages, ["Submit Keluhan Berhasil | ID : [" . $diskusiId . "]"]);
        $data['diskusi_id'] = $diskusiId;
        $data['diskusi_uuid'] = $diskusiUuid;

        return $data;
    }

    /**
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @depends testSubmit_5
     */
    public function testLoginAdminKeluhan_5($data) {
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->adminbansos,
                    'password' => $this->password2
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on testLoginAdminKeluhan_4"
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses Admin Keluhan [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @depends testLoginAdminKeluhan_5
     */
    public function testConfirm_5($data) {
        $status = self::CONFIRMED_TO_ITJENDIKBUD;
        $response = $this->client->request('POST', self::URL_CONFIRM,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan diteruskan Unit Test ke ' . $this->namaItjenDikbud,
                    'confirm_all_status' => $status,
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        $uuid = $data['diskusi_uuid'];
        $this->doCheckKeluhanStatus($uuid, self::CONFIRMED);
        $this->doCheckKeluhanInstansi($uuid, $this->instansiIdItjenDikbud);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil diteruskan ke " . $this->namaItjenDikbud]);

        return $data;
    }

    /**
     * @depends testConfirm_5
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testLoginAdminKlop_5($data) {
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->adminklopkampus,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses Admin KLOP Kampus [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginAdminKlop_5
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testOnprogress_5($data) {
        $response = $this->client->request('POST', self::URL_FOLLOWUP,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan ditindaklanjuti Unit Test oleh ' . $this->namaItjenDikbud,
                    'follow_up_status' => 3,
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::ON_PROGRESS);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil ditindaklanjuti oleh " . $this->namaItjenDikbud]);

        return $data;
    }

    /**
     * @depends testOnprogress_5
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testDone_5($data) {
        $response = $this->client->request('POST', self::URL_FOLLOWUP,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan telah diselesaikan Unit Test oleh ' . $this->namaItjenDikbud,
                    'follow_up_status' => 4,
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        $this->doCheckKeluhanStatus($data['diskusi_uuid'], self::DONE);
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil diselesaikan oleh " . $this->namaItjenDikbud]);

        return $data;
    }
    #endregion

    #region keluhan PELABUHAN 6
    // scenario keluhan PELABUHAN
    // Diteruskan ke Instansi Terkait
    public function testLoginPengguna_6()
    {
        $data = array();
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->pengguna,
                    'password' => $this->password
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses User Pelapor [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /** @depends testLoginPengguna_6 */
    public function testSubmit_6($data) {
        $topics = $this->client->request(
            'GET',
            'bansos/list_topik?topik_type=PELABUHAN',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );
        $topics = json_decode($topics->getBody(), TRUE)['data']['result'];
        $topic = $topics[array_rand($topics, 1)];

        $instansis = $this->client->request(
            'GET',
            'bansos/pemda_list?keyword=pelabuhan&keluhan_type=PELABUHAN',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );
        $instansis = json_decode($instansis->getBody(), TRUE)['data']['result'];
        $instansi = $instansis[array_rand($instansis, 1)];

        $response = $this->client->request('POST', self::URL_SUBMIT,
            [
                'multipart' => [
                    [
                        'name' => 'produk_id',
                        'contents' => '9',
                    ],
                    [
                        'name' => 'id_topik',
                        'contents' => $topic['id_topik'],
                    ],
                    [
                        'name' => 'objek_id',
                        'contents' => $instansi['id_instansi'],
                    ],
                    [
                        'name' => 'nama_objek',
                        'contents' => $instansi['nama'],
                    ],
                    [
                        'name' => 'id_instansi',
                        'contents' => $instansi['id_instansi'],
                    ],
                    [
                        'name' => 'judul',
                        'contents' => 'Keluhan Pelabuhan ' . $topic['deskripsi'] . ' di ' . $instansi['nama'],
                    ],
                    [
                        'name' => 'konten_diskusi',
                        'contents' => 'Keluhan Pelabuhan ' . $topic['deskripsi'] . ' oleh pengguna ' . $this->pengguna . ' di ' . $instansi['nama'],
                    ],
                    [
                        'name' => 'link_terkait',
                        'contents' => '-',
                    ],
                    [
                        'name' => 'nik',
                        'contents' => '1234123412341234, 0',
                    ],
                    [
                        'name' => 'phone',
                        'contents' => '081212341234',
                    ],
                    [
                        'name' => 'is_anonymous',
                        'contents' => 0,
                    ],
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        $diskusiId = $jsonResponse['data']['diskusi_id'];
        $diskusiUuid = $jsonResponse['data']['diskusi_uuid'];
        $this->doCheckKeluhanStatus($diskusiUuid, self::NEW);
        self::$messages = array_merge(self::$messages, ["Submit Keluhan Berhasil | ID : [" . $diskusiId . "]"]);
        $data['diskusi_id'] = $diskusiId;
        $data['diskusi_uuid'] = $diskusiUuid;
        $data['topic'] = $topic;
        $data['instansi'] = $instansi;

        return $data;
    }

    /**
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @depends testSubmit_6
     */
    public function testLoginAdminKeluhan_6($data) {
        $response = $this->client->request('POST', self::URL_LOGIN,
            [
                'json' => [
                    'username' => $this->adminbansos,
                    'password' => $this->password2
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on testLoginAdminKeluhan_6"
        );
        self::$messages = array_merge(self::$messages, ["\nLogin Sukses Admin Keluhan [" . $jsonResponse['data']['user_id'] . "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @depends testLoginAdminKeluhan_6
     */
    public function testConfirm_6($data) {
        $confirmOptions = $this->client->request(
            'GET',
            'topik-keluhan/confirm-options/pelabuhan/'.$data['topic']['id_topik'].'?id_instansi='.$data['instansi']['id_instansi'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );
        $confirmOptions = json_decode($confirmOptions->getBody(), TRUE)['data'];
        $confirmOption = $confirmOptions[0];
        $status = $confirmOption['value'];

        $response = $this->client->request('POST', self::URL_CONFIRM,
            [
                'json' => [
                    'diskusi_id' => $data['diskusi_id'],
                    'komentar' => 'Keluhan diteruskan ke ' . $confirmOption['label'],
                    'confirm_all_status' => $status,
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        self::$messages = array_merge(self::$messages, ["Keluhan Berhasil diteruskan ke " . $confirmOption['label']]);

        return $data;
    }
    #endregion

    #region private function
    private function doCheckKeluhanStatus($uuid, $status) {
        // create request to get id_diskusi_bansos by diskusi uuid
        $response = $this->client->request('GET', self::URL_RETRIEVE1 . $uuid);
        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on doCheckKeluhanStatus"
        );
        $idDiskusiBansos = $jsonResponse['data']['result'][0]['id_diskusi_bansos'];

        // create request to get detail diskusi bansos by id_diskusi_bansos
        $response = $this->client->request('GET', self::URL_RETRIEVE2 . $idDiskusiBansos);
        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "Error on doCheckKeluhanStatus"
        );
        $result = $jsonResponse['data']['result'];
        $this->assertEquals($status, $result[sizeof($result) - 1]['status']);
    }

    private function doCheckKeluhanInstansi($uuid, $instansiId) {
        // create request to get id_diskusi_bansos by diskusi uuid
        $response = $this->client->request('GET', self::URL_RETRIEVE1 . $uuid);
        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        $result = $jsonResponse['data']['result'][0];
        $this->assertEquals($instansiId, $result['id_instansi_diskusi_bansos']);
    }
    #endregion
}
