Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test specific provider #86

Merged
merged 4 commits into from
Dec 29, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .github/workflows/test-bacon.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Test Bacon QR Code Provider

on:
push:
pull_request:

jobs:
build:
runs-on: ubuntu-latest

strategy:
matrix:
php-version: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1']

steps:
- uses: actions/checkout@v2

- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
tools: composer
coverage: xdebug
ini-values: error_reporting=E_ALL

- uses: ramsey/composer-install@v1

- run: composer require bacon/bacon-qr-code
Copy link
Contributor

@MasterOdin MasterOdin Dec 19, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not just make it a dev dependency? Same with the other third-party libraries? They're necessary to run the full test suite, and would avoid having an independent workflow across all supported PHP versions for this one (or several) external dependencies? Within the dev dependencies, you then can also specify the range you wish to test against (e.g. "bacon/bacon-qr-code": "^1 | ^2") and then within the composer install line pass --prefer-lowest when testing against PHP 5.6, where ^1 is only to test that the exception throws.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in reality, the end user would only install bacon or endroid so the tests should recreate that environment

also adding them both as development dependencies could get complicated as endroid relies on bacon


- run: composer lint
- run: composer test testsDependency/BaconQRCodeTest.php
13 changes: 10 additions & 3 deletions lib/Providers/Qr/BaconQrCodeProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,12 +125,19 @@ private function handleColour($colour)
{
if (is_string($colour) && $colour[0] == '#') {
$hexToRGB = function ($input) {
// ensure input no longer has a # for more predictable division
// PHP 8.1 does not like implicitly casting a float to an int
$input = trim($input, '#');

if (strlen($input) != 3 && strlen($input) != 6) {
throw new \RuntimeException('Colour should be a 3 or 6 character value after the #');
}

// split the array into three chunks
$split = str_split(trim($input, '#'), strlen($input) / 3);
$split = str_split($input, strlen($input) / 3);

// cope with three character hex reference
// three characters plus a # = 4
if (strlen($input) == 4) {
if (strlen($input) == 3) {
array_walk($split, function (&$character) {
$character = str_repeat($character, 2);
});
Expand Down
24 changes: 24 additions & 0 deletions lib/Providers/Qr/HandlesDataUri.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace RobThree\Auth\Providers\Qr;

trait HandlesDataUri
{
/**
* @param string $datauri
*
* @return null|array
*/
private function DecodeDataUri($datauri)
{
if (preg_match('/data:(?P<mimetype>[\w\.\-\+\/]+);(?P<encoding>\w+),(?P<data>.*)/', $datauri, $m) === 1) {
return array(
'mimetype' => $m['mimetype'],
'encoding' => $m['encoding'],
'data' => base64_decode($m['data'])
);
}

return null;
}
}
19 changes: 2 additions & 17 deletions tests/Providers/Qr/IQRCodeProviderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,11 @@
use PHPUnit\Framework\TestCase;
use RobThree\Auth\TwoFactorAuth;
use RobThree\Auth\TwoFactorAuthException;
use RobThree\Auth\Providers\Qr\HandlesDataUri;

class IQRCodeProviderTest extends TestCase
{
/**
* @param string $datauri
*
* @return null|array
*/
private function DecodeDataUri($datauri)
{
if (preg_match('/data:(?P<mimetype>[\w\.\-\/]+);(?P<encoding>\w+),(?P<data>.*)/', $datauri, $m) === 1) {
return array(
'mimetype' => $m['mimetype'],
'encoding' => $m['encoding'],
'data' => base64_decode($m['data'])
);
}

return null;
}
use HandlesDataUri;

/**
* @return void
Expand Down
61 changes: 61 additions & 0 deletions testsDependency/BaconQRCodeTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

namespace TestsDependency;

use BaconQrCode\Renderer\Image\ImagickImageBackEnd;
use PHPUnit\Framework\TestCase;
use RobThree\Auth\Providers\Qr\BaconQrCodeProvider;
use RobThree\Auth\TwoFactorAuth;
use RobThree\Auth\Providers\Qr\HandlesDataUri;

class BaconQRCodeTest extends TestCase
{
use HandlesDataUri;

public function testDependency()
{
// php < 7.1 will install an older Bacon QR Code
if (! class_exists(ImagickImageBackEnd::class)) {
$this->expectException(\RuntimeException::class);

$qr = new BaconQrCodeProvider(1, '#000', '#FFF', 'svg');
} else {
$qr = new BaconQrCodeProvider(1, '#000', '#FFF', 'svg');

$tfa = new TwoFactorAuth('Test&Issuer', 6, 30, 'sha1', $qr);

$data = $this->DecodeDataUri($tfa->getQRCodeImageAsDataUri('Test&Label', 'VMR466AB62ZBOKHE'));
$this->assertEquals('image/svg+xml', $data['mimetype']);
}
}

public function testBadTextColour()
{
$this->expectException(\RuntimeException::class);

new BaconQrCodeProvider(1, 'not-a-colour', '#FFF');
}

public function testBadBackgroundColour()
{
$this->expectException(\RuntimeException::class);

new BaconQrCodeProvider(1, '#000', 'not-a-colour');
}

public function testBadTextColourHexRef()
{
$this->expectException(\RuntimeException::class);

new BaconQrCodeProvider(1, '#AAAA', '#FFF');
}

public function testBadBackgroundColourHexRef()
{
$this->expectException(\RuntimeException::class);

new BaconQrCodeProvider(1, '#000', '#AAAA');
}


}