rpcii-php/tests/NamedVerificationTest.php

70 lines
3.4 KiB
PHP

<?php
// NamedVerificationTest.php
// Created: 2025-01-17
// Updated: 2025-01-17
declare(strict_types=1);
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\{CoversClass,UsesClass};
use RPCii\{HmacVerificationProvider,NamedVerificationProvider};
#[CoversClass(NamedVerificationProvider::class)]
#[UsesClass(HmacVerificationProvider::class)]
final class NamedVerificationTest extends TestCase {
public function testNamedVerification(): void {
$procedure = 'test';
$params = 'meow=cool&the=bean';
$hmac1 = new HmacVerificationProvider(fn() => 'H2uuaRpLnHztg4LY');
$hmac2 = new HmacVerificationProvider(fn() => 'eDmteplrpgEb0yYHYpxkjrFP9cr66PPK');
$hmac3 = new HmacVerificationProvider(fn() => 'KB2G4iqhsOO6Y9Eg4cJy6AhpKpMSeIhFelYiCMTSmPvyt43vyY4ubdXGR8SZBbof');
$provider = new NamedVerificationProvider;
$provider->register('miku', $hmac1);
$provider->register('teto', $hmac2);
// test default
$token = $provider->sign(false, $procedure, $params);
$this->assertTrue(str_starts_with($token, 'miku:'));
$this->assertTrue($hmac1->verify(substr($token, 5), false, $procedure, $params));
$this->assertFalse($hmac2->verify(substr($token, 5), false, $procedure, $params));
$this->assertTrue($provider->verify($token, false, $procedure, $params));
// test prefixless for default
$token = $hmac1->sign(true, $procedure, $params);
$this->assertTrue($provider->verify($token, true, $procedure, $params));
// manually add prefix
$token = 'teto:' . $hmac2->sign(false, $procedure, $params);
$this->assertTrue($provider->verify($token, false, $procedure, $params));
// other one that needs prefix
$token = $provider->signWith('teto', true, $procedure, $params);
$this->assertTrue($provider->verify($token, true, $procedure, $params));
$this->assertFalse($provider->verify($token, false, $procedure, $params));
// changing the default
$provider->register('neru', $hmac3, true);
$token = $provider->sign(false, $procedure, $params);
$this->assertTrue(str_starts_with($token, 'neru:'));
$this->assertFalse($hmac1->verify(substr($token, 5), false, $procedure, $params));
$this->assertFalse($hmac2->verify(substr($token, 5), false, $procedure, $params));
$this->assertTrue($hmac3->verify(substr($token, 5), false, $procedure, $params));
$this->assertTrue($provider->verify($token, false, $procedure, $params));
// test prefixless for new default
$token = $hmac3->sign(true, $procedure, $params);
$this->assertTrue($provider->verify($token, true, $procedure, $params));
// this is a bit silly but there's honestly no reason why this shouldn't work
$provider->register('gumi', $provider);
$token = $provider->signWith('gumi', false, $procedure, $params);
$this->assertTrue(str_starts_with($token, 'gumi:neru:'));
$this->assertFalse($hmac1->verify(substr($token, 10), false, $procedure, $params));
$this->assertFalse($hmac2->verify(substr($token, 10), false, $procedure, $params));
$this->assertTrue($hmac3->verify(substr($token, 10), false, $procedure, $params));
$this->assertTrue($provider->verify(substr($token, 5), false, $procedure, $params));
$this->assertTrue($provider->verify($token, false, $procedure, $params));
}
}