From 091d635b16902f3d9024200f3e00a6ed7ac0b59a Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Thu, 15 Dec 2016 01:31:01 -0300 Subject: [PATCH] Bug 17767: Unit tests This patch introduces tests for the new behaviour, and also enhances the existing ones aiming to reach full coverage. --- t/db_dependent/Koha_borrower_modifications.t | 250 ++++++++++++++++++--------- 1 file changed, 172 insertions(+), 78 deletions(-) diff --git a/t/db_dependent/Koha_borrower_modifications.t b/t/db_dependent/Koha_borrower_modifications.t index febe2f9..0755858 100755 --- a/t/db_dependent/Koha_borrower_modifications.t +++ b/t/db_dependent/Koha_borrower_modifications.t @@ -17,16 +17,18 @@ use Modern::Perl; -use Test::More tests => 11; +use Test::More tests => 6; use Test::Exception; use t::lib::TestBuilder; -use String::Random qw( random_string ); +use Digest::MD5 qw( md5_base64 md5_hex ); use Try::Tiny; use C4::Context; use C4::Members; +use C4::Members::Attributes qw( GetBorrowerAttributes ); +use Koha::Patrons; BEGIN { use_ok('Koha::Patron::Modification'); @@ -36,6 +38,47 @@ BEGIN { my $schema = Koha::Database->new->schema; my $builder = t::lib::TestBuilder->new; +subtest 'new() tests' => sub { + + plan tests => 3; + + $schema->storage->txn_begin; + + Koha::Patron::Modifications->search->delete; + + # Create new pending modification + Koha::Patron::Modification->new( + { verification_token => '1234567890', + surname => 'Hall', + firstname => 'Kyle' + } + )->store(); + + ## Get the new pending modification + my $borrower = Koha::Patron::Modifications->find( + { verification_token => '1234567890' } ); + + ## Verify we get the same data + is( $borrower->surname, 'Hall', + 'Found modification has matching surname' ); + + throws_ok { + Koha::Patron::Modification->new( + { verification_token => '1234567890', + surname => 'Hall', + firstname => 'Daria' + } + )->store(); + } + 'Koha::Exceptions::Patron::Modification::DuplicateVerificationToken', + 'Attempting to add a duplicate verification raises the correct exception'; + is( $@, + 'Duplicate verification token 1234567890', + 'Exception carries the right message' + ); + + $schema->storage->txn_rollback; +}; subtest 'store( extended_attributes ) tests' => sub { @@ -47,9 +90,9 @@ subtest 'store( extended_attributes ) tests' => sub { my $patron = $builder->build( { source => 'Borrower' } )->{borrowernumber}; - my $verification_token = random_string(".........."); + my $verification_token = md5_hex( time().{}.rand().{}.$$ ); my $valid_json_text = '[{"code":"CODE","value":"VALUE"}]'; - my $invalid_json_text = '[{'; + my $invalid_json_text = '[{"code":"CODE";"value":"VALUE"}]'; Koha::Patron::Modification->new( { verification_token => $verification_token, @@ -69,7 +112,7 @@ subtest 'store( extended_attributes ) tests' => sub { $valid_json_text, 'Patron modification correctly stored with valid JSON data' ); - $verification_token = random_string(".........."); + $verification_token = md5_hex( time().{}.rand().{}.$$ ); throws_ok { Koha::Patron::Modification->new( { verification_token => $verification_token, @@ -87,97 +130,148 @@ subtest 'store( extended_attributes ) tests' => sub { $schema->storage->txn_rollback; }; +subtest 'approve tests' => sub { -$schema->storage->txn_begin; + plan tests => 7; -my $dbh = C4::Context->dbh; -$dbh->do("DELETE FROM borrower_modifications"); + $schema->storage->txn_begin; -## Create new pending modification -Koha::Patron::Modification->new( - { - verification_token => '1234567890', - surname => 'Hall', - firstname => 'Kyle' - } -)->store(); + Koha::Patron::Modifications->search->delete; -## Ensure duplicate verification tokens cannot be added to the database -try { - Koha::Patron::Modification->new( - { - verification_token => '1234567890', - surname => 'Hall', - firstname => 'Daria' + my $patron_hashref = $builder->build( { source => 'Borrower' } ); + $builder->build( + { source => 'BorrowerAttributeType', value => { code => 'CODE_1' } } + ); + $builder->build( + { source => 'BorrowerAttributeType', value => { code => 'CODE_2' } } + ); + my $verification_token = md5_hex( time().{}.rand().{}.$$ ); + my $valid_json_text + = '[{"code":"CODE_1","value":"VALUE_1"},{"code":"CODE_2","value":"VALUE_2"}]'; + my $patron_modification = Koha::Patron::Modification->new( + { borrowernumber => $patron_hashref->{borrowernumber}, + firstname => 'Kyle', + verification_token => $verification_token, + extended_attributes => $valid_json_text } )->store(); -} catch { - ok( $_->isa('Koha::Exceptions::Patron::Modification::DuplicateVerificationToken'), - 'Attempting to add a duplicate verification token to the database should raise a Koha::Exceptions::Koha::Patron::Modification::DuplicateVerificationToken exception' ); - is( $_->message, "Duplicate verification token 1234567890", 'Exception carries the right message' ); + + ok( $patron_modification->approve, + 'Patron modification correctly approved' ); + my $patron = Koha::Patrons->find( $patron_hashref->{borrowernumber} ); + isnt( + $patron->firstname, + $patron_hashref->{firstname}, + 'Patron modification changed firstname' + ); + is( $patron->firstname, 'Kyle', + 'Patron modification set the right firstname' ); + my @patron_attributes = GetBorrowerAttributes( $patron->borrowernumber ); + is( $patron_attributes[0][0]->{code}, + 'CODE_1', 'Patron modification correctly saved attribute code' ); + is( $patron_attributes[0][0]->{value}, + 'VALUE_1', 'Patron modification correctly saved attribute value' ); + + # Create a new Koha::Patron::Modification, skip extended_attributes to + # bypass checks + $patron_modification = Koha::Patron::Modification->new( + { borrowernumber => $patron_hashref->{borrowernumber}, + firstname => 'Kylie', + verification_token => $verification_token + } + )->store(); + + # Add invalid JSON to extended attributes + $patron_modification->extended_attributes( + '[{"code":"CODE";"values:VALUES"}]'); + throws_ok { $patron_modification->approve } + 'Koha::Exceptions::Patron::Modification::InvalidData', + 'The right exception is thrown if invalid data is on extended_attributes'; + + $patron = Koha::Patrons->find( $patron_hashref->{borrowernumber} ); + isnt( $patron->firstname, 'Kylie', 'Patron modification didn\'t apply' ); + + $schema->storage->txn_rollback; }; -## Get the new pending modification -my $borrower = - Koha::Patron::Modifications->find( { verification_token => '1234567890' } ); +subtest 'pending_count() and pending() tests' => sub { -## Verify we get the same data -is( $borrower->surname, 'Hall', 'Found modification has matching surname' ); + plan tests => 7; -## Create new pending modification for a patron -my $borr1 = $builder->build( { source => 'Borrower' } )->{borrowernumber}; + $schema->storage->txn_begin; -my $m1 = Koha::Patron::Modification->new( - { - borrowernumber => $borr1, - surname => 'Hall', - firstname => 'Kyle' - } -)->store(); - -## Test the counter -is( Koha::Patron::Modifications->pending_count, - 1, 'Test pending_count()' ); - -## Create new pending modification for another patron -my $borr2 = $builder->build( { source => 'Borrower' } )->{borrowernumber}; -my $m2 = Koha::Patron::Modification->new( - { - borrowernumber => $borr2, - surname => 'Smith', - firstname => 'Sandy' - } -)->store(); + Koha::Patron::Modifications->search->delete; + my $library_1 = $builder->build( { source => 'Branch' } )->{branchcode}; + my $library_2 = $builder->build( { source => 'Branch' } )->{branchcode}; + my $patron_1 + = $builder->build( + { source => 'Borrower', value => { branchcode => $library_1 } } ) + ->{borrowernumber}; + my $patron_2 + = $builder->build( + { source => 'Borrower', value => { branchcode => $library_2 } } ) + ->{borrowernumber}; + my $patron_3 + = $builder->build( + { source => 'Borrower', value => { branchcode => $library_2 } } ) + ->{borrowernumber}; + my $verification_token_1 = md5_hex( time().{}.rand().{}.$$ ); + my $verification_token_2 = md5_hex( time().{}.rand().{}.$$ ); + my $verification_token_3 = md5_hex( time().{}.rand().{}.$$ ); + + + my $modification_1 = Koha::Patron::Modification->new( + { borrowernumber => $patron_1, + surname => 'Hall', + firstname => 'Kyle', + verification_token => $verification_token_1 + } + )->store(); -## Test the counter -is( - Koha::Patron::Modifications->pending_count(), 2, -'Add a new pending modification and test pending_count() again' -); + is( Koha::Patron::Modifications->pending_count, + 1, 'pending_count() correctly returns 1' ); -## Check GetPendingModifications -my $pendings = Koha::Patron::Modifications->pending; -my @firstnames_mod = - sort ( $pendings->[0]->{firstname}, $pendings->[1]->{firstname} ); -ok( $firstnames_mod[0] eq 'Kyle', 'Test pending()' ); -ok( $firstnames_mod[1] eq 'Sandy', 'Test pending() again' ); + my $modification_2 = Koha::Patron::Modification->new( + { borrowernumber => $patron_2, + surname => 'Smith', + firstname => 'Sandy', + verification_token => $verification_token_2 + } + )->store(); + + my $modification_3 = Koha::Patron::Modification->new( + { borrowernumber => $patron_3, + surname => 'Smith', + firstname => 'Sandy', + verification_token => $verification_token_3 + } + )->store(); -## This should delete the row from the table -$m2->delete(); + is( Koha::Patron::Modifications->pending_count, + 3, 'pending_count() correctly returns 3' ); -## Save a copy of the borrowers original data -my $old_borrower = GetMember( borrowernumber => $borr1 ); + is( Koha::Patron::Modifications->pending_count($library_1), + 1, 'pending_count() correctly returns 1 if filtered by library' ); -## Apply the modifications -$m1->approve(); + is( Koha::Patron::Modifications->pending_count($library_2), + 2, 'pending_count() correctly returns 2 if filtered by library' ); -## Get a copy of the borrowers current data -my $new_borrower = GetMember( borrowernumber => $borr1 ); + $modification_1->approve; -## Check to see that the approved modifications were saved -ok( $new_borrower->{'surname'} eq 'Hall', - 'Test approve() applies modification to borrower' ); + is( Koha::Patron::Modifications->pending_count, + 2, 'pending_count() correctly returns 2' ); -$schema->storage->txn_rollback; + $modification_2->approve; + + is( Koha::Patron::Modifications->pending_count, + 1, 'pending_count() correctly returns 1' ); + + $modification_3->approve; + + is( Koha::Patron::Modifications->pending_count, + 0, 'pending_count() correctly returns 0' ); + + $schema->storage->txn_rollback; +}; 1; -- 2.7.4