Lines 19-27
Link Here
|
19 |
|
19 |
|
20 |
use Modern::Perl; |
20 |
use Modern::Perl; |
21 |
use Test::Deep qw( cmp_deeply re ); |
21 |
use Test::Deep qw( cmp_deeply re ); |
22 |
use Test::MockTime qw/set_fixed_time restore_time/; |
22 |
use Test::MockTime qw/set_fixed_time set_relative_time restore_time/; |
23 |
|
23 |
|
24 |
use Test::More tests => 32; |
24 |
use Test::More tests => 33; |
25 |
use DateTime; |
25 |
use DateTime; |
26 |
use File::Basename; |
26 |
use File::Basename; |
27 |
use File::Spec; |
27 |
use File::Spec; |
Lines 31-38
use XML::Simple;
Link Here
|
31 |
use YAML::XS; |
31 |
use YAML::XS; |
32 |
|
32 |
|
33 |
use t::lib::Mocks; |
33 |
use t::lib::Mocks; |
|
|
34 |
use t::lib::TestBuilder; |
34 |
|
35 |
|
35 |
use C4::Biblio qw( AddBiblio GetMarcBiblio ModBiblio ); |
36 |
use C4::Biblio qw( AddBiblio GetMarcBiblio ModBiblio DelBiblio ); |
36 |
use C4::Context; |
37 |
use C4::Context; |
37 |
use C4::OAI::Sets qw(AddOAISet); |
38 |
use C4::OAI::Sets qw(AddOAISet); |
38 |
|
39 |
|
Lines 510-512
subtest 'ListSets tests' => sub {
Link Here
|
510 |
|
511 |
|
511 |
$schema->storage->txn_rollback; |
512 |
$schema->storage->txn_rollback; |
512 |
}; |
513 |
}; |
|
|
514 |
|
515 |
subtest 'Tests for timestamp handling' => sub { |
516 |
|
517 |
plan tests => 27; |
518 |
|
519 |
t::lib::Mocks::mock_preference( 'OAI::PMH' => 1 ); |
520 |
t::lib::Mocks::mock_preference( 'OAI-PMH:MaxCount' => 3 ); |
521 |
t::lib::Mocks::mock_preference( 'OAI-PMH:ConfFile' => File::Spec->rel2abs(dirname(__FILE__)) . '/oaiconf_items.yaml' ); |
522 |
|
523 |
$schema->storage->txn_begin; |
524 |
|
525 |
my $sth_metadata = $dbh->prepare('UPDATE biblio_metadata SET timestamp=? WHERE biblionumber=?'); |
526 |
my $sth_del_metadata = $dbh->prepare('UPDATE deletedbiblio_metadata SET timestamp=? WHERE biblionumber=?'); |
527 |
my $sth_item = $dbh->prepare('UPDATE items SET timestamp=? WHERE itemnumber=?'); |
528 |
my $sth_del_item = $dbh->prepare('UPDATE deleteditems SET timestamp=? WHERE itemnumber=?'); |
529 |
|
530 |
my $builder = t::lib::TestBuilder->new; |
531 |
|
532 |
set_fixed_time(CORE::time() - 3600); |
533 |
|
534 |
my $utc_datetime = dt_from_string(undef, undef, 'UTC'); |
535 |
my $utc_timestamp = $utc_datetime->ymd . 'T' . $utc_datetime->hms . 'Z'; |
536 |
my $timestamp = dt_from_string(undef, 'sql'); |
537 |
|
538 |
# Test a bib with one item |
539 |
my $biblio1 = $builder->build_sample_biblio(); |
540 |
$sth_metadata->execute($timestamp, $biblio1->biblionumber); |
541 |
my $item1 = $builder->build_sample_item( |
542 |
{ |
543 |
biblionumber => $biblio1->biblionumber |
544 |
} |
545 |
); |
546 |
$sth_item->execute($timestamp, $item1->itemnumber); |
547 |
|
548 |
my $list_items = { |
549 |
verb => 'ListRecords', |
550 |
metadataPrefix => 'marc21', |
551 |
from => $utc_timestamp |
552 |
}; |
553 |
my $list_no_items = { |
554 |
verb => 'ListRecords', |
555 |
metadataPrefix => 'marcxml', |
556 |
from => $utc_timestamp |
557 |
}; |
558 |
|
559 |
my $get_items = { |
560 |
verb => 'GetRecord', |
561 |
metadataPrefix => 'marc21', |
562 |
identifier => 'TEST:' . $biblio1->biblionumber |
563 |
}; |
564 |
my $get_no_items = { |
565 |
verb => 'GetRecord', |
566 |
metadataPrefix => 'marcxml', |
567 |
identifier => 'TEST:' . $biblio1->biblionumber |
568 |
}; |
569 |
|
570 |
my $expected = { |
571 |
record => { |
572 |
header => { |
573 |
datestamp => $utc_timestamp, |
574 |
identifier => 'TEST:' . $biblio1->biblionumber |
575 |
}, |
576 |
metadata => { |
577 |
record => XMLin( |
578 |
GetMarcBiblio({ biblionumber => $biblio1->biblionumber, embed_items => 1, opac => 1 })->as_xml_record() |
579 |
) |
580 |
} |
581 |
} |
582 |
}; |
583 |
my $expected_no_items = { |
584 |
record => { |
585 |
header => { |
586 |
datestamp => $utc_timestamp, |
587 |
identifier => 'TEST:' . $biblio1->biblionumber |
588 |
}, |
589 |
metadata => { |
590 |
record => XMLin( |
591 |
GetMarcBiblio({ biblionumber => $biblio1->biblionumber, embed_items => 0, opac => 1 })->as_xml_record() |
592 |
) |
593 |
} |
594 |
} |
595 |
}; |
596 |
|
597 |
test_query( |
598 |
'ListRecords - biblio with a single item', |
599 |
$list_items, |
600 |
{ ListRecords => $expected } |
601 |
); |
602 |
test_query( |
603 |
'ListRecords - biblio with a single item (items not returned)', |
604 |
$list_no_items, |
605 |
{ ListRecords => $expected_no_items } |
606 |
); |
607 |
test_query( |
608 |
'GetRecord - biblio with a single item', |
609 |
$get_items, |
610 |
{ GetRecord => $expected } |
611 |
); |
612 |
test_query( |
613 |
'GetRecord - biblio with a single item (items not returned)', |
614 |
$get_no_items, |
615 |
{ GetRecord => $expected_no_items } |
616 |
); |
617 |
|
618 |
# Add an item 10 seconds later and check results |
619 |
set_relative_time(10); |
620 |
|
621 |
$utc_datetime = dt_from_string(undef, undef, 'UTC'); |
622 |
$utc_timestamp = $utc_datetime->ymd . 'T' . $utc_datetime->hms . 'Z'; |
623 |
$timestamp = dt_from_string(undef, 'sql'); |
624 |
|
625 |
my $item2 = $builder->build_sample_item( |
626 |
{ |
627 |
biblionumber => $biblio1->biblionumber |
628 |
} |
629 |
); |
630 |
$sth_item->execute($timestamp, $item2->itemnumber); |
631 |
|
632 |
$expected->{record}{header}{datestamp} = $utc_timestamp; |
633 |
$expected->{record}{metadata}{record} = XMLin( |
634 |
GetMarcBiblio({ biblionumber => $biblio1->biblionumber, embed_items => 1, opac => 1 })->as_xml_record() |
635 |
); |
636 |
|
637 |
test_query( |
638 |
'ListRecords - biblio with two items', |
639 |
$list_items, |
640 |
{ ListRecords => $expected } |
641 |
); |
642 |
test_query( |
643 |
'ListRecords - biblio with two items (items not returned)', |
644 |
$list_no_items, |
645 |
{ ListRecords => $expected_no_items } |
646 |
); |
647 |
test_query( |
648 |
'GetRecord - biblio with a two items', |
649 |
$get_items, |
650 |
{ GetRecord => $expected } |
651 |
); |
652 |
test_query( |
653 |
'GetRecord - biblio with a two items (items not returned)', |
654 |
$get_no_items, |
655 |
{ GetRecord => $expected_no_items } |
656 |
); |
657 |
|
658 |
# Set biblio timestamp 10 seconds later and check results |
659 |
set_relative_time(10); |
660 |
$utc_datetime = dt_from_string(undef, undef, 'UTC'); |
661 |
$utc_timestamp= $utc_datetime->ymd . 'T' . $utc_datetime->hms . 'Z'; |
662 |
$timestamp = dt_from_string(undef, 'sql'); |
663 |
|
664 |
$sth_metadata->execute($timestamp, $biblio1->biblionumber); |
665 |
|
666 |
$expected->{record}{header}{datestamp} = $utc_timestamp; |
667 |
$expected_no_items->{record}{header}{datestamp} = $utc_timestamp; |
668 |
|
669 |
test_query( |
670 |
"ListRecords - biblio with timestamp higher than item's", |
671 |
$list_items, |
672 |
{ ListRecords => $expected } |
673 |
); |
674 |
test_query( |
675 |
"ListRecords - biblio with timestamp higher than item's (items not returned)", |
676 |
$list_no_items, |
677 |
{ ListRecords => $expected_no_items } |
678 |
); |
679 |
test_query( |
680 |
"GetRecord - biblio with timestamp higher than item's", |
681 |
$get_items, |
682 |
{ GetRecord => $expected } |
683 |
); |
684 |
test_query( |
685 |
"GetRecord - biblio with timestamp higher than item's (items not returned)", |
686 |
$get_no_items, |
687 |
{ GetRecord => $expected_no_items } |
688 |
); |
689 |
|
690 |
# Delete an item 10 seconds later and check results |
691 |
set_relative_time(10); |
692 |
$utc_datetime = dt_from_string(undef, undef, 'UTC'); |
693 |
$utc_timestamp = $utc_datetime->ymd . 'T' . $utc_datetime->hms . 'Z'; |
694 |
|
695 |
$item1->safe_delete({ skip_record_index =>1 }); |
696 |
$sth_del_item->execute($timestamp, $item1->itemnumber); |
697 |
|
698 |
$expected->{record}{header}{datestamp} = $utc_timestamp; |
699 |
$expected->{record}{metadata}{record} = XMLin( |
700 |
GetMarcBiblio({ biblionumber => $biblio1->biblionumber, embed_items => 1, opac => 1 })->as_xml_record() |
701 |
); |
702 |
|
703 |
test_query( |
704 |
'ListRecords - biblio with existing and deleted item', |
705 |
$list_items, |
706 |
{ ListRecords => $expected } |
707 |
); |
708 |
test_query( |
709 |
'ListRecords - biblio with existing and deleted item (items not returned)', |
710 |
$list_no_items, |
711 |
{ ListRecords => $expected_no_items } |
712 |
); |
713 |
test_query( |
714 |
'GetRecord - biblio with existing and deleted item', |
715 |
$get_items, |
716 |
{ GetRecord => $expected } |
717 |
); |
718 |
test_query( |
719 |
'GetRecord - biblio with existing and deleted item (items not returned)', |
720 |
$get_no_items, |
721 |
{ GetRecord => $expected_no_items } |
722 |
); |
723 |
|
724 |
# Delete also the second item and verify results |
725 |
$item2->safe_delete({ skip_record_index =>1 }); |
726 |
$sth_del_item->execute($timestamp, $item2->itemnumber); |
727 |
|
728 |
$expected->{record}{metadata}{record} = XMLin( |
729 |
GetMarcBiblio({ biblionumber => $biblio1->biblionumber, embed_items => 1, opac => 1 })->as_xml_record() |
730 |
); |
731 |
|
732 |
test_query( |
733 |
'ListRecords - biblio with two deleted items', |
734 |
$list_items, |
735 |
{ ListRecords => $expected } |
736 |
); |
737 |
test_query( |
738 |
'ListRecords - biblio with two deleted items (items not returned)', |
739 |
$list_no_items, |
740 |
{ ListRecords => $expected_no_items } |
741 |
); |
742 |
test_query( |
743 |
'GetRecord - biblio with two deleted items', |
744 |
$get_items, |
745 |
{ GetRecord => $expected } |
746 |
); |
747 |
test_query( |
748 |
'GetRecord - biblio with two deleted items (items not returned)', |
749 |
$get_no_items, |
750 |
{ GetRecord => $expected_no_items } |
751 |
); |
752 |
|
753 |
# Delete the biblio 10 seconds later and check results |
754 |
set_relative_time(10); |
755 |
$utc_datetime = dt_from_string(undef, undef, 'UTC'); |
756 |
$utc_timestamp = $utc_datetime->ymd . 'T' . $utc_datetime->hms . 'Z'; |
757 |
$timestamp = dt_from_string(undef, 'sql'); |
758 |
|
759 |
is(undef, DelBiblio($biblio1->biblionumber, { skip_record_index =>1 }), 'Biblio deleted'); |
760 |
$sth_del_metadata->execute($timestamp, $biblio1->biblionumber); |
761 |
|
762 |
my $expected_header = { |
763 |
record => { |
764 |
header => { |
765 |
datestamp => $utc_timestamp, |
766 |
identifier => 'TEST:' . $biblio1->biblionumber, |
767 |
status => 'deleted' |
768 |
} |
769 |
} |
770 |
}; |
771 |
|
772 |
test_query( |
773 |
'ListRecords - deleted biblio with two deleted items', |
774 |
$list_items, |
775 |
{ ListRecords => $expected_header } |
776 |
); |
777 |
test_query( |
778 |
'ListRecords - deleted biblio with two deleted items (items not returned)', |
779 |
$list_no_items, |
780 |
{ ListRecords => $expected_header } |
781 |
); |
782 |
test_query( |
783 |
'GetRecord - deleted biblio with two deleted items', |
784 |
$get_items, |
785 |
{ GetRecord => $expected_header } |
786 |
); |
787 |
test_query( |
788 |
'GetRecord - deleted biblio with two deleted items (items not returned)', |
789 |
$get_no_items, |
790 |
{ GetRecord => $expected_header } |
791 |
); |
792 |
|
793 |
# Add a second biblio 10 seconds later and check that both are returned properly |
794 |
set_relative_time(10); |
795 |
$utc_datetime = dt_from_string(undef, undef, 'UTC'); |
796 |
$utc_timestamp = $utc_datetime->ymd . 'T' . $utc_datetime->hms . 'Z'; |
797 |
$timestamp = dt_from_string(undef, 'sql'); |
798 |
|
799 |
my $biblio2 = $builder->build_sample_biblio(); |
800 |
$sth_metadata->execute($timestamp, $biblio2->biblionumber); |
801 |
|
802 |
my $expected2 = { |
803 |
record => [ |
804 |
$expected_header->{record}, |
805 |
{ |
806 |
header => { |
807 |
datestamp => $utc_timestamp, |
808 |
identifier => 'TEST:' . $biblio2->biblionumber |
809 |
}, |
810 |
metadata => { |
811 |
record => XMLin( |
812 |
GetMarcBiblio({ biblionumber => $biblio2->biblionumber, embed_items => 1, opac => 1 })->as_xml_record() |
813 |
) |
814 |
} |
815 |
} |
816 |
] |
817 |
}; |
818 |
my $expected2_no_items = { |
819 |
record => [ |
820 |
$expected_header->{record}, |
821 |
{ |
822 |
header => { |
823 |
datestamp => $utc_timestamp, |
824 |
identifier => 'TEST:' . $biblio2->biblionumber |
825 |
}, |
826 |
metadata => { |
827 |
record => XMLin( |
828 |
GetMarcBiblio({ biblionumber => $biblio2->biblionumber, embed_items => 0, opac => 1 })->as_xml_record() |
829 |
) |
830 |
} |
831 |
} |
832 |
] |
833 |
}; |
834 |
|
835 |
test_query( |
836 |
'ListRecords - deleted biblio and normal biblio', |
837 |
$list_items, |
838 |
{ ListRecords => $expected2 } |
839 |
); |
840 |
test_query( |
841 |
'ListRecords - deleted biblio and normal biblio (items not returned)', |
842 |
$list_no_items, |
843 |
{ ListRecords => $expected2_no_items } |
844 |
); |
845 |
|
846 |
restore_time(); |
847 |
|
848 |
$schema->storage->txn_rollback; |
849 |
}; |
850 |
|