<?php
require_once 'ABaseTest.php';
class DiskusiStandardFlowTest extends BaseTest
{

    private $userNormal1 = 'user2154@mail.com'; //old Format
    // private $userNormal1 = 'user2179';
    // private $indexUserNormal1 = '2179';
    private $isNeedRegister = false;
    //Sesuaikan variabel di atas
    private $userNormal2 = 'user2155@mail.com';
    private $password = 'password12345';

    //Register User
    public function testRegister()
    {
        if($this->isNeedRegister) {
            $response = $this->client->request('POST', 'auth/register',
                [
                    'multipart' => [
                        [
                            'name' => 'username',
                            'contents' => $this->userNormal1,
                        ],
                        [
                            'name' => 'password',
                            'contents' => $this->password,
                        ],
                        [
                            'name' => 'nama',
                            'contents' => 'Nama User ' . $this->indexUserNormal1,
                        ],
                        [
                            'name' => 'tempat_lahir',
                            'contents' => 'Jakarta',
                        ],
                        [
                            'name' => 'tgl_lahir',
                            'contents' => '1994-11-19',
                        ],
                        [
                            'name' => 'email',
                            'contents' => $this->userNormal1 . '@mail.com',
                        ],
                        [
                            'name' => 'jenis_kelamin',
                            'contents' => 'L',
                        ],
                        [
                            'name' => 'phone',
                            'contents' => '08121234' . $this->indexUserNormal1,
                        ],
                    ]
                ]
            );

            $statusCode = $response->getStatusCode();
            $jsonResponse = json_decode($response->getBody(), TRUE);
            $this->assertEquals(200, $statusCode);
            $this->assertContains(
                [
                    'success' => true
                ],
                $jsonResponse,
                "Error on auth/register"
            );
            //$this->assertEquals(0, $jsonResponse['data']['total_record']);
            self::$messages = array_merge(self::$messages, ["\n\t\t\tRegister Berhasil User [" . $this->userNormal1 . "]"]);
        }
        else {
            $this->assertEquals(1, 1);
        }
    }

    #region Diskusi Umum (A)

    //Case Skenario #1
    // -> Login User 1
    // -> Create Diskusi
    // -> Cek Diskusi 
    // -> Komen Diskusi User 1
    // -> Login User 2
    // -> Komen Diskusi User 2
    
    public function testLoginA_1_1()
    {
        self::$messages = array_merge(self::$messages, ["\n\n\t\t---Test Diskusi Umum---"]);
        $response = $this->client->request('POST', 'auth/login',
            [
                'json' => [
                    'username' => $this->userNormal1,
                    '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"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tLogin Sukses User [" . $jsonResponse['data']['user_id']. "]"]);

        return [
            "token" => $jsonResponse['data']['token'],
            "user_id" => $jsonResponse['data']['user_id']
        ];
    }

    /**
     * @depends testLoginA_1_1
     */
    public function testSubmitDiskusiA_1($data)
    {
        $response = $this->client->request('POST', 'diskusi/submit',
            [
                'multipart' => [
                    [
                        'name' => 'produk_id',
                        'contents' => '1',
                    ],
                    [
                        'name' => 'judul',
                        'contents' => 'Tes Diskusi Umum dari TestUnit',
                    ],
                    [
                        'name' => 'is_anonymous',
                        'contents' => '0',
                    ],
                    [
                        'name' => 'konten_diskusi',
                        'contents' => 'Diskusi ini seharusnya umum',
                    ],
                    [
                        'name' => 'link_terkait',
                        'contents' => '',
                    ],
                    [
                        'name' => 'mentions',
                        'contents' => '',
                    ],
                    [
                        'name' => 'product_nama',
                        'contents' => 'Umum',
                    ],
                ],
                '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 diskusi/submit"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tSubmit Diskusi Umum Berhasil " . $jsonResponse['data']['diskusi_uuid']]);
        $data['diskusi_id'] = $jsonResponse['data']['diskusi_id'];
        $data['diskusi_uuid'] = $jsonResponse['data']['diskusi_uuid'];

        return $data;
    }

    /**
     * @depends testSubmitDiskusiA_1
     */
    public function testDetilDiskusiA_1($data)
    {
        $response = $this->client->request('GET', 'diskusi/detil/' . $data['diskusi_uuid'],
            [
                '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 diskusi/detil"
        );
        $this->assertGreaterThan(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tDiskusi Valid !!"]);

        return $data;
    }

    /**
     * @depends testDetilDiskusiA_1
     * returned $data = [
     *      "diskusi_id",
     *      "diskusi_uuid",
     *      "komentar" = ["komentar_id", "komentar", "uuid_user", "profile_picture_url"],
     *      "token",
     *      ...
     * ];
     */
    public function testKirimKomentarA_1_1($data)
    {
        $response = $this->client->request('POST', 'diskusi/komentar/kirim_attachment',
            [
                'multipart' => [
                    [
                        'name' => 'diskusi_id',
                        'contents' => $data['diskusi_id'],
                    ],
                    [
                        'name' => 'komentar',
                        'contents' => 'ini adalah sebuaah komentar dari testunit',
                    ],
                ],
                '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 komentar/kirim_attachment"
        );

        self::$messages = array_merge(self::$messages, ["\t\t\tKirim Komentar Berhasil " . $jsonResponse['data']['komentar_id']]);
        $data['komentar'] = $jsonResponse['data'];

        return $data;
    }

    /**
     * @depends testKirimKomentarA_1_1
     */
    public function testLoginA_1_2($data)
    {
        $response = $this->client->request('POST', 'auth/login',
            [
                'json' => [
                    'username' => $this->userNormal2,
                    '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"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tLogin Sukses User [" . $jsonResponse['data']['user_id']. "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginA_1_2
     */
    public function testKirimKomentarA_1_2($data)
    {
        $response = $this->client->request('POST', 'diskusi/komentar/kirim_attachment',
            [
                'multipart' => [
                    [
                        'name' => 'diskusi_id',
                        'contents' => $data['diskusi_id'],
                    ],
                    [
                        'name' => 'komentar',
                        'contents' => 'ini adalah sebuaah komentar dari testunit',
                    ],
                ],
                '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 komentar/kirim_attachment"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tKirim Komentar Berhasil " . $jsonResponse['data']['komentar_id']]);

        return $data;
    }
    #endregion

    #region Diskusi Pendidikan (B)

    //Case Skenario #1
    // -> Login User 1
    // -> Create Diskusi
    // -> Cek Diskusi 
    // -> Komen Diskusi User 1
    // -> Login User 2
    // -> Komen Diskusi User 2
    
    public function testLoginB_1_1()
    {
        self::$messages = array_merge(self::$messages, ["\n\n\t\t---Test Diskusi Pendidikan---"]);
        $response = $this->client->request('POST', 'auth/login',
            [
                'json' => [
                    'username' => $this->userNormal1,
                    '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"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tLogin Sukses User [" . $jsonResponse['data']['user_id']. "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginB_1_1
     */
    public function testSubmitDiskusiB_1($data)
    {
        $response = $this->client->request('POST', 'diskusi/submit',
            [
                'multipart' => [
                    [
                        'name' => 'produk_id',
                        'contents' => '2',
                    ],
                    [
                        'name' => 'objek_id',
                        'contents' => '20306806',
                    ],
                    [
                        'name' => 'nama_objek',
                        'contents' => 'SMA NEGERI 2 WONOSOBO',
                    ],
                    [
                        'name' => 'judul',
                        'contents' => 'Tes Diskusi Pendidikan dari TestUnit',
                    ],
                    [
                        'name' => 'is_anonymous',
                        'contents' => '0',
                    ],
                    [
                        'name' => 'konten_diskusi',
                        'contents' => 'Diskusi ini seharusnya pendidikan',
                    ],
                    [
                        'name' => 'link_terkait',
                        'contents' => '',
                    ],
                    [
                        'name' => 'mentions',
                        'contents' => '',
                    ],
                    [
                        'name' => 'product_nama',
                        'contents' => 'Pendidikan',
                    ],
                ],
                '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 diskusi/submit"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tSubmit Diskusi Pendidikan Berhasil " . $jsonResponse['data']['diskusi_uuid']]);
        $data['diskusi_id'] = $jsonResponse['data']['diskusi_id'];
        $data['diskusi_uuid'] = $jsonResponse['data']['diskusi_uuid'];

        return $data;
    }

    /**
     * @depends testSubmitDiskusiB_1
     */
    public function testDetilDiskusiB_1($data)
    {
        $response = $this->client->request('GET', 'diskusi/detil/' . $data['diskusi_uuid'],
            [
                '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 diskusi/detil"
        );
        $this->assertGreaterThan(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tDiskusi Valid !!"]);

        return $data;
    }

    /**
     * @depends testDetilDiskusiB_1
     */
    public function testKirimKomentarB_1_1($data)
    {
        $response = $this->client->request('POST', 'diskusi/komentar/kirim_attachment',
            [
                'multipart' => [
                    [
                        'name' => 'diskusi_id',
                        'contents' => $data['diskusi_id'],
                    ],
                    [
                        'name' => 'komentar',
                        'contents' => 'ini adalah sebuaah komentar dari testunit',
                    ],
                ],
                '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 komentar/kirim_attachment"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tKirim Komentar Berhasil " . $jsonResponse['data']['komentar_id']]);

        return $data;
    }

    /**
     * @depends testKirimKomentarB_1_1
     */
    public function testLoginB_1_2($data)
    {
        $response = $this->client->request('POST', 'auth/login',
            [
                'json' => [
                    'username' => $this->userNormal2,
                    '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"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tLogin Sukses User [" . $jsonResponse['data']['user_id']. "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginB_1_2
     */
    public function testKirimKomentarB_1_2($data)
    {
        $response = $this->client->request('POST', 'diskusi/komentar/kirim_attachment',
            [
                'multipart' => [
                    [
                        'name' => 'diskusi_id',
                        'contents' => $data['diskusi_id'],
                    ],
                    [
                        'name' => 'komentar',
                        'contents' => 'ini adalah sebuaah komentar dari testunit',
                    ],
                ],
                '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 komentar/kirim_attachment"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tKirim Komentar Berhasil " . $jsonResponse['data']['komentar_id']]);

        return $data;
    }

    #endregion

    #region Diskusi Kesehatan (C)

    //Case Skenario #1
    // -> Login User 1
    // -> Create Diskusi
    // -> Cek Diskusi 
    // -> Komen Diskusi User 1
    // -> Login User 2
    // -> Komen Diskusi User 2
    
    public function testLoginC_1_1()
    {
        self::$messages = array_merge(self::$messages, ["\n\n\t\t---Test Diskusi Kesehatan---"]);
        $response = $this->client->request('POST', 'auth/login',
            [
                'json' => [
                    'username' => $this->userNormal1,
                    '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"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tLogin Sukses User [" . $jsonResponse['data']['user_id']. "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginC_1_1
     */
    public function testSubmitDiskusiC_1($data)
    {
        $response = $this->client->request('POST', 'diskusi/submit',
            [
                'multipart' => [
                    [
                        'name' => 'produk_id',
                        'contents' => '3',
                    ],
                    [
                        'name' => 'objek_id',
                        'contents' => '7471070',
                    ],
                    [
                        'name' => 'nama_objek',
                        'contents' => 'RS Bhayangkara Kendari',
                    ],
                    [
                        'name' => 'judul',
                        'contents' => 'Tes Diskusi Kesehatan dari TestUnit',
                    ],
                    [
                        'name' => 'is_anonymous',
                        'contents' => '0',
                    ],
                    [
                        'name' => 'konten_diskusi',
                        'contents' => 'Diskusi ini seharusnya kesehatan',
                    ],
                    [
                        'name' => 'link_terkait',
                        'contents' => '',
                    ],
                    [
                        'name' => 'mentions',
                        'contents' => '',
                    ],
                    [
                        'name' => 'product_nama',
                        'contents' => 'Kesehatan',
                    ],
                ],
                '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 diskusi/submit"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tSubmit Diskusi Kesehatan Berhasil " . $jsonResponse['data']['diskusi_uuid']]);
        $data['diskusi_id'] = $jsonResponse['data']['diskusi_id'];
        $data['diskusi_uuid'] = $jsonResponse['data']['diskusi_uuid'];

        return $data;
    }

    /**
     * @depends testSubmitDiskusiC_1
     */
    public function testDetilDiskusiC_1($data)
    {
        $response = $this->client->request('GET', 'diskusi/detil/' . $data['diskusi_uuid'],
            [
                '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 diskusi/detil"
        );
        $this->assertGreaterThan(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tDiskusi Valid !!"]);

        return $data;
    }

    /**
     * @depends testDetilDiskusiC_1
     */
    public function testKirimKomentarC_1_1($data)
    {
        $response = $this->client->request('POST', 'diskusi/komentar/kirim_attachment',
            [
                'multipart' => [
                    [
                        'name' => 'diskusi_id',
                        'contents' => $data['diskusi_id'],
                    ],
                    [
                        'name' => 'komentar',
                        'contents' => 'ini adalah sebuaah komentar dari testunit',
                    ],
                ],
                '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 komentar/kirim_attachment"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tKirim Komentar Berhasil " . $jsonResponse['data']['komentar_id']]);

        return $data;
    }

    /**
     * @depends testKirimKomentarC_1_1
     */
    public function testLoginC_1_2($data)
    {
        $response = $this->client->request('POST', 'auth/login',
            [
                'json' => [
                    'username' => $this->userNormal2,
                    '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"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tLogin Sukses User [" . $jsonResponse['data']['user_id']. "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginC_1_2
     */
    public function testKirimKomentarC_1_2($data)
    {
        $response = $this->client->request('POST', 'diskusi/komentar/kirim_attachment',
            [
                'multipart' => [
                    [
                        'name' => 'diskusi_id',
                        'contents' => $data['diskusi_id'],
                    ],
                    [
                        'name' => 'komentar',
                        'contents' => 'ini adalah sebuaah komentar dari testunit',
                    ],
                ],
                '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 komentar/kirim_attachment"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tKirim Komentar Berhasil " . $jsonResponse['data']['komentar_id']]);

        return $data;
    }
    
    #endregion

    #region Diskusi Desa (D)

    //Case Skenario #1
    // -> Login User 1
    // -> Create Diskusi
    // -> Cek Diskusi 
    // -> Komen Diskusi User 1
    // -> Login User 2
    // -> Komen Diskusi User 2
    
    public function testLoginD_1_1()
    {
        self::$messages = array_merge(self::$messages, ["\n\n\t\t---Test Diskusi Desa---"]);
        $response = $this->client->request('POST', 'auth/login',
            [
                'json' => [
                    'username' => $this->userNormal1,
                    '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"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tLogin Sukses User [" . $jsonResponse['data']['user_id']. "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginD_1_1
     */
    public function testSubmitDiskusiD_1($data)
    {
        $response = $this->client->request('POST', 'diskusi/submit',
            [
                'multipart' => [
                    [
                        'name' => 'produk_id',
                        'contents' => '6',
                    ],
                    [
                        'name' => 'objek_id',
                        'contents' => '1102012022',
                    ],
                    [
                        'name' => 'nama_objek',
                        'contents' => 'Paye Munje',
                    ],
                    [
                        'name' => 'judul',
                        'contents' => 'Tes Diskusi Desa dari TestUnit',
                    ],
                    [
                        'name' => 'is_anonymous',
                        'contents' => '0',
                    ],
                    [
                        'name' => 'konten_diskusi',
                        'contents' => 'Diskusi ini seharusnya Desa',
                    ],
                    [
                        'name' => 'link_terkait',
                        'contents' => '',
                    ],
                    [
                        'name' => 'mentions',
                        'contents' => '',
                    ],
                    [
                        'name' => 'product_nama',
                        'contents' => 'Desa',
                    ],
                ],
                '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 diskusi/submit"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tSubmit Diskusi Desa Berhasil " . $jsonResponse['data']['diskusi_uuid']]);
        $data['diskusi_id'] = $jsonResponse['data']['diskusi_id'];
        $data['diskusi_uuid'] = $jsonResponse['data']['diskusi_uuid'];

        return $data;
    }

    /**
     * @depends testSubmitDiskusiD_1
     */
    public function testDetilDiskusiD_1($data)
    {
        $response = $this->client->request('GET', 'diskusi/detil/' . $data['diskusi_uuid'],
            [
                '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 diskusi/detil"
        );
        $this->assertGreaterThan(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tDiskusi Valid !!"]);

        return $data;
    }

    /**
     * @depends testDetilDiskusiD_1
     */
    public function testKirimKomentarD_1_1($data)
    {
        $response = $this->client->request('POST', 'diskusi/komentar/kirim_attachment',
            [
                'multipart' => [
                    [
                        'name' => 'diskusi_id',
                        'contents' => $data['diskusi_id'],
                    ],
                    [
                        'name' => 'komentar',
                        'contents' => 'ini adalah sebuaah komentar dari testunit',
                    ],
                ],
                '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 komentar/kirim_attachment"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tKirim Komentar Berhasil " . $jsonResponse['data']['komentar_id']]);

        return $data;
    }

    /**
     * @depends testKirimKomentarD_1_1
     */
    public function testLoginD_1_2($data)
    {
        $response = $this->client->request('POST', 'auth/login',
            [
                'json' => [
                    'username' => $this->userNormal2,
                    '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"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tLogin Sukses User [" . $jsonResponse['data']['user_id']. "]"]);
        $data['token'] = $jsonResponse['data']['token'];

        return $data;
    }

    /**
     * @depends testLoginD_1_2
     */
    public function testKirimKomentarD_1_2($data)
    {
        $response = $this->client->request('POST', 'diskusi/komentar/kirim_attachment',
            [
                'multipart' => [
                    [
                        'name' => 'diskusi_id',
                        'contents' => $data['diskusi_id'],
                    ],
                    [
                        'name' => 'komentar',
                        'contents' => 'ini adalah sebuaah komentar dari testunit',
                    ],
                ],
                '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 komentar/kirim_attachment"
        );
        //$this->assertEquals(0, $jsonResponse['data']['total_record']);
        self::$messages = array_merge(self::$messages, ["\t\t\tKirim Komentar Berhasil " . $jsonResponse['data']['komentar_id']]);

        return $data;
    }

    #endregion

    #region Non Flow

    public function testKategoriProdukSuccess()
    {
        $res = $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'diskusi/kategori_produk',
            [],
            200,
            "diskusi/kategori_produk passed"
        );

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

    /**
     * @depends testKategoriProdukSuccess
     * @param $kategori
     */
    public function testSubKategoriProdukSuccess($kategori)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'diskusi/sub_kategori_produk?produk_id=' . $kategori['id'],
            [],
            200,
            "diskusi/sub_kategori_produk passed"
        );
    }

    public function testProdukObjekProdukSuccess()
    {
        /** produk pendidikan */
        $produk_id = 2;
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'diskusi/produk_objek?search=kota&produk_id=' . $produk_id,
            [],
            200,
            "diskusi/produk_objek passed"
        );
    }

    public function testAllProdukObjekProdukSuccess()
    {
        /** produk pendidikan */
        $produk_id = 2;
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'diskusi/all-produk-objek?search=kota',
            [],
            200,
            "diskusi/all-produk-objek passed"
        );
    }

    public function testMentionSuccess()
    {
        $requestLogin = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $token = $requestLogin['data']['token'];
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'diskusi/mention',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $token
                ]
            ],
            200,
            "diskusi/mention passed"
        );
    }

    public function testMentionKomentarSuccess()
    {
        $requestLogin = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $token = $requestLogin['data']['token'];
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'diskusi/mention_komentar?diskusi_id=1',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $token
                ]
            ],
            200,
            "diskusi/mention_komentar passed"
        );
    }

    public function testHashtagSuccess()
    {
        $this->doAPIShouldGiveSubsetResponse(
            'GET',
            'diskusi/hashtag',
            200,
            [],
            "diskusi/hashtag passed"
        );
    }

    public function testKumpulanSuccess()
    {
        $this->doAPIListShouldSuccess('diskusi/kumpulan');
    }

    public function testCeritaSuksesSuccess()
    {
        $this->doAPIListShouldSuccess('diskusi/cerita_sukses');
    }

    public function testKuSuccess()
    {
        $requestLogin = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $user = $requestLogin["data"];
        $headers = [
            'headers' => [
                'Authorization' => 'Bearer ' . $user['token']
            ]
        ];

        return $this->doAPIListShouldSuccess('diskusi/ku', $headers);
    }

    /**
     * @depends testKuSuccess
     * @param $diskusis
     */
    public function testKontenSuccess($diskusis)
    {
        $diskusi = $diskusis['data']['result'][0];
        return $this->doAPIListShouldSuccess('diskusi/konten/' . $diskusi['uuid']);
    }

    /**
     * @depends testKontenSuccess
     * @param $diskusis
     */
    public function testEditSuccess($diskusis)
    {
        $requestLogin = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $user = $requestLogin["data"];
        $headers = [
            'headers' => [
                'Authorization' => 'Bearer ' . $user['token']
            ]
        ];

        $diskusi = $diskusis['data']['result'][0];

        $this->doAPIShouldGiveSubsetResponse(
            'POST',
            'diskusi/edit/' . $diskusi['uuid'],
            200,
            [
                'data' => [
                    'diskusi_uuid' => $diskusi['uuid'],
                    'diskusi_id' => $diskusi['id']
                ]
            ],
            "diskusi/edit passed",
            array_merge(
                $headers,
                [
                    'multipart' => [
                        ['name' => 'judul', 'contents' => $diskusi['title'] . ' Edited'],
                        ['name' => 'is_anonymous', 'contents' => $diskusi['is_anonymous']],
                        ['name' => 'konten_diskusi', 'contents' => $diskusi['content'] . ' Edited']
                    ]
                ]
            )
        );
    }

    public function testSubmitCerita()
    {
        $user = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $form = [
            [
                'name' => 'produk_id',
                'contents' => '1'
            ],
            [
                'name' => 'judul',
                'contents' => 'Test Berita Dari UnitTest'
            ],
            [
                'name' => 'is_anonymous',
                'contents' => '0'
            ],
            [
                'name' => 'konten_diskusi',
                'contents' => 'Kontent berita yang disubmit dari Unit Test'
            ],
            [
                'name' => 'link_terkait',
                'contents' => ''
            ],
            [
                'name' => 'release_date',
                'contents' => date('Y-m-d H:i:s')
            ]
        ];

        $res = $this->doAPIShouldGiveSubsetResponse(
            'POST',
            'diskusi/submit_cerita',
            200,
            [],
            "diskusi/submit_cerita passed",
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $user['data']['token']
                ],
                'multipart' => $form
            ]
        );

        $res['data']['token'] = $user['data']['token'];

        return $res['data'];
    }

    /**
     * @depends testSubmitCerita
     * @param $data
     */
    public function testCeritaHapusSuccess($data)
    {
        $this->doAPIShouldGiveSubsetResponse(
            'GET',
            'diskusi/cerita_hapus/' . $data['diskusi_uuid'],
            200,
            [
                'data' => [
                    'diskusi_id' => $data['diskusi_uuid']
                ]
            ],
            "diskusi/cerita_hapus passed",
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );
    }

    /**
     * @depends testSubmitDiskusiA_1
     * @param $data
     * @return mixed
     */
    public function testDetilFullSuccess($data)
    {
        $this->doAPIListShouldSuccess(
            'diskusi/detil_full/' . $data['diskusi_uuid'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        return $data;
    }

    /**
     * @depends testKirimKomentarA_1_1
     * @param $data
     */
    public function testKomentarEditSuccess($data)
    {
        $response = $this->client->request('POST', 'diskusi/komentar/edit',
            [
                'json' => [
                    'komentar_id' => $data['komentar']['komentar_id'],
                    'komentar' => $data['komentar']['komentar'] . ' (edited)'
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = \GuzzleHttp\json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "diskusi/komentar/edit failed"
        );
        self::$messages = array_merge(self::$messages, ["\t\t\tList Komentar Berhasil " . $jsonResponse['data']['id']]);

        return $data;
    }

    /**
     * @depends testKirimKomentarA_1_1
     * @param $data
     */
    public function testKomentarListSuccess($data)
    {
        $this->doAPIListShouldSuccess('diskusi/komentar/list?diskusi_id=' . $data['diskusi_id'], [
            'headers' => [
                'Authorization' => 'Bearer ' . $data['token']
            ]
        ]);
    }

    /**
     * @depends testKirimKomentarA_1_1
     * @param $data
     */
    public function testKomentarReplySuccess($data)
    {
        $response = $this->doAPIShouldGiveSubsetResponse(
            'POST',
            'diskusi/komentar/kirim_attachment',
            200,
            [],
            "Komentar Reply passed",
            [
                'multipart' => [
                    [
                        'name' => 'diskusi_id',
                        'contents' => $data['diskusi_id'],
                    ],
                    [
                        'name' => 'komentar_id',
                        'contents' => $data['komentar']['komentar_id'],
                    ],
                    [
                        'name' => 'komentar',
                        'contents' => 'balas komentar dari testunit',
                    ],
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );

        return $data;
    }

    /**
     * @depends testKomentarReplySuccess
     * @param $data
     */
    public function testKomentarRepliesSuccess($data)
    {
        $this->doAPIListShouldSuccess('diskusi/komentar/replies/' . $data['komentar']['komentar_id'], [
            'headers' => [
                'Authorization' => 'Bearer ' . $data['token']
            ]
        ]);
    }

    /**
     * @depends testLoginA_1_1
     * @param $data
     */
    public function testKomentarByUserSuccess($data)
    {
        $this->doAPIListShouldSuccess('diskusi/komentar/list_by_user?user_id=' . $data['user_id'], [
            'headers' => [
                'Authorization' => 'Bearer ' . $data['token']
            ]
        ]);
    }

    /**
     * @depends testKomentarEditSuccess
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testKomentarDetilSuccess($data)
    {
        $response = $this->client->request('GET', 'diskusi/komentar/detail/' . $data['komentar']['komentar_id'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token'],
                    'Content-Type' => 'application/json'
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = \GuzzleHttp\json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "diskusi/komentar/detail failed"
        );
        self::$messages = array_merge(self::$messages, ["\t\t\tDetail Komentar Berhasil " . $data['komentar']['komentar_id']]);

        return $data;
    }

    /**
     * @depends testKomentarEditSuccess
     * @param $data
     * @return mixed
     */
    public function testDiskusiLikeSuccess($data)
    {
        $request = $this->login($this->userNormal2, $this->password);
        $response = $request['data'];
        $this->doAPIShouldGiveSubsetResponse(
            'POST',
            'diskusi/like',
            200,
            [],
            "\t\t\tDiskusi Like passed",
            [
                'json' => [
                    "diskusi_id" => $data['diskusi_id']
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $response['token'],
                    'Content-Type' => 'application/json'
                ]
            ]
        );

        return $data;
    }

    /**
     * @depends testDiskusiLikeSuccess
     * @param $data
     */
    public function testDiskusiLikesSuccess($data)
    {
        $this->doAPIListShouldSuccess('diskusi/likes/' . $data['diskusi_uuid'], [
            'headers' => [
                'Authorization' => 'Bearer ' . $data['token'],
                'Content-Type' => 'application/json'
            ]
        ]);
    }

    /**
     * @depends testDiskusiLikeSuccess
     * @param $data
     */
    public function testHapusSuccess($data)
    {
        $this->doAPIShouldGiveSubsetResponse(
            'GET',
            'diskusi/hapus/' . $data['diskusi_uuid'],
            200,
            [
                'data' => [
                    'diskusi_id' => $data['diskusi_uuid']
                ]
            ],
            "diskusi/hapus passed",
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );
    }

    /**
     * @depends testKomentarEditSuccess
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testKomentarHapusSuccess($data)
    {
        $response = $this->client->request('POST', 'diskusi/komentar/hapus/' . $data['komentar']['komentar_id'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token'],
                    'Content-Type' => 'application/json'
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = \GuzzleHttp\json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            "diskusi/komentar/hapus failed"
        );
        self::$messages = array_merge(self::$messages, ["\t\t\tHapus Komentar Berhasil " . $data['komentar']['komentar_id']]);

        return $data;
    }

    /**
     * @depends testKomentarReplySuccess
     * @return array
     */
    public function testListForAdminSuccess()
    {
        $loginRequest = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $token = $loginRequest['data']["token"];

        $response = $this->doAPIListShouldSuccess('diskusi/list-for-admin?order_by=id&order_direction=desc', [
            'headers' => [
                'Authorization' => 'Bearer ' . $token
            ]
        ]);

        return [
            "diskusi" => $response['data']['result'][0],
            "token" => $token
        ];
    }

    /**
     * @depends testListForAdminSuccess
     * @param $data
     */
    public function testLockSuccess($data)
    {
        $this->doAPIShouldGiveSubsetResponse(
            'POST',
            'diskusi/lock',
            200,
            [],
            "Lock Diskusi passed",
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ],
                'json' => [
                    'diskusi_id' => $data['diskusi']['id']
                ]
            ]
        );

        return $data;
    }

    /**
     * @depends testLockSuccess
     * @param $data
     */
    public function testUnlockSuccess($data)
    {
        $this->doAPIShouldGiveSubsetResponse(
            'POST',
            'diskusi/unlock',
            200,
            [],
            "Unlock Diskusi passed",
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ],
                'json' => [
                    'diskusi_id' => $data['diskusi']['id']
                ]
            ]
        );
    }

    public function testHotDiskusi()
    {
        $this->doAPIListShouldSuccess('diskusi/hot', []);
    }

    public function testHotBerita()
    {
        $this->doAPIListShouldSuccess('diskusi/hot?type=1', []);
    }

    #endregion
}


?>