jingcai-php/vendor/tymon/jwt-auth/tests/PayloadTest.php

255 lines
7.1 KiB
PHP
Executable File

<?php
/*
* This file is part of jwt-auth.
*
* (c) Sean Tymon <tymon148@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Tymon\JWTAuth\Test;
use BadMethodCallException;
use Mockery;
use Tymon\JWTAuth\Claims\Audience;
use Tymon\JWTAuth\Claims\Claim;
use Tymon\JWTAuth\Claims\Collection;
use Tymon\JWTAuth\Claims\Expiration;
use Tymon\JWTAuth\Claims\IssuedAt;
use Tymon\JWTAuth\Claims\Issuer;
use Tymon\JWTAuth\Claims\JwtId;
use Tymon\JWTAuth\Claims\NotBefore;
use Tymon\JWTAuth\Claims\Subject;
use Tymon\JWTAuth\Exceptions\PayloadException;
use Tymon\JWTAuth\Payload;
use Tymon\JWTAuth\Validators\PayloadValidator;
class PayloadTest extends AbstractTestCase
{
/**
* @var \Mockery\MockInterface|\Tymon\JWTAuth\Validators\PayloadValidator
*/
protected $validator;
/**
* @var \Tymon\JWTAuth\Payload
*/
protected $payload;
public function setUp(): void
{
parent::setUp();
$this->payload = $this->getTestPayload();
}
/**
* @param array $extraClaims
* @return \Tymon\JWTAuth\Payload
*/
private function getTestPayload(array $extraClaims = [])
{
$claims = [
new Subject(1),
new Issuer('http://example.com'),
new Expiration($this->testNowTimestamp + 3600),
new NotBefore($this->testNowTimestamp),
new IssuedAt($this->testNowTimestamp),
new JwtId('foo'),
];
if ($extraClaims) {
$claims = array_merge($claims, $extraClaims);
}
$collection = Collection::make($claims);
$this->validator = Mockery::mock(PayloadValidator::class);
$this->validator->shouldReceive('setRefreshFlow->check')->andReturn($collection);
return new Payload($collection, $this->validator);
}
/** @test */
public function it_should_throw_an_exception_when_trying_to_add_to_the_payload()
{
$this->expectException(PayloadException::class);
$this->expectExceptionMessage('The payload is immutable');
$this->payload['foo'] = 'bar';
}
/** @test */
public function it_should_throw_an_exception_when_trying_to_remove_a_key_from_the_payload()
{
$this->expectException(PayloadException::class);
$this->expectExceptionMessage('The payload is immutable');
unset($this->payload['foo']);
}
/** @test */
public function it_should_cast_the_payload_to_a_string_as_json()
{
$this->assertSame((string) $this->payload, json_encode($this->payload->get(), JSON_UNESCAPED_SLASHES));
$this->assertJsonStringEqualsJsonString((string) $this->payload, json_encode($this->payload->get()));
}
/** @test */
public function it_should_allow_array_access_on_the_payload()
{
$this->assertTrue(isset($this->payload['iat']));
$this->assertSame($this->payload['sub'], 1);
$this->assertArrayHasKey('exp', $this->payload);
}
/** @test */
public function it_should_get_properties_of_payload_via_get_method()
{
$this->assertIsArray($this->payload->get());
$this->assertSame($this->payload->get('sub'), 1);
$this->assertSame(
$this->payload->get(function () {
return 'jti';
}),
'foo'
);
}
/** @test */
public function it_should_get_multiple_properties_when_passing_an_array_to_the_get_method()
{
$values = $this->payload->get(['sub', 'jti']);
$sub = $values[0];
$jti = $values[1];
$this->assertIsArray($values);
$this->assertSame($sub, 1);
$this->assertSame($jti, 'foo');
}
/** @test */
public function it_should_determine_whether_the_payload_has_a_claim()
{
$this->assertTrue($this->payload->has(new Subject(1)));
$this->assertFalse($this->payload->has(new Audience(1)));
}
/** @test */
public function it_should_magically_get_a_property()
{
$sub = $this->payload->getSubject();
$jti = $this->payload->getJwtId();
$iss = $this->payload->getIssuer();
$this->assertSame($sub, 1);
$this->assertSame($jti, 'foo');
$this->assertSame($iss, 'http://example.com');
}
/** @test */
public function it_should_invoke_the_instance_as_a_callable()
{
$payload = $this->payload;
$sub = $payload('sub');
$jti = $payload('jti');
$iss = $payload('iss');
$this->assertSame($sub, 1);
$this->assertSame($jti, 'foo');
$this->assertSame($iss, 'http://example.com');
$this->assertSame($payload(), $this->payload->toArray());
}
/** @test */
public function it_should_throw_an_exception_when_magically_getting_a_property_that_does_not_exist()
{
$this->expectException(BadMethodCallException::class);
$this->expectExceptionMessage('The claim [Foo] does not exist on the payload');
$this->payload->getFoo();
}
/** @test */
public function it_should_get_the_claims()
{
$claims = $this->payload->getClaims();
$this->assertInstanceOf(Expiration::class, $claims['exp']);
$this->assertInstanceOf(JwtId::class, $claims['jti']);
$this->assertInstanceOf(Subject::class, $claims['sub']);
$this->assertContainsOnlyInstancesOf(Claim::class, $claims);
}
/** @test */
public function it_should_get_the_object_as_json()
{
$this->assertJsonStringEqualsJsonString(json_encode($this->payload), $this->payload->toJson());
}
/** @test */
public function it_should_count_the_claims()
{
$this->assertSame(6, $this->payload->count());
$this->assertCount(6, $this->payload);
}
/** @test */
public function it_should_match_values()
{
$values = $this->payload->toArray();
$values['sub'] = (string) $values['sub'];
$this->assertTrue($this->payload->matches($values));
}
/** @test */
public function it_should_match_strict_values()
{
$values = $this->payload->toArray();
$this->assertTrue($this->payload->matchesStrict($values));
$this->assertTrue($this->payload->matches($values, true));
}
/** @test */
public function it_should_not_match_empty_values()
{
$this->assertFalse($this->payload->matches([]));
}
/** @test */
public function it_should_not_match_values()
{
$values = $this->payload->toArray();
$values['sub'] = 'dummy_subject';
$this->assertFalse($this->payload->matches($values));
}
/** @test */
public function it_should_not_match_strict_values()
{
$values = $this->payload->toArray();
$values['sub'] = (string) $values['sub'];
$this->assertFalse($this->payload->matchesStrict($values));
$this->assertFalse($this->payload->matches($values, true));
}
/** @test */
public function it_should_not_match_a_non_existing_claim()
{
$values = ['foo' => 'bar'];
$this->assertFalse($this->payload->matches($values));
}
}