<?php

declare(strict_types=1);

/*
 * Copyright (C) 2013 Mailgun
 *
 * This software may be modified and distributed under the terms
 * of the MIT license. See the LICENSE file for details.
 */

namespace Mailgun\Tests\Api;

use GuzzleHttp\Psr7\Response;
use Mailgun\Api\Route;
use Mailgun\Model\Route\DeleteResponse;
use Mailgun\Model\Route\IndexResponse;
use Mailgun\Model\Route\ShowResponse;
use Mailgun\Model\Route\UpdateResponse;

/**
 * @author David Garcia <me@davidgarcia.cat>
 * @author Tobias Nyholm <tobias.nyholm@gmail.com>
 */
class RouteTest extends TestCase
{
    public function testIndex()
    {
        $this->setRequestMethod('GET');
        $this->setRequestUri('/v3/routes?limit=100&skip=0');
        $this->setHydrateClass(IndexResponse::class);

        $api = $this->getApiInstance();
        $api->index();
    }

    public function testShow()
    {
        $this->setRequestMethod('GET');
        $this->setRequestUri('/v3/routes/4711');
        $this->setHydrateClass(ShowResponse::class);

        $api = $this->getApiInstance();
        $api->show('4711');
    }

    public function testCreate()
    {
        $api = $this->getApiMock();
        $api->expects($this->once())
            ->method('httpPost')
            ->willReturn(new Response());

        $api->create('catch_all()', ['forward("mailbox@myapp.com")'], 'example', 100);
    }

    public function testUpdate()
    {
        $this->setRequestMethod('PUT');
        $this->setRequestUri('/v3/routes/4711');
        $this->setHydrateClass(UpdateResponse::class);
        $this->setRequestBody([
            'expression' => 'catch_all()',
           'action' => 'forward("mailbox@myapp.com")',
           'description' => 'example',
           'priority' => '100',
        ]);

        $api = $this->getApiInstance();
        $api->update('4711', 'catch_all()', ['forward("mailbox@myapp.com")'], 'example', 100);
    }

    public function testDelete()
    {
        $this->setRequestMethod('DELETE');
        $this->setRequestUri('/v3/routes/4711');
        $this->setHydrateClass(DeleteResponse::class);

        $api = $this->getApiInstance();
        $api->delete('4711');
    }

    /**
     * {@inheritdoc}
     */
    protected function getApiClass()
    {
        return Route::class;
    }
}