Skip to content

Commit

Permalink
Add support for time mocking
Browse files Browse the repository at this point in the history
  • Loading branch information
SamMousa committed Oct 3, 2018
1 parent 8819941 commit 60bec7e
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 2 deletions.
19 changes: 17 additions & 2 deletions src/UrlSigner.php
Expand Up @@ -32,6 +32,12 @@ class UrlSigner extends Component
*/
private $_defaultExpirationInterval;

/**
* Stores the current timestamp, primarily used for testing.
* @var int
*/
private $_currentTimestamp;

/**
* @var string
*/
Expand All @@ -57,8 +63,13 @@ public function init(): void
public function setDefaultExpirationInterval(string $interval): void
{
$this->_defaultExpirationInterval = new \DateInterval($interval);
}

public function setCurrentTimestamp(?int $time): void
{
$this->_currentTimestamp = $time;
}

/**
* Calculates the HMAC for a URL.
**/
Expand Down Expand Up @@ -119,16 +130,20 @@ private function addExpiration(array &$params, ?\DateTimeInterface $expiration =
{
if (!empty($this->expirationParam)) {
if (!isset($expiration)) {
$expiration = (new \DateTime())->add($this->_defaultExpirationInterval);
$expiration = (new \DateTime('@' . $this->time()))->add($this->_defaultExpirationInterval);
}
$params[$this->expirationParam] = $expiration->getTimestamp();
}
}

private function time(): int
{
return $this->_currentTimestamp ?? \time();
}
private function checkExpiration(array $params): bool
{
// Check expiration date.
return !isset($params[$this->expirationParam]) || $params[$this->expirationParam] > time();
return !isset($params[$this->expirationParam]) || $params[$this->expirationParam] > $this->time();
}

/**
Expand Down
20 changes: 20 additions & 0 deletions tests/unit/UrlSignerTest.php
Expand Up @@ -172,4 +172,24 @@ public function testDefaultExpiration(): void
$this->assertContains('expires', $params);
$this->assertGreaterThan(\time() + 14 * 24 * 3600 - 100, $params['expires']);
}

public function testTimeMocking(): void
{
$signer = new SamIT\Yii2\UrlSigner\UrlSigner([
'secret' => 'test123',
'defaultExpirationInterval' => 'PT01S'
]);
$params = [
'/controller/action'
];
$signer->signParams($params);
$this->assertContains('expires', $params);
$this->assertSame(\time() + 1, $params['expires']);
$signer->setCurrentTimestamp(\time() - 10);
$this->assertTrue($signer->verify($params, '/controller/action'));
$signer->setCurrentTimestamp(null);
$this->assertTrue($signer->verify($params, '/controller/action'));
$signer->setCurrentTimestamp(\time() + 5);
$this->assertFalse($signer->verify($params, '/controller/action'));
}
}

0 comments on commit 60bec7e

Please sign in to comment.