2021-11-30 17:39:33 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Tests\Feature\Services;
|
|
|
|
|
2022-07-30 10:46:02 +02:00
|
|
|
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;
|
2024-06-26 14:29:13 +02:00
|
|
|
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 00:00:53 +02:00
|
|
|
private const STRING_ENCODED = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJxci1zdmcgcXJjb2RlIiB2aWV3Qm94PSIwIDAgMjUgMjUiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIj4KPHBhdGggY2xhc3M9InFyLWRhdGEgbGlnaHQgcXJjb2RlIiBmaWxsPSIjZmZmIiBkPSJNMTEgMiBoMSB2MSBoLTFaIE0xMyAyIGgxIHYxIGgtMVogTTExIDMgaDEgdjEgaC0xWiBNMTIgMyBoMSB2MSBoLTFaIE0xMyAzIGgxIHYxIGgtMVogTTExIDQgaDEgdjEgaC0xWiBNMTMgNCBoMSB2MSBoLTFaIE0xNCA0IGgxIHYxIGgtMVogTTExIDUgaDEgdjEgaC0xWiBNMTIgNSBoMSB2MSBoLTFaIE0xMyA1IGgxIHYxIGgtMVogTTEyIDYgaDEgdjEgaC0xWiBNMTQgNyBoMSB2MSBoLTFaIE0xMSA5IGgxIHYxIGgtMVogTTEzIDkgaDEgdjEgaC0xWiBNMTQgOSBoMSB2MSBoLTFaIE0xMSAxMCBoMSB2MSBoLTFaIE0xMyAxMCBoMSB2MSBoLTFaIE0yIDExIGgxIHYxIGgtMVogTTYgMTEgaDEgdjEgaC0xWiBNMTEgMTEgaDEgdjEgaC0xWiBNMTIgMTEgaDEgdjEgaC0xWiBNMTQgMTEgaDEgdjEgaC0xWiBNMTYgMTEgaDEgdjEgaC0xWiBNMTggMTEgaDEgdjEgaC0xWiBNMjAgMTEgaDEgdjEgaC0xWiBNMjIgMTEgaDEgdjEgaC0xWiBNMiAxMiBoMSB2MSBoLTFaIE0zIDEyIGgxIHYxIGgtMVogTTQgMTIgaDEgdjEgaC0xWiBNNiAxMiBoMSB2MSBoLTFaIE05IDEyIGgxIHYxIGgtMVogTTExIDEyIGgxIHYxIGgtMVogTTE0IDEyIGgxIHYxIGgtMVogTTE4IDEyIGgxIHYxIGgtMVogTTE5IDEyIGgxIHYxIGgtMVogTTMgMTMgaDEgdjEgaC0xWiBNNCAxMyBoMSB2MSBoLTFaIE05IDEzIGgxIHYxIGgtMVogTTExIDEzIGgxIHYxIGgtMVogTTEyIDEzIGgxIHYxIGgtMVogTTE2IDEzIGgxIHYxIGgtMVogTTIwIDEzIGgxIHYxIGgtMVogTTIyIDEzIGgxIHYxIGgtMVogTTMgMTQgaDEgdjEgaC0xWiBNMTAgMTQgaDEgdjEgaC0xWiBNMTEgMTQgaDEgdjEgaC0xWiBNMTIgMTQgaDEgdjEgaC0xWiBNMTQgMTQgaDEgdjEgaC0xWiBNMTggMTQgaDEgdjEgaC0xWiBNMjEgMTQgaDEgdjEgaC0xWiBNMjIgMTQgaDEgdjEgaC0xWiBNMTMgMTUgaDEgdjEgaC0xWiBNMTQgMTUgaDEgdjEgaC0xWiBNMTUgMTUgaDEgdjEgaC0xWiBNMTcgMTUgaDEgdjEgaC0xWiBNMTggMTUgaDEgdjEgaC0xWiBNMTkgMTUgaDEgdjEgaC0xWiBNMjAgMTUgaDEgdjEgaC0xWiBNMjEgMTUgaDEgdjEgaC0xWiBNMTEgMTYgaDEgdjEgaC0xWiBNMTMgMTYgaDEgdjEgaC0xWiBNMTUgMTYgaDEgdjEgaC0xWiBNMTYgMTYgaDEgdjEgaC0xWiBNMTcgMTYgaDEgdjEgaC0xWiBNMjAgMTYgaDEgdjEgaC0xWiBNMTIgMTcgaDEgdjEgaC0xWiBNMTMgMTcgaDEgdjEgaC0xWiBNMTQgMTcgaDEgdjEgaC0xWiBNMTUgMTcgaDEgdjEgaC0xWiBNMTcgMTcgaDEgdjEgaC0xWiBNMTggMTcgaDEgdjEgaC0xWiBNMjEgMTcgaDEgdjEgaC0xWiBNMjIgMTcgaDEgdjEgaC0xWiBNMTEgMTggaDEgdjEgaC0xWiBNMTIgMTggaDEgdjEgaC0xWiBNMTMgMTggaDEgdjEgaC0xWiBNMTUgMTggaDEgdjEgaC0xWiBNMTcgMTggaDEgdjEgaC0xWiBNMTkgMTggaDEgdjEgaC0xWiBNMjEgMTggaDEgdjEgaC0xWiBNMTEgMTkgaDEgdjEgaC0xWiBNMTQgMTkgaDEgdjEgaC0xWiBNMTYgMTkgaDEgdjEgaC0xWiBNMTggMTkgaDEgdjEgaC0xWiBNMjAgMTkgaDEgdjEgaC0xWiBNMjIgMTkgaDEgdjEgaC0xWiBNMTQgMjAgaDEgdjEgaC0xWiBNMTggMjAgaDEgdjEgaC0xWiBNMTkgMjAgaDEgdjEgaC0xWiBNMjEgMjAgaDEgdjEgaC0xWiBNMTEgMjEgaDEgdjEgaC0xWiBNMTIgMjEgaDEgdjEgaC0xWiBNMTYgMjEgaDEgdjEgaC0xWiBNMjAgMjEgaDEgdjEgaC0xWiBNMjIgMjEgaDEgdjEgaC0xWiBNMTIgMjIgaDEgdjEgaC0xWiBNMTQgMjIgaDEgdjEgaC0xWiBNMTggMjIgaDEgdjEgaC0xWiBNMTkgMjIgaDEgdjEgaC0xWiIvPgo8cGF0aCBjbGFzcz0icXItZmluZGVyIGxpZ2h0IHFyY29kZSIgZmlsbD0iI2ZmZiIgZD0iTTMgMyBoMSB2MSBoLTFaIE00IDMgaDEgdjEgaC0xWiBNNSAzIGgxIHYxIGgtMVogTTYgMyBoMSB2MSBoLTFaIE03IDMgaDEgdjEgaC0xWiBNMTcgMyBoMSB2MSBoLTFaIE0xOCAzIGgxIHYxIGgtMVogTTE5IDMgaDEgdjEgaC0xWiBNMjAgMyBoMSB2MSBoLTFaIE0yMSAzIGgxIHYxIGgtMVogTTMgNCBoMSB2MSBoLTFaIE03IDQgaDEgdjEgaC0xWiBNMTcgNCBoMSB2MSBoLTFaIE0yMSA0IGgxIHYxIGgtMVogTTMgNSBoMSB2MSBoLTFaIE03IDUgaDEgdjEgaC0xWiBNMTcgNSBoMSB2MSBoLTFaIE0yMSA1IGgxIHYxIGgtMVogTTMgNiBoMSB2MSBoLTFaIE03IDYgaDEgdjEgaC0xWiBNMTcgNiBoMSB2MSBoLTFaIE0yMSA2IGgxIHYxIGgtMVogTTMgNyBoMSB2MSBoLTFaIE00IDcgaDEgdjEgaC0xWiBNNSA3IGgxIHYxIGgtMVogTTYgNyBoMSB2MSBoLTFaIE03IDcgaDEgdjEgaC0xWiBNMTcgNyBoMSB2MSBoLTFaIE0xOCA3IGgxIHYxIGgtMVogTTE5IDcgaDEgdjEgaC0xWiBNMjAgNyBoMSB2MSBoLTFaIE0yMSA3IGgxIHYxIGgtMVogTTMgMTcgaDEgdjEgaC0xWiBNNCAxNyBoMSB2MSBoLTFaIE01IDE3IGgxIHYxIGgtMVogTTYgMTcgaDEgdjEgaC0xWiBNNyAxNyBoMSB2MSBoLTFaIE0zIDE4IGgxIHYxIGgtMVogTTcgMTggaDEgdjEgaC0xWiBNMyAxOSBoMSB2MSBoLTFaIE03IDE5IGgxIHYxIGgtMVogTTMgMjAgaDEgdjEgaC0xWiBNNyAyMCBoMSB2MSBoLTFaIE0zIDIxIGgxIHYxIGgtMVogTTQgMjEgaDEgdjEgaC0xWiBNNSAyMSBoMSB2MSBoLTFaIE02IDIxIGgxIHYxIGgtMVogTTcgMjEgaDEgdjEgaC0xWiIvPgo8cGF0aCBjbGFzcz0icXItc2VwYXJhdG9yIGxpZ2h0IHFyY29kZSIgZmlsbD0iI2ZmZiIgZD0iTTkgMiBoMSB2MSBoLTFaIE0xNSAyIGgxIHYxIGgtMVogTTkgMyBoMSB2MSBoLTFaIE0xNSAzIGgxIHYxIGgtMVogTTkgNCBoMSB2MSBoLTFaIE0xNSA0IGgxIHYxIGgtMVogTTkgNSBoMSB2MSBoLTFaIE0xNSA1IGgxIHYxIGgtMVogTTkgN
|
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-06-26 14:29:13 +02:00
|
|
|
#[Test]
|
2021-11-30 17:39:33 +01:00
|
|
|
public function test_encode_returns_correct_value()
|
|
|
|
{
|
2022-07-30 10:46:02 +02:00
|
|
|
$this->assertEquals(self::STRING_ENCODED, QrCode::encode(self::STRING_TO_ENCODE));
|
2021-11-30 17:39:33 +01:00
|
|
|
}
|
|
|
|
|
2024-06-26 14:29:13 +02:00
|
|
|
#[Test]
|
2021-11-30 17:39:33 +01:00
|
|
|
public function test_decode_valid_image_returns_correct_value()
|
|
|
|
{
|
|
|
|
$file = LocalFile::fake()->validQrcode();
|
|
|
|
|
2022-07-30 10:46:02 +02:00
|
|
|
$this->assertEquals(self::DECODED_IMAGE, QrCode::decode($file));
|
2021-11-30 17:39:33 +01:00
|
|
|
}
|
|
|
|
|
2024-06-26 14:29:13 +02: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);
|
|
|
|
|
2022-07-30 10:46:02 +02:00
|
|
|
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
|
|
|
}
|