<?php



namespace Razorpay\Tests;



use Razorpay\Api\Request;

use Razorpay\Api\Api;



class PaymentTest extends TestCase

{

    /**

     * Specify unique order id & payment id d

     * for example order_IEcrUMyevZFuCS & pay_IEczPDny6uzSnx

     */



    private $orderId = "order_IEcrUMyevZFuCS";



    private $paymentId = "pay_IEczPDny6uzSnx";



    private $OtpPaymentId = "";



    public function setUp(): void

    {

        parent::setUp();

    }    



    /**

     * Fetch all payment

     */

    public function testFetchAllPayment()

    {

        $data = $this->api->payment->all();



        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(is_array($data['items']));

    }



    /**

     * Fetch a payment

     */

    public function testFetchPayment()

    {

        $payment = $this->api->payment->all();



        if($payment['count'] !== 0){



            $data = $this->api->payment->fetch($payment['items'][0]['id']);



            $this->assertTrue(is_array($data->toArray()));



            $this->assertTrue(in_array('payment',$data->toArray()));

        }

    } 



    /**

     * Fetch a payment

     */

    public function testFetchOrderPayment()

    {

        $data = $this->api->order->fetch($this->orderId)->payments();



        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(is_array($data['items']));

    }



    /**

     * Update a payment

     */

    public function testUpdatePayment()

    {

        $data = $this->api->payment->fetch($this->paymentId)->edit(array('notes'=> array('key_1'=> 'value1','key_2'=> 'value2')));



        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(in_array('payment',$data->toArray()));

    }



    /**

     * Fetch card details with paymentId

     */

    public function testFetchCardWithPaymentId()

    {

        $data = $this->api->payment->fetch($this->paymentId)->fetchCardDetails();



        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(in_array('card',$data->toArray())); 

    }



    /**

     * Fetch Payment Downtime Details

     */

    public function testfetchPaymentDowntime()

    {

        $data = $this->api->payment->fetchPaymentDowntime();



        $this->assertTrue(is_array($data->toArray()));



        $this->assertArrayHasKey('count',$data->toArray());

    }



    /**

     * Fetch Payment Downtime Details

     */

    public function testfetchPaymentDowntimeById()

    {

        $downtime = $this->api->payment->fetchPaymentDowntime();

        if(count($downtime['items'])>0){

          $data = $this->api->payment->fetchPaymentDowntimeById($downtime['items'][0]['id']);

          $this->assertTrue(is_array($data->toArray()));

        }else{

          $this->assertArrayHasKey('count',$downtime->toArray());

        }

    }



    /**

     * Otp Generate

     */

    public function testOtpGenerate()

    {

        $api = new Api("key", "");



        $data = $api->payment->otpGenerate($OtpPaymentId);



        $this->assertTrue(is_array($data->toArray()));



        $this->assertArrayHasKey('razorpay_payment_id',$data->toArray());

    }



    /**

     * Otp Submit

     */

    public function testOtpSubmit()

    {

        $data = $this->api->payment->fetch($paymentId)->otpSubmit(array('otp'=> '12345'));

        

        $this->assertTrue(is_array($data->toArray()));



        $this->assertArrayHasKey('razorpay_payment_id',$data->toArray());

    }



    /**

     * Otp Resend

     */

    public function testOtpResend()

    {

        $data = $this->api->payment->fetch($paymentId)->otpResend();

        

        $this->assertTrue(is_array($data->toArray()));

        

        $this->assertArrayHasKey('razorpay_payment_id',$data->toArray());

    }



}