2FAuth/tests/Feature/Services/QrCodeServiceTest.php

90 lines
18 KiB
PHP
Raw Permalink Normal View History

2021-11-30 17:39:33 +01:00
<?php
namespace Tests\Feature\Services;
use App\Facades\QrCode;
2024-09-25 08:37:37 +02:00
use App\Providers\TwoFAuthServiceProvider;
2023-08-01 11:28:27 +02:00
use App\Services\QrCodeService;
2024-07-03 11:16:08 +02:00
use Exception;
2023-08-01 11:28:27 +02:00
use PHPUnit\Framework\Attributes\CoversClass;
2024-07-03 11:16:08 +02:00
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Test;
2022-11-22 15:15:52 +01:00
use Tests\Classes\LocalFile;
use Tests\FeatureTestCase;
2024-07-03 11:16:08 +02:00
use Zxing\ChecksumException;
use Zxing\FormatException;
use Zxing\NotFoundException;
use Zxing\QrReader;
2021-11-30 17:39:33 +01:00
/**
2023-08-01 11:28:27 +02:00
* QrCodeServiceTest test class
2021-11-30 17:39:33 +01:00
*/
2023-08-01 11:28:27 +02:00
#[CoversClass(QrCodeService::class)]
#[CoversClass(QrCode::class)]
2024-09-25 08:37:37 +02:00
#[CoversClass(TwoFAuthServiceProvider::class)]
2021-11-30 17:39:33 +01:00
class QrCodeServiceTest extends FeatureTestCase
{
2024-09-27 00:00:53 +02:00
private const STRING_TO_ENCODE = 'x';
2022-11-22 15:15:52 +01:00
2024-09-27 14:40:20 +02:00
// private const STRING_ENCODED = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJxci1zdmcgcXJjb2RlIiB2aWV3Qm94PSIwIDAgMjUgMjUiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIj4KPHBhdGggY2xhc3M9InFyLWRhdGEgbGlnaHQgcXJjb2RlIiBmaWxsPSIjZmZmIiBkPSJNMTEgMiBoMSB2MSBoLTFaIE0xMyAyIGgxIHYxIGgtMVogTTExIDMgaDEgdjEgaC0xWiBNMTIgMyBoMSB2MSBoLTFaIE0xMyAzIGgxIHYxIGgtMVogTTExIDQgaDEgdjEgaC0xWiBNMTMgNCBoMSB2MSBoLTFaIE0xNCA0IGgxIHYxIGgtMVogTTExIDUgaDEgdjEgaC0xWiBNMTIgNSBoMSB2MSBoLTFaIE0xMyA1IGgxIHYxIGgtMVogTTEyIDYgaDEgdjEgaC0xWiBNMTQgNyBoMSB2MSBoLTFaIE0xMSA5IGgxIHYxIGgtMVogTTEzIDkgaDEgdjEgaC0xWiBNMTQgOSBoMSB2MSBoLTFaIE0xMSAxMCBoMSB2MSBoLTFaIE0xMyAxMCBoMSB2MSBoLTFaIE0yIDExIGgxIHYxIGgtMVogTTYgMTEgaDEgdjEgaC0xWiBNMTEgMTEgaDEgdjEgaC0xWiBNMTIgMTEgaDEgdjEgaC0xWiBNMTQgMTEgaDEgdjEgaC0xWiBNMTYgMTEgaDEgdjEgaC0xWiBNMTggMTEgaDEgdjEgaC0xWiBNMjAgMTEgaDEgdjEgaC0xWiBNMjIgMTEgaDEgdjEgaC0xWiBNMiAxMiBoMSB2MSBoLTFaIE0zIDEyIGgxIHYxIGgtMVogTTQgMTIgaDEgdjEgaC0xWiBNNiAxMiBoMSB2MSBoLTFaIE05IDEyIGgxIHYxIGgtMVogTTExIDEyIGgxIHYxIGgtMVogTTE0IDEyIGgxIHYxIGgtMVogTTE4IDEyIGgxIHYxIGgtMVogTTE5IDEyIGgxIHYxIGgtMVogTTMgMTMgaDEgdjEgaC0xWiBNNCAxMyBoMSB2MSBoLTFaIE05IDEzIGgxIHYxIGgtMVogTTExIDEzIGgxIHYxIGgtMVogTTEyIDEzIGgxIHYxIGgtMVogTTE2IDEzIGgxIHYxIGgtMVogTTIwIDEzIGgxIHYxIGgtMVogTTIyIDEzIGgxIHYxIGgtMVogTTMgMTQgaDEgdjEgaC0xWiBNMTAgMTQgaDEgdjEgaC0xWiBNMTEgMTQgaDEgdjEgaC0xWiBNMTIgMTQgaDEgdjEgaC0xWiBNMTQgMTQgaDEgdjEgaC0xWiBNMTggMTQgaDEgdjEgaC0xWiBNMjEgMTQgaDEgdjEgaC0xWiBNMjIgMTQgaDEgdjEgaC0xWiBNMTMgMTUgaDEgdjEgaC0xWiBNMTQgMTUgaDEgdjEgaC0xWiBNMTUgMTUgaDEgdjEgaC0xWiBNMTcgMTUgaDEgdjEgaC0xWiBNMTggMTUgaDEgdjEgaC0xWiBNMTkgMTUgaDEgdjEgaC0xWiBNMjAgMTUgaDEgdjEgaC0xWiBNMjEgMTUgaDEgdjEgaC0xWiBNMTEgMTYgaDEgdjEgaC0xWiBNMTMgMTYgaDEgdjEgaC0xWiBNMTUgMTYgaDEgdjEgaC0xWiBNMTYgMTYgaDEgdjEgaC0xWiBNMTcgMTYgaDEgdjEgaC0xWiBNMjAgMTYgaDEgdjEgaC0xWiBNMTIgMTcgaDEgdjEgaC0xWiBNMTMgMTcgaDEgdjEgaC0xWiBNMTQgMTcgaDEgdjEgaC0xWiBNMTUgMTcgaDEgdjEgaC0xWiBNMTcgMTcgaDEgdjEgaC0xWiBNMTggMTcgaDEgdjEgaC0xWiBNMjEgMTcgaDEgdjEgaC0xWiBNMjIgMTcgaDEgdjEgaC0xWiBNMTEgMTggaDEgdjEgaC0xWiBNMTIgMTggaDEgdjEgaC0xWiBNMTMgMTggaDEgdjEgaC0xWiBNMTUgMTggaDEgdjEgaC0xWiBNMTcgMTggaDEgdjEgaC0xWiBNMTkgMTggaDEgdjEgaC0xWiBNMjEgMTggaDEgdjEgaC0xWiBNMTEgMTkgaDEgdjEgaC0xWiBNMTQgMTkgaDEgdjEgaC0xWiBNMTYgMTkgaDEgdjEgaC0xWiBNMTggMTkgaDEgdjEgaC0xWiBNMjAgMTkgaDEgdjEgaC0xWiBNMjIgMTkgaDEgdjEgaC0xWiBNMTQgMjAgaDEgdjEgaC0xWiBNMTggMjAgaDEgdjEgaC0xWiBNMTkgMjAgaDEgdjEgaC0xWiBNMjEgMjAgaDEgdjEgaC0xWiBNMTEgMjEgaDEgdjEgaC0xWiBNMTIgMjEgaDEgdjEgaC0xWiBNMTYgMjEgaDEgdjEgaC0xWiBNMjAgMjEgaDEgdjEgaC0xWiBNMjIgMjEgaDEgdjEgaC0xWiBNMTIgMjIgaDEgdjEgaC0xWiBNMTQgMjIgaDEgdjEgaC0xWiBNMTggMjIgaDEgdjEgaC0xWiBNMTkgMjIgaDEgdjEgaC0xWiIvPgo8cGF0aCBjbGFzcz0icXItZmluZGVyIGxpZ2h0IHFyY29kZSIgZmlsbD0iI2ZmZiIgZD0iTTMgMyBoMSB2MSBoLTFaIE00IDMgaDEgdjEgaC0xWiBNNSAzIGgxIHYxIGgtMVogTTYgMyBoMSB2MSBoLTFaIE03IDMgaDEgdjEgaC0xWiBNMTcgMyBoMSB2MSBoLTFaIE0xOCAzIGgxIHYxIGgtMVogTTE5IDMgaDEgdjEgaC0xWiBNMjAgMyBoMSB2MSBoLTFaIE0yMSAzIGgxIHYxIGgtMVogTTMgNCBoMSB2MSBoLTFaIE03IDQgaDEgdjEgaC0xWiBNMTcgNCBoMSB2MSBoLTFaIE0yMSA0IGgxIHYxIGgtMVogTTMgNSBoMSB2MSBoLTFaIE03IDUgaDEgdjEgaC0xWiBNMTcgNSBoMSB2MSBoLTFaIE0yMSA1IGgxIHYxIGgtMVogTTMgNiBoMSB2MSBoLTFaIE03IDYgaDEgdjEgaC0xWiBNMTcgNiBoMSB2MSBoLTFaIE0yMSA2IGgxIHYxIGgtMVogTTMgNyBoMSB2MSBoLTFaIE00IDcgaDEgdjEgaC0xWiBNNSA3IGgxIHYxIGgtMVogTTYgNyBoMSB2MSBoLTFaIE03IDcgaDEgdjEgaC0xWiBNMTcgNyBoMSB2MSBoLTFaIE0xOCA3IGgxIHYxIGgtMVogTTE5IDcgaDEgdjEgaC0xWiBNMjAgNyBoMSB2MSBoLTFaIE0yMSA3IGgxIHYxIGgtMVogTTMgMTcgaDEgdjEgaC0xWiBNNCAxNyBoMSB2MSBoLTFaIE01IDE3IGgxIHYxIGgtMVogTTYgMTcgaDEgdjEgaC0xWiBNNyAxNyBoMSB2MSBoLTFaIE0zIDE4IGgxIHYxIGgtMVogTTcgMTggaDEgdjEgaC0xWiBNMyAxOSBoMSB2MSBoLTFaIE03IDE5IGgxIHYxIGgtMVogTTMgMjAgaDEgdjEgaC0xWiBNNyAyMCBoMSB2MSBoLTFaIE0zIDIxIGgxIHYxIGgtMVogTTQgMjEgaDEgdjEgaC0xWiBNNSAyMSBoMSB2MSBoLTFaIE02IDIxIGgxIHYxIGgtMVogTTcgMjEgaDEgdjEgaC0xWiIvPgo8cGF0aCBjbGFzcz0icXItc2VwYXJhdG9yIGxpZ2h0IHFyY29kZSIgZmlsbD0iI2ZmZiIgZD0iTTkgMiBoMSB2MSBoLTFaIE0xNSAyIGgxIHYxIGgtMVogTTkgMyBoMSB2MSBoLTFaIE0xNSAzIGgxIHYxIGgtMVogTTkgNCBoMSB2MSBoLTFaIE0xNSA0IGgxIHYxIGgtMVogTTkgNSBoMSB2MSBoLTFaIE0xNSA1IGgxIHYxIGgtMVogTT
2022-11-22 15:15:52 +01:00
2021-11-30 17:39:33 +01:00
private const DECODED_IMAGE = 'otpauth://totp/test@test.com?secret=A4GRFHVIRBGY7UIW';
2022-12-13 12:07:29 +01:00
public function setUp() : void
2021-11-30 17:39:33 +01:00
{
parent::setUp();
}
2024-09-27 14:40:20 +02:00
// #[Test]
// public function test_encode_returns_correct_value()
// {
// $this->assertEquals(self::STRING_ENCODED, QrCode::encode(self::STRING_TO_ENCODE));
// }
2021-11-30 17:39:33 +01:00
#[Test]
2021-11-30 17:39:33 +01:00
public function test_decode_valid_image_returns_correct_value()
{
$file = LocalFile::fake()->validQrcode();
$this->assertEquals(self::DECODED_IMAGE, QrCode::decode($file));
2021-11-30 17:39:33 +01:00
}
#[Test]
2024-07-03 11:16:08 +02:00
public function test_decode_invalid_image_throws_an_exception()
2021-11-30 17:39:33 +01:00
{
$this->expectException(\App\Exceptions\InvalidQrCodeException::class);
QrCode::decode(LocalFile::fake()->invalidQrcode());
2021-11-30 17:39:33 +01:00
}
2024-07-03 11:16:08 +02:00
#[Test]
#[DataProvider('QrReaderExceptionProvider')]
2024-09-27 00:00:53 +02:00
public function test_decode_throws_an_exception($exception)
2024-07-03 11:16:08 +02:00
{
$this->expectException(\App\Exceptions\InvalidQrCodeException::class);
// QrReader is a final class, so we need to mock it here with a new object instance
// to then bind it to the container
$fileContent = LocalFile::fake()->validQrcode()->get();
2024-09-26 23:50:01 +02:00
$qrReader = \Mockery::mock(new QrReader($fileContent, QrReader::SOURCE_TYPE_BLOB))->makePartial();
2024-07-03 11:16:08 +02:00
$qrReader->shouldReceive('text')->andReturn('');
$qrReader->shouldReceive('getError')->andReturn($exception);
2024-09-26 23:50:01 +02:00
$this->app->bind(QrReader::class, function () use ($qrReader) {
2024-07-03 11:16:08 +02:00
return $qrReader;
});
QrCode::decode(LocalFile::fake()->validQrcode());
}
public static function QrReaderExceptionProvider()
{
return [
2024-09-26 23:50:01 +02:00
'NotFoundException' => [new NotFoundException],
'FormatException' => [new FormatException],
'ChecksumException' => [new ChecksumException],
'default' => [new Exception],
2024-07-03 11:16:08 +02:00
];
}
2022-11-22 15:15:52 +01:00
}