From a2d8dbcfd29e195b6efdfdd866601a3ceae8fe80 Mon Sep 17 00:00:00 2001
From: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Date: Thu, 13 Jan 2022 15:33:42 +0000
Subject: [PATCH] Bug 29873: Add unit test
Content-Type: text/plain; charset=utf-8

Test plan:
Run t/db_dependent/Koha/Auth/TwoFactorAuth.t

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Amended to reflect requested changes.
---
 t/db_dependent/Koha/Auth/TwoFactorAuth.t | 52 ++++++++++++++++++++++++
 1 file changed, 52 insertions(+)
 create mode 100755 t/db_dependent/Koha/Auth/TwoFactorAuth.t

diff --git a/t/db_dependent/Koha/Auth/TwoFactorAuth.t b/t/db_dependent/Koha/Auth/TwoFactorAuth.t
new file mode 100755
index 0000000000..6f76cd0749
--- /dev/null
+++ b/t/db_dependent/Koha/Auth/TwoFactorAuth.t
@@ -0,0 +1,52 @@
+use Modern::Perl;
+use Test::More tests => 1;
+
+use t::lib::Mocks;
+use t::lib::TestBuilder;
+
+use Koha::Database;
+use Koha::Auth::TwoFactorAuth;
+
+our $schema = Koha::Database->new->schema;
+our $builder = t::lib::TestBuilder->new;
+
+subtest 'qr_code' => sub {
+    plan tests => 9;
+
+    $schema->storage->txn_begin;
+
+    t::lib::Mocks::mock_preference('TwoFactorAuthentication', 1);
+    my $patron = $builder->build_object({ class => 'Koha::Patrons' });
+
+    # Testing without secret (might change later on)
+    is( $patron->secret, undef, 'Secret still undefined' );
+    my $auth = Koha::Auth::TwoFactorAuth->new({ patron => $patron });
+    is( $auth->secret, undef, 'Still no secret yet as expected' );
+    # Auth::GoogleAuth will generate a secret when calling qr_code
+    my $img_data = $auth->qr_code;
+    is( length($auth->secret32), 16, 'Secret of 16 base32 chars expected' );
+    is( length($img_data) > 22, 1, 'Dataurl not empty too' ); # prefix is 22
+    $auth->clear;
+
+    # Update patron data
+    $patron->secret('you2wont2guess2it'); # this is base32 btw
+    $patron->auth_method('two-factor');
+    $patron->store;
+
+    $auth = Koha::Auth::TwoFactorAuth->new({ patron => $patron });
+    $img_data = $auth->qr_code;
+    is( substr($img_data, 0, 22), 'data:image/png;base64,', 'Checking prefix of dataurl' );
+    like( substr($img_data, 22), qr/^[a-zA-Z0-9\/=+]+$/, 'Contains base64 chars' );
+    is( $auth->qr_code, $img_data, 'Repeated call' );
+    $auth->clear;
+
+    # Changing the secret should generate different data, right?
+    $patron->secret('no3really3not3cracked'); # base32
+    $patron->store;
+    $auth = Koha::Auth::TwoFactorAuth->new({ patron => $patron });
+    my $img_data02 = $auth->qr_code;
+    is( length($img_data02) > 22, 1, 'More characters than prefix' );
+    isnt( $img_data02, $img_data, 'Another secret, another image' );
+
+    $schema->storage->txn_rollback;
+};
-- 
2.20.1