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
|
|
|
|
{
|
|
|
|
private const STRING_TO_ENCODE = 'stringToEncode';
|
2022-11-22 15:15:52 +01:00
|
|
|
|
2024-06-26 14:51:30 +02:00
|
|
|
private const STRING_ENCODED = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBjbGFzcz0icXItc3ZnIHFyY29kZSIgdmlld0JveD0iMCAwIDI1IDI1IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+DQo8cGF0aCBjbGFzcz0icXItZGF0YSBsaWdodCBxcmNvZGUiIGZpbGw9IiNmZmYiIGQ9Ik0xMiAyIGgxIHYxIGgtMVogTTEzIDIgaDEgdjEgaC0xWiBNMTIgMyBoMSB2MSBoLTFaIE0xMyAzIGgxIHYxIGgtMVogTTExIDQgaDEgdjEgaC0xWiBNMTMgNCBoMSB2MSBoLTFaIE0xMSA1IGgxIHYxIGgtMVogTTEyIDUgaDEgdjEgaC0xWiBNMTQgNSBoMSB2MSBoLTFaIE0xNCA2IGgxIHYxIGgtMVogTTExIDcgaDEgdjEgaC0xWiBNMTIgNyBoMSB2MSBoLTFaIE0xMyA3IGgxIHYxIGgtMVogTTE0IDcgaDEgdjEgaC0xWiBNMTMgOSBoMSB2MSBoLTFaIE0xNCA5IGgxIHYxIGgtMVogTTExIDEwIGgxIHYxIGgtMVogTTE0IDEwIGgxIHYxIGgtMVogTTIgMTEgaDEgdjEgaC0xWiBNMyAxMSBoMSB2MSBoLTFaIE01IDExIGgxIHYxIGgtMVogTTYgMTEgaDEgdjEgaC0xWiBNNyAxMSBoMSB2MSBoLTFaIE05IDExIGgxIHYxIGgtMVogTTEyIDExIGgxIHYxIGgtMVogTTEzIDExIGgxIHYxIGgtMVogTTE0IDExIGgxIHYxIGgtMVogTTMgMTIgaDEgdjEgaC0xWiBNNSAxMiBoMSB2MSBoLTFaIE02IDEyIGgxIHYxIGgtMVogTTkgMTIgaDEgdjEgaC0xWiBNMTEgMTIgaDEgdjEgaC0xWiBNMTMgMTIgaDEgdjEgaC0xWiBNMTQgMTIgaDEgdjEgaC0xWiBNMTYgMTIgaDEgdjEgaC0xWiBNMTggMTIgaDEgdjEgaC0xWiBNMjAgMTIgaDEgdjEgaC0xWiBNMyAxMyBoMSB2MSBoLTFaIE01IDEzIGgxIHYxIGgtMVogTTEwIDEzIGgxIHYxIGgtMVogTTExIDEzIGgxIHYxIGgtMVogTTEzIDEzIGgxIHYxIGgtMVogTTE0IDEzIGgxIHYxIGgtMVogTTE1IDEzIGgxIHYxIGgtMVogTTE2IDEzIGgxIHYxIGgtMVogTTE3IDEzIGgxIHYxIGgtMVogTTIwIDEzIGgxIHYxIGgtMVogTTIxIDEzIGgxIHYxIGgtMVogTTQgMTQgaDEgdjEgaC0xWiBNNyAxNCBoMSB2MSBoLTFaIE0xMiAxNCBoMSB2MSBoLTFaIE0xNSAxNCBoMSB2MSBoLTFaIE0xNiAxNCBoMSB2MSBoLTFaIE0xNyAxNCBoMSB2MSBoLTFaIE0xOCAxNCBoMSB2MSBoLTFaIE0yMCAxNCBoMSB2MSBoLTFaIE0yMSAxNCBoMSB2MSBoLTFaIE0yMiAxNCBoMSB2MSBoLTFaIE0xMSAxNSBoMSB2MSBoLTFaIE0xMiAxNSBoMSB2MSBoLTFaIE0xOCAxNSBoMSB2MSBoLTFaIE0yMCAxNSBoMSB2MSBoLTFaIE0yMiAxNSBoMSB2MSBoLTFaIE0xMSAxNiBoMSB2MSBoLTFaIE0xNCAxNiBoMSB2MSBoLTFaIE0xNSAxNiBoMSB2MSBoLTFaIE0xNiAxNiBoMSB2MSBoLTFaIE0xOSAxNiBoMSB2MSBoLTFaIE0yMSAxNiBoMSB2MSBoLTFaIE0yMiAxNiBoMSB2MSBoLTFaIE0xNCAxNyBoMSB2MSBoLTFaIE0xNiAxNyBoMSB2MSBoLTFaIE0xNyAxNyBoMSB2MSBoLTFaIE0yMSAxNyBoMSB2MSBoLTFaIE0xMyAxOCBoMSB2MSBoLTFaIE0xNSAxOCBoMSB2MSBoLTFaIE0xNiAxOCBoMSB2MSBoLTFaIE0xOCAxOCBoMSB2MSBoLTFaIE0yMiAxOCBoMSB2MSBoLTFaIE0xMSAxOSBoMSB2MSBoLTFaIE0xMiAxOSBoMSB2MSBoLTFaIE0xMyAxOSBoMSB2MSBoLTFaIE0xNSAxOSBoMSB2MSBoLTFaIE0xNyAxOSBoMSB2MSBoLTFaIE0xOCAxOSBoMSB2MSBoLTFaIE0xOSAxOSBoMSB2MSBoLTFaIE0yMiAxOSBoMSB2MSBoLTFaIE0xMSAyMCBoMSB2MSBoLTFaIE0xMiAyMCBoMSB2MSBoLTFaIE0xNSAyMCBoMSB2MSBoLTFaIE0xNyAyMCBoMSB2MSBoLTFaIE0xOCAyMCBoMSB2MSBoLTFaIE0yMSAyMCBoMSB2MSBoLTFaIE0yMiAyMCBoMSB2MSBoLTFaIE0xMyAyMSBoMSB2MSBoLTFaIE0xNyAyMSBoMSB2MSBoLTFaIE0xOSAyMSBoMSB2MSBoLTFaIE0yMCAyMSBoMSB2MSBoLTFaIE0yMSAyMSBoMSB2MSBoLTFaIE0xMSAyMiBoMSB2MSBoLTFaDQpNMTMgMjIgaDEgdjEgaC0xWiBNMTQgMjIgaDEgdjEgaC0xWiBNMTggMjIgaDEgdjEgaC0xWiBNMTkgMjIgaDEgdjEgaC0xWiBNMjEgMjIgaDEgdjEgaC0xWiBNMjIgMjIgaDEgdjEgaC0xWiIvPg0KPHBhdGggY2xhc3M9InFyLWZpbmRlciBsaWdodCBxcmNvZGUiIGZpbGw9IiNmZmYiIGQ9Ik0zIDMgaDEgdjEgaC0xWiBNNCAzIGgxIHYxIGgtMVogTTUgMyBoMSB2MSBoLTFaIE02IDMgaDEgdjEgaC0xWiBNNyAzIGgxIHYxIGgtMVogTTE3IDMgaDEgdjEgaC0xWiBNMTggMyBoMSB2MSBoLTFaIE0xOSAzIGgxIHYxIGgtMVogTTIwIDMgaDEgdjEgaC0xWiBNMjEgMyBoMSB2MSBoLTFaIE0zIDQgaDEgdjEgaC0xWiBNNyA0IGgxIHYxIGgtMVogTTE3IDQgaDEgdjEgaC0xWiBNMjEgNCBoMSB2MSBoLTFaIE0zIDUgaDEgdjEgaC0xWiBNNyA1IGgxIHYxIGgtMVogTTE3IDUgaDEgdjEgaC0xWiBNMjEgNSBoMSB2MSBoLTFaIE0zIDYgaDEgdjEgaC0xWiBNNyA2IGgxIHYxIGgtMVogTTE3IDYgaDEgdjEgaC0xWiBNMjEgNiBoMSB2MSBoLTFaIE0zIDcgaDEgdjEgaC0xWiBNNCA3IGgxIHYxIGgtMVogTTUgNyBoMSB2MSBoLTFaIE02IDcgaDEgdjEgaC0xWiBNNyA3IGgxIHYxIGgtMVogTTE3IDcgaDEgdjEgaC0xWiBNMTggNyBoMSB2MSBoLTFaIE0xOSA3IGgxIHYxIGgtMVogTTIwIDcgaDEgdjEgaC0xWiBNMjEgNyBoMSB2MSBoLTFaIE0zIDE3IGgxIHYxIGgtMVogTTQgMTcgaDEgdjEgaC0xWiBNNSAxNyBoMSB2MSBoLTFaIE02IDE3IGgxIHYxIGgtMVogTTcgMTcgaDEgdjEgaC0xWiBNMyAxOCBoMSB2MSBoLTFaIE03IDE4IGgxIHYxIGgtMVogTTMgMTkgaDEgdjEgaC0xWiBNNyAxOSBoMSB2MSBoLTFaIE0zIDIwIGgxIHYxIGgtMVogTTcgMjAgaDEgdjEgaC0xWiBNMyAyMSBoMSB2MSBoLTFaIE00IDIxIGgxIHYxIGgtMVogTTUgMjEgaDEgdjEgaC0xWiBNNiAyMSBoMSB2MSBoLTFaIE03IDIxIGgxIHYxIGgtMVoiLz4NCjxwYXRoIGNsYXNzPSJxci1zZXBhcmF0b3IgbGlnaHQgcXJjb2RlIiBmaWxsPSIjZmZmIiBkPSJNOSAyIGgxIHYxIGgtMVogTTE1IDIgaDEgd
|
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')]
|
|
|
|
public function test_decodee_throws_an_exception($exception)
|
|
|
|
{
|
|
|
|
$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();
|
|
|
|
$qrReader = \Mockery::mock(new QrReader($fileContent, QrReader::SOURCE_TYPE_BLOB))->makePartial();
|
|
|
|
$qrReader->shouldReceive('text')->andReturn('');
|
|
|
|
$qrReader->shouldReceive('getError')->andReturn($exception);
|
|
|
|
|
|
|
|
$this->app->bind(QrReader::class, function() use($qrReader) {
|
|
|
|
return $qrReader;
|
|
|
|
});
|
|
|
|
|
|
|
|
QrCode::decode(LocalFile::fake()->validQrcode());
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public static function QrReaderExceptionProvider()
|
|
|
|
{
|
|
|
|
return [
|
|
|
|
'NotFoundException' => [new NotFoundException()],
|
|
|
|
'FormatException' => [new FormatException()],
|
|
|
|
'ChecksumException' => [new ChecksumException()],
|
|
|
|
'default' => [new Exception()],
|
|
|
|
];
|
|
|
|
}
|
2022-11-22 15:15:52 +01:00
|
|
|
}
|