im/vendor/qeq66/jwt/test/unit/ParserTest.php

245 lines
7.1 KiB
PHP
Executable File

<?php
/**
* This file is part of Lcobucci\JWT, a simple library to handle JWT and JWS
*
* @license http://opensource.org/licenses/BSD-3-Clause BSD-3-Clause
*/
namespace Lcobucci\JWT;
use Lcobucci\JWT\Claim\Factory as ClaimFactory;
use Lcobucci\JWT\Parsing\Decoder;
use RuntimeException;
/**
* @author Luís Otávio Cobucci Oblonczyk <lcobucci@gmail.com>
* @since 0.1.0
*/
class ParserTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Decoder|\PHPUnit_Framework_MockObject_MockObject
*/
protected $decoder;
/**
* @var ClaimFactory|\PHPUnit_Framework_MockObject_MockObject
*/
protected $claimFactory;
/**
* @var Claim|\PHPUnit_Framework_MockObject_MockObject
*/
protected $defaultClaim;
/**
* {@inheritdoc}
*/
protected function setUp()
{
$this->decoder = $this->createMock(Decoder::class);
$this->claimFactory = $this->createMock(ClaimFactory::class, [], [], '', false);
$this->defaultClaim = $this->createMock(Claim::class);
$this->claimFactory->expects($this->any())
->method('create')
->willReturn($this->defaultClaim);
}
/**
* @return Parser
*/
private function createParser()
{
return new Parser($this->decoder, $this->claimFactory);
}
/**
* @test
*
* @covers Lcobucci\JWT\Parser::__construct
*/
public function constructMustConfigureTheAttributes()
{
$parser = $this->createParser();
$this->assertAttributeSame($this->decoder, 'decoder', $parser);
$this->assertAttributeSame($this->claimFactory, 'claimFactory', $parser);
}
/**
* @test
*
* @uses Lcobucci\JWT\Parser::__construct
*
* @covers Lcobucci\JWT\Parser::parse
* @covers Lcobucci\JWT\Parser::splitJwt
*
* @expectedException InvalidArgumentException
*/
public function parseMustRaiseExceptionWhenJWSIsNotAString()
{
$parser = $this->createParser();
$parser->parse(['asdasd']);
}
/**
* @test
*
* @uses Lcobucci\JWT\Parser::__construct
*
* @covers Lcobucci\JWT\Parser::parse
* @covers Lcobucci\JWT\Parser::splitJwt
*
* @expectedException InvalidArgumentException
*/
public function parseMustRaiseExceptionWhenJWSDontHaveThreeParts()
{
$parser = $this->createParser();
$parser->parse('');
}
/**
* @test
*
* @uses Lcobucci\JWT\Parser::__construct
*
* @covers Lcobucci\JWT\Parser::parse
* @covers Lcobucci\JWT\Parser::splitJwt
* @covers Lcobucci\JWT\Parser::parseHeader
*
* @expectedException RuntimeException
*/
public function parseMustRaiseExceptionWhenHeaderCannotBeDecoded()
{
$this->decoder->expects($this->any())
->method('jsonDecode')
->willThrowException(new RuntimeException());
$parser = $this->createParser();
$parser->parse('asdfad.asdfasdf.');
}
/**
* @test
*
* @uses Lcobucci\JWT\Parser::__construct
*
* @covers Lcobucci\JWT\Parser::parse
* @covers Lcobucci\JWT\Parser::splitJwt
* @covers Lcobucci\JWT\Parser::parseHeader
*
* @expectedException InvalidArgumentException
*/
public function parseMustRaiseExceptionWhenHeaderIsFromAnEncryptedToken()
{
$this->decoder->expects($this->any())
->method('jsonDecode')
->willReturn(['enc' => 'AAA']);
$parser = $this->createParser();
$parser->parse('a.a.');
}
/**
* @test
*
* @uses Lcobucci\JWT\Parser::__construct
* @uses Lcobucci\JWT\Token::__construct
*
* @covers Lcobucci\JWT\Parser::parse
* @covers Lcobucci\JWT\Parser::splitJwt
* @covers Lcobucci\JWT\Parser::parseHeader
* @covers Lcobucci\JWT\Parser::parseClaims
* @covers Lcobucci\JWT\Parser::parseSignature
*
*/
public function parseMustReturnANonSignedTokenWhenSignatureIsNotInformed()
{
$this->decoder->expects($this->at(1))
->method('jsonDecode')
->willReturn(['typ' => 'JWT', 'alg' => 'none']);
$this->decoder->expects($this->at(3))
->method('jsonDecode')
->willReturn(['aud' => 'test']);
$parser = $this->createParser();
$token = $parser->parse('a.a.');
$this->assertAttributeEquals(['typ' => 'JWT', 'alg' => 'none'], 'headers', $token);
$this->assertAttributeEquals(['aud' => $this->defaultClaim], 'claims', $token);
$this->assertAttributeEquals(null, 'signature', $token);
}
/**
* @test
*
* @uses Lcobucci\JWT\Parser::__construct
* @uses Lcobucci\JWT\Token::__construct
*
* @covers Lcobucci\JWT\Parser::parse
* @covers Lcobucci\JWT\Parser::splitJwt
* @covers Lcobucci\JWT\Parser::parseHeader
* @covers Lcobucci\JWT\Parser::parseClaims
* @covers Lcobucci\JWT\Parser::parseSignature
*/
public function parseShouldReplicateClaimValueOnHeaderWhenNeeded()
{
$this->decoder->expects($this->at(1))
->method('jsonDecode')
->willReturn(['typ' => 'JWT', 'alg' => 'none', 'aud' => 'test']);
$this->decoder->expects($this->at(3))
->method('jsonDecode')
->willReturn(['aud' => 'test']);
$parser = $this->createParser();
$token = $parser->parse('a.a.');
$this->assertAttributeEquals(
['typ' => 'JWT', 'alg' => 'none', 'aud' => $this->defaultClaim],
'headers',
$token
);
$this->assertAttributeEquals(['aud' => $this->defaultClaim], 'claims', $token);
$this->assertAttributeEquals(null, 'signature', $token);
}
/**
* @test
*
* @uses Lcobucci\JWT\Parser::__construct
* @uses Lcobucci\JWT\Token::__construct
* @uses Lcobucci\JWT\Signature::__construct
*
* @covers Lcobucci\JWT\Parser::parse
* @covers Lcobucci\JWT\Parser::splitJwt
* @covers Lcobucci\JWT\Parser::parseHeader
* @covers Lcobucci\JWT\Parser::parseClaims
* @covers Lcobucci\JWT\Parser::parseSignature
*/
public function parseMustReturnASignedTokenWhenSignatureIsInformed()
{
$this->decoder->expects($this->at(1))
->method('jsonDecode')
->willReturn(['typ' => 'JWT', 'alg' => 'HS256']);
$this->decoder->expects($this->at(3))
->method('jsonDecode')
->willReturn(['aud' => 'test']);
$this->decoder->expects($this->at(4))
->method('base64UrlDecode')
->willReturn('aaa');
$parser = $this->createParser();
$token = $parser->parse('a.a.a');
$this->assertAttributeEquals(['typ' => 'JWT', 'alg' => 'HS256'], 'headers', $token);
$this->assertAttributeEquals(['aud' => $this->defaultClaim], 'claims', $token);
$this->assertAttributeEquals(new Signature('aaa'), 'signature', $token);
}
}