clone of github.com/decent-newsroom/newsroom
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.
 
 
 
 
 
 

86 lines
3.2 KiB

<?php
declare(strict_types=1);
namespace App\Tests\Security;
use App\Kernel;
use swentel\nostr\Event\Event;
use swentel\nostr\Sign\Sign;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\HttpFoundation\Response;
class NostrAuthenticatorTest extends WebTestCase
{
/**
* Tests various authentication scenarios for the Nostr authenticator.
*
* This test sends a GET request to the /login endpoint with different Authorization headers
* and asserts that the response status code and content match the expected values provided
* by the data provider.
*
* @dataProvider provideAuthenticationData
*/
public function testAuthenticationScenarios(string $authorizationHeader, int $expectedStatusCode, string $expectedContent)
{
$client = static::createClient();
$client->request('GET', '/login', [], [], [
'HTTP_Authorization' => $authorizationHeader,
]);
$response = $client->getResponse();
$this->assertSame($expectedStatusCode, $response->getStatusCode());
$this->assertStringContainsString($expectedContent, $response->getContent());
}
/**
* @throws \JsonException
*/
public function provideAuthenticationData(): array
{
// Boot the kernel manually
$kernel = new Kernel('local', true);
$kernel->boot();
$container = $kernel->getContainer();
$nsec = $container->getParameter('nsec');
$note = new Event();
$note->setContent('');
$note->setKind(27235);
$note->setTags([
["u", "https://localhost/login"],
["method", "POST"]
]);
$signer = new Sign();
$signer->signEvent($note, $nsec);
$ser = $note->toJson();
$validToken = 'Nostr ' . base64_encode($ser);
$expiredToken = 'Nostr eyJjcmVhdGVkX2F0IjoxNzMzMzIxMzUyLCJraW5kIjoyNzIzNSwidGFncyI6W1sidSIsImh0dHBzOi8vbG9jYWxob3N0L2xvZ2luIl0sWyJtZXRob2QiLCJHRVQiXV0sImNvbnRlbnQiOiIiLCJwdWJrZXkiOiJkNDc1Y2U0YjM5Nzc1MDcxMzBmNDJjN2Y4NjM0NmVmOTM2ODAwZjNhZTc0ZDVlY2Y4MDg5MjgwY2RjMTkyM2U5IiwiaWQiOiJhYjA4NGM1NWQ5Y2UzMDliN2UxNzIyZGI2ODNjZTc2ZDg5NGNjN2QyYTIzZTRkNWUyMTUyYTM2Y2M2ODI1MTQ5Iiwic2lnIjoiOWI1Yjk2YjhkN2U2ZGM4YWU3ZmM4NjU2ZTE0NDVlZjkwYzc1YWQxNzZkYTRmNmNhMjI0NTRkNTJjNTk3ZTBmNjYwZjAwZjE3MmIxYjMzYzM4YTg2Y2U0YTBiMTdmMDgwMWEyNzJmZmVmYWU0NmY2OTgzZGZjYjRlM2YyZDgwZGYifQ==';
$invalidToken = 'InvalidHeader';
return [
// Scenario: Valid token
'valid_token' => [
'authorizationHeader' => $validToken,
'expectedStatusCode' => Response::HTTP_OK,
'expectedContent' => 'Authentication Successful',
],
// Scenario: Expired token
'expired_token' => [
'authorizationHeader' => $expiredToken,
'expectedStatusCode' => Response::HTTP_UNAUTHORIZED,
'expectedContent' => 'Unauthenticated',
],
// Scenario: Invalid header
'invalid_token' => [
'authorizationHeader' => $invalidToken,
'expectedStatusCode' => Response::HTTP_UNAUTHORIZED,
'expectedContent' => 'Unauthenticated',
]
];
}
}