<?php

namespace Omnipay\Payflow\Message;

use Omnipay\Tests\TestCase;

class AuthorizeRequestTest extends TestCase
{
    public function setUp()
    {
        $this->request = new AuthorizeRequest($this->getHttpClient(), $this->getHttpRequest());
        $this->request->initialize(
            array(
                'amount' => '12.00',
                'card' => $this->getValidCard(),
            )
        );
    }

    public function testComment1()
    {
        // comment1 is alias for description
        $this->assertSame($this->request, $this->request->setComment1('foo'));
        $this->assertSame('foo', $this->request->getComment1());
        $this->assertSame('foo', $this->request->getDescription());
    }

    public function testComment2()
    {
        $this->assertSame($this->request, $this->request->setComment2('bar'));
        $this->assertSame('bar', $this->request->getComment2());
    }

    public function testPoNum()
    {
        $this->assertSame($this->request, $this->request->setPoNum('abcdefghijklmnopqrstuvwxy'));
        $this->assertSame('abcdefghijklmnopqrstuvwxy', $this->request->getPoNum());
    }

    public function testGetData()
    {
        $card = $this->getValidCard();
        $this->request->initialize(
            array(
                'amount' => '12.00',
                'description' => 'things',
                'comment2' => 'more things',
                'card' => $card,
                'orderid' => '123',
                'ponum' => 'abcdefghijklmnopqrstuvwxy',
            )
        );

        $data = $this->request->getData();

        $this->assertSame('C', $data['TENDER']);
        $this->assertSame('12.00', $data['AMT']);
        $this->assertSame('things', $data['COMMENT1']);
        $this->assertSame('more things', $data['COMMENT2']);
        $this->assertSame('123', $data['ORDERID']);
        $this->assertSame('abcdefghijklmnopqrstuvwxy', $data['PONUM']);
    }

    public function testEncodeData()
    {
        $data = array(
            'foo' => 'bar',
            'key' => 'value &= reference',
        );

        $expected = 'foo[3]=bar&key[18]=value &= reference';
        $this->assertSame($expected, $this->request->encodeData($data));
    }
}
