From 21be80ff97c1af68df2d95481ce63d26c74d6bb8 Mon Sep 17 00:00:00 2001 From: Julian Maurice Date: Thu, 4 Jul 2013 11:32:06 +0200 Subject: [PATCH] Bug 7688: (follow-up) add unit tests for C4::Serials::GetNextSeq() These tests are split in two parts: "db dependent" and "db independent". GetNextSeq requires DB only when checking for irregularities. Signed-off-by: Galen Charlton --- t/Serials/GetNextSeq.t | 234 +++++++++++++++++++++++ t/db_dependent/Serials/GetNextSeq.t | 278 ++++++++++++++++++++++++++++ 2 files changed, 512 insertions(+) create mode 100644 t/Serials/GetNextSeq.t create mode 100644 t/db_dependent/Serials/GetNextSeq.t diff --git a/t/Serials/GetNextSeq.t b/t/Serials/GetNextSeq.t new file mode 100644 index 0000000000..fe5a3d7060 --- /dev/null +++ b/t/Serials/GetNextSeq.t @@ -0,0 +1,234 @@ +#!/usr/bin/perl + +use Modern::Perl; +use Test::More tests => 43; +use C4::Serials; + +# TEST CASE 1 - 1 variable, from 1 to 4 +my $subscription = { + lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1, + innerloop1 => 0, innerloop2 => 0, innerloop3 => 0, + skip_serialseq => 0, + irregularity => '', + locale => 'en', +}; +my $pattern = { + add1 => 1, add2 => 0, add3 => 0, + every1 => 1, every2 => 0, every3 => 0, + whenmorethan1 => 4, whenmorethan2 => 0, whenmorethan3 => 0, + setto1 => 1, setto2 => 0, setto3 => 0, + numberingmethod => 'X: {X}', + numbering1 => '', + numbering2 => '', + numbering3 => '', +}; + +my $seq = _next_seq($subscription, $pattern); +is($seq, 'X: 2'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: 3'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: 4'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: 1'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: 2'); + +# TEST CASE 2 - 1 variable, use 'dayname' numbering, from 1 to 7 +$subscription = { + lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1, + innerloop1 => 0, innerloop2 => 0, innerloop3 => 0, + skip_serialseq => 0, + irregularity => '', + locale => 'C', +}; +$pattern = { + add1 => 1, add2 => 0, add3 => 0, + every1 => 1, every2 => 0, every3 => 0, + whenmorethan1 => 7, whenmorethan2 => 0, whenmorethan3 => 0, + setto1 => 1, setto2 => 0, setto3 => 0, + numberingmethod => 'X: {X}', + numbering1 => 'dayname', + numbering2 => '', + numbering3 => '', +}; + +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: Tuesday'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: Wednesday'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: Thursday'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: Friday'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: Saturday'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: Sunday'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: Monday'); + +# TEST CASE 3 - 1 variable, use 'monthname' numbering, from 0 to 11 by step of 2 +$subscription = { + lastvalue1 => 0, lastvalue2 => 1, lastvalue3 => 1, + innerloop1 => 0, innerloop2 => 0, innerloop3 => 0, + skip_serialseq => 0, + irregularity => '', + locale => 'C', # locale set to 'C' to ensure we'll have english strings +}; +$pattern = { + add1 => 2, add2 => 0, add3 => 0, + every1 => 1, every2 => 0, every3 => 0, + whenmorethan1 => 11, whenmorethan2 => 0, whenmorethan3 => 0, + setto1 => 0, setto2 => 0, setto3 => 0, + numberingmethod => 'X: {X}', + numbering1 => 'monthname', + numbering2 => '', + numbering3 => '', +}; + +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: March'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: May'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: July'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: September'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: November'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: January'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: March'); + +# TEST CASE 4 - 1 variable, use 'season' numbering, from 0 to 3 +# Months starts at 0, this implies subscription's lastvalue1 should be 0, +# together with setto1 and whenmorethan1 should be 11 +$subscription = { + lastvalue1 => 0, lastvalue2 => 1, lastvalue3 => 1, + innerloop1 => 0, innerloop2 => 0, innerloop3 => 0, + skip_serialseq => 0, + irregularity => '', + locale => 'C', # locale set to 'C' to ensure we'll have english strings +}; +$pattern = { + add1 => 1, add2 => 0, add3 => 0, + every1 => 1, every2 => 0, every3 => 0, + whenmorethan1 => 3, whenmorethan2 => 0, whenmorethan3 => 0, + setto1 => 0, setto2 => 0, setto3 => 0, + numberingmethod => 'X: {X}', + numbering1 => 'season', + numbering2 => '', + numbering3 => '', +}; + +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: Summer'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: Fall'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: Winter'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: Spring'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'X: Summer'); + +# TEST CASE 5 - 2 variables, from 1 to 12, and from 1 to 4 +$subscription = { + lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1, + innerloop1 => 0, innerloop2 => 0, innerloop3 => 0, + skip_serialseq => 0, + irregularity => '', + locale => 'C', # locale set to 'C' to ensure we'll have english strings +}; +$pattern = { + add1 => 1, add2 => 1, add3 => 0, + every1 => 1, every2 => 4, every3 => 0, + whenmorethan1 => 4, whenmorethan2 => 12, whenmorethan3 => 0, + setto1 => 1, setto2 => 1, setto3 => 0, + numberingmethod => 'Y: {Y}, X: {X}', + numbering1 => '', + numbering2 => '', + numbering3 => '', +}; + +$seq = _next_seq($subscription, $pattern); +is($seq, 'Y: 1, X: 2'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Y: 1, X: 3'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Y: 1, X: 4'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Y: 2, X: 1'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Y: 2, X: 2'); +# Back to the future +for (my $i = 0; $i < 39; $i++) { + $seq = _next_seq($subscription, $pattern); +} +$seq = _next_seq($subscription, $pattern); +is($seq, 'Y: 12, X: 2'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Y: 12, X: 3'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Y: 12, X: 4'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Y: 1, X: 1'); + +# TEST CASE 6 - 3 variables, from 1 to 12, from 1 to 8, and from 1 to 4 +$subscription = { + lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1, + innerloop1 => 0, innerloop2 => 0, innerloop3 => 0, + skip_serialseq => 0, + irregularity => '', + locale => 'C', # locale set to 'C' to ensure we'll have english strings +}; +$pattern = { + add1 => 1, add2 => 1, add3 => 1, + every1 => 1, every2 => 4, every3 => 32, + whenmorethan1 => 4, whenmorethan2 => 8, whenmorethan3 => 12, + setto1 => 1, setto2 => 1, setto3 => 1, + numberingmethod => 'Z: {Z}, Y: {Y}, X: {X}', + numbering1 => '', + numbering2 => '', + numbering3 => '', +}; + +$seq = _next_seq($subscription, $pattern); +is($seq, 'Z: 1, Y: 1, X: 2'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Z: 1, Y: 1, X: 3'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Z: 1, Y: 1, X: 4'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Z: 1, Y: 2, X: 1'); +for (my $i = 0; $i < 24; $i++) { + $seq = _next_seq($subscription, $pattern); +} +$seq = _next_seq($subscription, $pattern); +is($seq, 'Z: 1, Y: 8, X: 2'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Z: 1, Y: 8, X: 3'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Z: 1, Y: 8, X: 4'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Z: 2, Y: 1, X: 1'); +for (my $i = 0; $i < 350; $i++) { + $seq = _next_seq($subscription, $pattern); +} +$seq = _next_seq($subscription, $pattern); +is($seq, 'Z: 12, Y: 8, X: 4'); +$seq = _next_seq($subscription, $pattern); +is($seq, 'Z: 1, Y: 1, X: 1'); + + +sub _next_seq { + my ($subscription, $pattern) = @_; + my $seq; + ($seq, $subscription->{lastvalue1}, $subscription->{lastvalue2}, + $subscription->{lastvalue3}, $subscription->{innerloop1}, + $subscription->{innerloop2}, $subscription->{innerloop3}) = + GetNextSeq($subscription, $pattern); + return $seq; +} diff --git a/t/db_dependent/Serials/GetNextSeq.t b/t/db_dependent/Serials/GetNextSeq.t new file mode 100644 index 0000000000..a569c770f8 --- /dev/null +++ b/t/db_dependent/Serials/GetNextSeq.t @@ -0,0 +1,278 @@ +#!/usr/bin/perl + +use C4::Context; +use Test::More tests => 32; +use Modern::Perl; + +my $dbh = C4::Context->dbh; +$dbh->{RaiseError} = 1; +$dbh->{AutoCommit} = 0; + +use C4::Serials::Frequency; +use C4::Serials; + +my $frequency = { + description => "One issue per day", + unit => 'day', + issuesperunit => 1, + unitsperissue => 1, +}; +my $id = AddSubscriptionFrequency($frequency); + +# TEST CASE 1 - 1 variable, from 1 to 4 +my $pattern = { + add1 => 1, add2 => 0, add3 => 0, + every1 => 1, every2 => 0, every3 => 0, + whenmorethan1 => 4, whenmorethan2 => 0, whenmorethan3 => 0, + setto1 => 1, setto2 => 0, setto3 => 0, + numberingmethod => 'X: {X}', + numbering1 => '', + numbering2 => '', + numbering3 => '', +}; + +my $subscription = { + periodicity => $id, + firstacquidate => '1970-01-01', + lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1, + innerloop1 => 0, innerloop2 => 0, innerloop3 => 0, + skip_serialseq => 1, + irregularity => '3;5', + countissuesperunit => 1, + locale => 'en', +}; +my $publisheddate = $subscription->{firstacquidate}; + +my $seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: 2'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: 4'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: 2'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: 3'); + +# TEST CASE 2 - 1 variable, use 'dayname' numbering, from 1 to 7 +$subscription = { + periodicity => $id, + firstacquidate => '1970-01-01', + lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1, + innerloop1 => 0, innerloop2 => 0, innerloop3 => 0, + skip_serialseq => 1, + irregularity => '3;4;6', + countissuesperunit => 1, + locale => 'C', +}; +$pattern = { + add1 => 1, add2 => 0, add3 => 0, + every1 => 1, every2 => 0, every3 => 0, + whenmorethan1 => 7, whenmorethan2 => 0, whenmorethan3 => 0, + setto1 => 1, setto2 => 0, setto3 => 0, + numberingmethod => 'X: {X}', + numbering1 => 'dayname', + numbering2 => '', + numbering3 => '', +}; + +$publisheddate = $subscription->{firstacquidate}; + +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: Tuesday'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: Friday'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: Sunday'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: Monday'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: Tuesday'); + +# TEST CASE 3 - 1 variable, use 'monthname' numbering, from 0 to 11 by step of 2 +$subscription = { + periodicity => $id, + firstacquidate => '1970-01-01', + lastvalue1 => 0, lastvalue2 => 1, lastvalue3 => 1, + innerloop1 => 0, innerloop2 => 0, innerloop3 => 0, + skip_serialseq => 1, + irregularity => '3;4;6', + countissuesperunit => 1, + locale => 'C', +}; +$pattern = { + add1 => 2, add2 => 0, add3 => 0, + every1 => 1, every2 => 0, every3 => 0, + whenmorethan1 => 11, whenmorethan2 => 0, whenmorethan3 => 0, + setto1 => 0, setto2 => 0, setto3 => 0, + numberingmethod => 'X: {X}', + numbering1 => 'monthname', + numbering2 => '', + numbering3 => '', +}; + +$publisheddate = $subscription->{firstacquidate}; + +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: March'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: September'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: January'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: March'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: May'); + +# TEST CASE 4 - 1 variable, use 'season' numbering, from 0 to 3 +$subscription = { + periodicity => $id, + firstacquidate => '1970-01-01', + lastvalue1 => 0, lastvalue2 => 1, lastvalue3 => 1, + innerloop1 => 0, innerloop2 => 0, innerloop3 => 0, + skip_serialseq => 1, + irregularity => '3;4;6', + countissuesperunit => 1, + locale => 'C', +}; +$pattern = { + add1 => 1, add2 => 0, add3 => 0, + every1 => 1, every2 => 0, every3 => 0, + whenmorethan1 => 3, whenmorethan2 => 0, whenmorethan3 => 0, + setto1 => 0, setto2 => 0, setto3 => 0, + numberingmethod => 'X: {X}', + numbering1 => 'season', + numbering2 => '', + numbering3 => '', +}; + +$publisheddate = $subscription->{firstacquidate}; + +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: Summer'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: Spring'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: Fall'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: Winter'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'X: Spring'); + +# TEST CASE 5 - 2 variables, from 1 to 12, and from 1 to 4 +$subscription = { + periodicity => $id, + firstacquidate => '1970-01-01', + lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1, + innerloop1 => 0, innerloop2 => 0, innerloop3 => 0, + skip_serialseq => 1, + irregularity => '3;4;6', + countissuesperunit => 1, + locale => 'C', +}; +$pattern = { + add1 => 1, add2 => 1, add3 => 0, + every1 => 1, every2 => 4, every3 => 0, + whenmorethan1 => 4, whenmorethan2 => 12, whenmorethan3 => 0, + setto1 => 1, setto2 => 1, setto3 => 0, + numberingmethod => 'Y: {Y}, X: {X}', + numbering1 => '', + numbering2 => '', + numbering3 => '', +}; + +$publisheddate = $subscription->{firstacquidate}; + +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Y: 1, X: 2'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Y: 2, X: 1'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Y: 2, X: 3'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Y: 2, X: 4'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Y: 3, X: 1'); + +# TEST CASE 6 - 3 variables, from 1 to 12, from 1 to 8, and from 1 to 4 +$subscription = { + periodicity => $id, + firstacquidate => '1970-01-01', + lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1, + innerloop1 => 0, innerloop2 => 0, innerloop3 => 0, + skip_serialseq => 1, + irregularity => '3;4;6;110', + countissuesperunit => 1, + locale => 'C', +}; +$pattern = { + add1 => 1, add2 => 1, add3 => 1, + every1 => 1, every2 => 4, every3 => 32, + whenmorethan1 => 4, whenmorethan2 => 8, whenmorethan3 => 12, + setto1 => 1, setto2 => 1, setto3 => 1, + numberingmethod => 'Z: {Z}, Y: {Y}, X: {X}', + numbering1 => '', + numbering2 => '', + numbering3 => '', +}; + +$publisheddate = $subscription->{firstacquidate}; + +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Z: 1, Y: 1, X: 2'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Z: 1, Y: 2, X: 1'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Z: 1, Y: 2, X: 3'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Z: 1, Y: 2, X: 4'); +for (my $i = 0; $i < 100; $i++) { + $publisheddate = GetNextDate($subscription, $publisheddate); + $seq = _next_seq($subscription, $pattern, $publisheddate); +} +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Z: 4, Y: 4, X: 1'); +# 110th is here +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Z: 4, Y: 4, X: 3'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Z: 4, Y: 4, X: 4'); +$publisheddate = GetNextDate($subscription, $publisheddate); +$seq = _next_seq($subscription, $pattern, $publisheddate); +is($seq, 'Z: 4, Y: 5, X: 1'); + + +$dbh->rollback; + +sub _next_seq { + my ($subscription, $pattern, $publisheddate) = @_; + my $seq; + ($seq, $subscription->{lastvalue1}, $subscription->{lastvalue2}, + $subscription->{lastvalue3}, $subscription->{innerloop1}, + $subscription->{innerloop2}, $subscription->{innerloop3}) = + GetNextSeq($subscription, $pattern, $publisheddate); + return $seq; +} -- 2.20.1