<?php

use Mockery as m;
use GaryJones\OAuth\SignatureMethod;

/**
 * Create concrete class from abstract SignatureMethod.
 *
 * Have to define two methods which are abstract in SignatureMethod.
 */
class FooBarSignatureMethod extends SignatureMethod
{
    public function getName() {
    }

    public function buildSignature(
        \GaryJones\OAuth\Request $request,
        \GaryJones\OAuth\Client $client,
        \GaryJones\OAuth\Token $token = null
    ) {
    }
}

class SignatureTest extends PHPUnit_Framework_TestCase
{
    public function tearDown()
    {
        m::close();
    }

    public function testGetSignatureKeyWithoutToken()
    {
        // Create instance of class to test, with mock objects passed in.
        $signature_method = $this->getSignatureMethod();

        // Get mock objects
        $client = $this->getClient();

        // Run method being tested
        $signature_key = $signature_method->getSignatureKey($client);

        // Check results
        $this->assertEquals('secret&', $signature_key);
    }

    public function testGetSignatureKeyWithToken()
    {
        // Create instance of class to test, with mock objects passed in.
        $signature_method = $this->getSignatureMethod();

        // Get mock objects
        $client = $this->getClient();
        $token = $this->getToken();

        // Run method being tested
        $signature_key = $signature_method->getSignatureKey($client, $token);

        // Check results
        $this->assertEquals('secret&token_secret', $signature_key);
    }

    private function getSignatureMethod()
    {
        return new FooBarSignatureMethod;
    }

    private function getClient()
    {
        return m::mock('GaryJones\OAuth\Client', function ($mock) {
            $mock->shouldReceive('getSecret')->withNoArgs()->andReturn('secret')->once();
        });
    }

    private function getToken()
    {
        return m::mock('GaryJones\OAuth\Token', function ($mock) {
            $mock->shouldReceive('getSecret')->withNoArgs()->andReturn('token_secret');
        });
    }
}