You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

633 lines
18 KiB

<?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\Encoder;
use Lcobucci\JWT\Signer\Key;
/**
* @author Luís Otávio Cobucci Oblonczyk <lcobucci@gmail.com>
* @since 0.1.0
*/
class BuilderTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Encoder|\PHPUnit_Framework_MockObject_MockObject
*/
protected $encoder;
/**
* @var ClaimFactory|\PHPUnit_Framework_MockObject_MockObject
*/
protected $claimFactory;
/**
* @var Claim|\PHPUnit_Framework_MockObject_MockObject
*/
protected $defaultClaim;
/**
* {@inheritdoc}
*/
protected function setUp()
{
$this->encoder = $this->createMock(Encoder::class);
$this->claimFactory = $this->createMock(ClaimFactory::class);
$this->defaultClaim = $this->createMock(Claim::class);
$this->claimFactory->expects($this->any())
->method('create')
->willReturn($this->defaultClaim);
}
/**
* @return Builder
*/
private function createBuilder()
{
return new Builder($this->encoder, $this->claimFactory);
}
/**
* @test
*
* @covers Lcobucci\JWT\Builder::__construct
*/
public function constructMustInitializeTheAttributes()
{
$builder = $this->createBuilder();
$this->assertAttributeEquals(['alg' => 'none', 'typ' => 'JWT'], 'headers', $builder);
$this->assertAttributeEquals([], 'claims', $builder);
$this->assertAttributeSame($this->encoder, 'encoder', $builder);
$this->assertAttributeSame($this->claimFactory, 'claimFactory', $builder);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::permittedFor
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function permittedForMustChangeTheAudClaim()
{
$builder = $this->createBuilder();
$builder->permittedFor('test');
$this->assertAttributeEquals(['alg' => 'none', 'typ' => 'JWT'], 'headers', $builder);
$this->assertAttributeEquals(['aud' => $this->defaultClaim], 'claims', $builder);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::permittedFor
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function permittedForCanReplicateItemOnHeader()
{
$builder = $this->createBuilder();
$builder->permittedFor('test', true);
$this->assertAttributeEquals(['aud' => $this->defaultClaim], 'claims', $builder);
$this->assertAttributeEquals(
['alg' => 'none', 'typ' => 'JWT', 'aud' => $this->defaultClaim],
'headers',
$builder
);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::permittedFor
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function permittedForMustKeepAFluentInterface()
{
$builder = $this->createBuilder();
$this->assertSame($builder, $builder->permittedFor('test'));
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::expiresAt
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function expiresAtMustChangeTheExpClaim()
{
$builder = $this->createBuilder();
$builder->expiresAt('2');
$this->assertAttributeEquals(['alg' => 'none', 'typ' => 'JWT'], 'headers', $builder);
$this->assertAttributeEquals(['exp' => $this->defaultClaim], 'claims', $builder);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::expiresAt
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function expiresAtCanReplicateItemOnHeader()
{
$builder = $this->createBuilder();
$builder->expiresAt('2', true);
$this->assertAttributeEquals(['exp' => $this->defaultClaim], 'claims', $builder);
$this->assertAttributeEquals(
['alg' => 'none', 'typ' => 'JWT', 'exp' => $this->defaultClaim],
'headers',
$builder
);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::expiresAt
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function expiresAtMustKeepAFluentInterface()
{
$builder = $this->createBuilder();
$this->assertSame($builder, $builder->expiresAt('2'));
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::identifiedBy
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function identifiedByMustChangeTheJtiClaim()
{
$builder = $this->createBuilder();
$builder->identifiedBy('2');
$this->assertAttributeEquals(['alg' => 'none', 'typ' => 'JWT'], 'headers', $builder);
$this->assertAttributeEquals(['jti' => $this->defaultClaim], 'claims', $builder);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::identifiedBy
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function identifiedByCanReplicateItemOnHeader()
{
$builder = $this->createBuilder();
$builder->identifiedBy('2', true);
$this->assertAttributeEquals(['jti' => $this->defaultClaim], 'claims', $builder);
$this->assertAttributeEquals(
['alg' => 'none', 'typ' => 'JWT', 'jti' => $this->defaultClaim],
'headers',
$builder
);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::identifiedBy
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function identifiedByMustKeepAFluentInterface()
{
$builder = $this->createBuilder();
$this->assertSame($builder, $builder->identifiedBy('2'));
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::issuedAt
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function issuedAtMustChangeTheIatClaim()
{
$builder = $this->createBuilder();
$builder->issuedAt('2');
$this->assertAttributeEquals(['alg' => 'none', 'typ' => 'JWT'], 'headers', $builder);
$this->assertAttributeEquals(['iat' => $this->defaultClaim], 'claims', $builder);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::issuedAt
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function issuedAtCanReplicateItemOnHeader()
{
$builder = $this->createBuilder();
$builder->issuedAt('2', true);
$this->assertAttributeEquals(['iat' => $this->defaultClaim], 'claims', $builder);
$this->assertAttributeEquals(
['alg' => 'none', 'typ' => 'JWT', 'iat' => $this->defaultClaim],
'headers',
$builder
);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::issuedAt
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function issuedAtMustKeepAFluentInterface()
{
$builder = $this->createBuilder();
$this->assertSame($builder, $builder->issuedAt('2'));
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::issuedBy
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function issuedByMustChangeTheIssClaim()
{
$builder = $this->createBuilder();
$builder->issuedBy('2');
$this->assertAttributeEquals(['alg' => 'none', 'typ' => 'JWT'], 'headers', $builder);
$this->assertAttributeEquals(['iss' => $this->defaultClaim], 'claims', $builder);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::issuedBy
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function issuedByCanReplicateItemOnHeader()
{
$builder = $this->createBuilder();
$builder->issuedBy('2', true);
$this->assertAttributeEquals(['iss' => $this->defaultClaim], 'claims', $builder);
$this->assertAttributeEquals(
['alg' => 'none', 'typ' => 'JWT', 'iss' => $this->defaultClaim],
'headers',
$builder
);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::issuedBy
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function issuedByMustKeepAFluentInterface()
{
$builder = $this->createBuilder();
$this->assertSame($builder, $builder->issuedBy('2'));
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::canOnlyBeUsedAfter
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function canOnlyBeUsedAfterMustChangeTheNbfClaim()
{
$builder = $this->createBuilder();
$builder->canOnlyBeUsedAfter('2');
$this->assertAttributeEquals(['alg' => 'none', 'typ' => 'JWT'], 'headers', $builder);
$this->assertAttributeEquals(['nbf' => $this->defaultClaim], 'claims', $builder);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::canOnlyBeUsedAfter
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function canOnlyBeUsedAfterCanReplicateItemOnHeader()
{
$builder = $this->createBuilder();
$builder->canOnlyBeUsedAfter('2', true);
$this->assertAttributeEquals(['nbf' => $this->defaultClaim], 'claims', $builder);
$this->assertAttributeEquals(
['alg' => 'none', 'typ' => 'JWT', 'nbf' => $this->defaultClaim],
'headers',
$builder
);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::canOnlyBeUsedAfter
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function canOnlyBeUsedAfterMustKeepAFluentInterface()
{
$builder = $this->createBuilder();
$this->assertSame($builder, $builder->canOnlyBeUsedAfter('2'));
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::relatedTo
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function relatedToMustChangeTheSubClaim()
{
$builder = $this->createBuilder();
$builder->relatedTo('2');
$this->assertAttributeEquals(['alg' => 'none', 'typ' => 'JWT'], 'headers', $builder);
$this->assertAttributeEquals(['sub' => $this->defaultClaim], 'claims', $builder);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::relatedTo
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function relatedToCanReplicateItemOnHeader()
{
$builder = $this->createBuilder();
$builder->relatedTo('2', true);
$this->assertAttributeEquals(['sub' => $this->defaultClaim], 'claims', $builder);
$this->assertAttributeEquals(
['alg' => 'none', 'typ' => 'JWT', 'sub' => $this->defaultClaim],
'headers',
$builder
);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
*
* @covers Lcobucci\JWT\Builder::relatedTo
* @covers Lcobucci\JWT\Builder::setRegisteredClaim
*/
public function relatedToMustKeepAFluentInterface()
{
$builder = $this->createBuilder();
$this->assertSame($builder, $builder->relatedTo('2'));
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
*
* @covers Lcobucci\JWT\Builder::withClaim
*/
public function withClaimMustConfigureTheGivenClaim()
{
$builder = $this->createBuilder();
$builder->withClaim('userId', 2);
$this->assertAttributeEquals(['userId' => $this->defaultClaim], 'claims', $builder);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
*
* @covers Lcobucci\JWT\Builder::withClaim
*/
public function withClaimMustKeepAFluentInterface()
{
$builder = $this->createBuilder();
$this->assertSame($builder, $builder->withClaim('userId', 2));
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
*
* @covers Lcobucci\JWT\Builder::withHeader
*/
public function withHeaderMustConfigureTheGivenClaim()
{
$builder = $this->createBuilder();
$builder->withHeader('userId', 2);
$this->assertAttributeEquals(
['alg' => 'none', 'typ' => 'JWT', 'userId' => $this->defaultClaim],
'headers',
$builder
);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
*
* @covers Lcobucci\JWT\Builder::withHeader
*/
public function withHeaderMustKeepAFluentInterface()
{
$builder = $this->createBuilder();
$this->assertSame($builder, $builder->withHeader('userId', 2));
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::getToken
* @uses Lcobucci\JWT\Token
*
* @covers Lcobucci\JWT\Builder::sign
*/
public function signMustConfigureSignerAndKey()
{
$signer = $this->createMock(Signer::class);
$builder = $this->createBuilder();
$builder->sign($signer, 'test');
$this->assertAttributeSame($signer, 'signer', $builder);
$this->assertAttributeEquals(new Key('test'), 'key', $builder);
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::getToken
* @uses Lcobucci\JWT\Token
*
* @covers Lcobucci\JWT\Builder::sign
*/
public function signMustKeepAFluentInterface()
{
$signer = $this->createMock(Signer::class);
$builder = $this->createBuilder();
$this->assertSame($builder, $builder->sign($signer, 'test'));
return $builder;
}
/**
* @test
*
* @depends signMustKeepAFluentInterface
*
* @covers Lcobucci\JWT\Builder::unsign
*/
public function unsignMustRemoveTheSignerAndKey(Builder $builder)
{
$builder->unsign();
$this->assertAttributeSame(null, 'signer', $builder);
$this->assertAttributeSame(null, 'key', $builder);
}
/**
* @test
*
* @depends signMustKeepAFluentInterface
*
* @covers Lcobucci\JWT\Builder::unsign
*/
public function unsignMustKeepAFluentInterface(Builder $builder)
{
$this->assertSame($builder, $builder->unsign());
}
/**
* @test
*
* @uses Lcobucci\JWT\Builder::__construct
* @uses Lcobucci\JWT\Builder::withClaim
* @uses Lcobucci\JWT\Token
*
* @covers Lcobucci\JWT\Builder::getToken
*/
public function getTokenMustReturnANewTokenWithCurrentConfiguration()
{
$signer = $this->createMock(Signer::class);
$signature = $this->createMock(Signature::class);
$signer->method('sign')->willReturn($signature);
$this->encoder->expects($this->exactly(2))
->method('jsonEncode')
->withConsecutive([['typ'=> 'JWT', 'alg' => 'none']], [['test' => $this->defaultClaim]])
->willReturnOnConsecutiveCalls('1', '2');
$this->encoder->expects($this->exactly(3))
->method('base64UrlEncode')
->withConsecutive(['1'], ['2'], [$signature])
->willReturnOnConsecutiveCalls('1', '2', '3');
$builder = $this->createBuilder()->withClaim('test', 123);
$token = $builder->getToken($signer, new Key('testing'));
$this->assertAttributeEquals(['1', '2', '3'], 'payload', $token);
$this->assertAttributeEquals($token->getHeaders(), 'headers', $builder);
$this->assertAttributeEquals($token->getClaims(), 'claims', $builder);
$this->assertAttributeSame($signature, 'signature', $token);
}
}