2 use base qw(Test::Class);
7 eval "use Test::Class";
8 plan skip_all => "Test::Class required for performing database tests" if $@;
9 # Or, maybe I should just die there.
11 if ( $ENV{'USER'} ne 'acm' ) {
12 die 'This test suite rewrites your database, so this is to keep you from accidently doing that.';
16 $ENV{'KOHA_CONF'} = '/home/acm/koha/dev/t/etc/koha-conf.xml';
28 # Since this is an abstract base class, this prevents these tests from
29 # being run directly unless we're testing a subclass. It just makes
31 __PACKAGE__->SKIP_CLASS( 1 );
34 =head2 startup methods
36 these are run once, at the beginning of the whole test suite
40 =head2 startup_10_prepare_database
42 prepare a blank database.
44 This ends up getting run once for each test module, so that's several
45 times throughout the test suite. That may be too many times to refresh
46 the database. We may have to tune that.
50 sub startup_10_prepare_database : Test(startup => 1) {
52 # this is how I'm refreshing my database for now. I'll think of
53 # something better later. Eventually, I'd like to drop the
54 # database entirely and use the regular install code to rebuild a
56 my $class = ref $self;
58 # like( C4::Context->config( 'database '), qr/test$/, 'using test database: ' . C4::Context->config( 'database' ) )
59 like( C4::Context->database(), qr/test$/, 'using test database: ' . C4::Context->database() )
60 or BAIL_OUT( 'This appears to not be a test database.' );
65 sub startup_15_truncate_tables : Test( startup => 1 ) {
68 # my @truncate_tables = qw( accountlines
80 # auth_subfield_structure
107 # import_record_matches
117 # language_descriptions
118 # language_rfc4646_to_iso639
119 # language_script_bidi
120 # language_script_mapping
121 # language_subtag_registry
124 # marc_subfield_structure
127 # matcher_matchpoints
128 # matchpoint_component_norms
129 # matchpoint_components
142 # repeatable_holidays
159 # subscriptionhistory
160 # subscriptionroutinglist
165 # virtualshelfcontents
171 my @truncate_tables = qw( accountlines
192 import_record_matches
224 subscriptionroutinglist
230 my $failed_to_truncate = 0;
231 foreach my $table ( @truncate_tables ) {
232 my $dbh = C4::Context->dbh();
233 $dbh->do( "truncate $table" )
234 or $failed_to_truncate = 1;
236 is( $failed_to_truncate, 0, 'truncated tables' );
240 =head2 startup_20_add_bookseller
242 we need a bookseller for many of the tests, so let's insert one. Feel
243 free to use this one, or insert your own.
247 sub startup_20_add_bookseller : Test(startup => 1) {
250 my $booksellerinfo = { name => 'bookseller ' . $self->random_string(),
253 my $id = AddBookseller( $booksellerinfo );
254 ok( $id, "created bookseller: $id" );
255 $self->{'booksellerid'} = $id;
260 =head2 startup_22_add_bookfund
262 we need a bookfund for many of the tests. This currently uses one that
263 is in the skeleton database. free to use this one, or insert your
268 sub startup_22_add_bookfund : Test(startup => 2) {
271 my $bookfundid = 'GEN';
272 my $bookfund = GetBookFund( $bookfundid, undef );
273 # diag( Data::Dumper->Dump( [ $bookfund ], qw( bookfund ) ) );
274 is( $bookfund->{'bookfundid'}, $bookfundid, "found bookfund: '$bookfundid'" );
275 is( $bookfund->{'bookfundname'}, 'General Stacks', "found bookfund: '$bookfundid'" );
277 $self->{'bookfundid'} = $bookfundid;
281 =head2 startup_24_add_member
283 Add a patron/member for the tests to use
287 sub startup_24_add_member : Test(startup => 1) {
290 my $memberinfo = { surname => 'surname ' . $self->random_string(),
291 firstname => 'firstname' . $self->random_string(),
292 address => 'address' . $self->random_string(),
293 city => 'city' . $self->random_string(),
294 branchcode => 'CPL', # CPL => Centerville
295 categorycode => 'PT', # PT => PaTron
298 my $id = AddMember( %$memberinfo );
299 ok( $id, "created member: $id" );
300 $self->{'memberid'} = $id;
307 setup methods are run before every test method
311 =head2 teardown methods
313 teardown methods are many time, once at the end of each test method.
317 =head2 shutdown methods
319 shutdown methods are run once, at the end of the test suite
323 =head2 utility methods
325 These are not test methods, but they're handy
331 Nice for generating names and such. It's not actually random, more
339 my $wordsize = 6; # how many letters in your string?
341 # leave out these characters: "oOlL10". They're too confusing.
342 my @alphabet = ( 'a'..'k','m','n','p'..'z', 'A'..'K','M','N','P'..'Z', 2..9 );
345 foreach ( 0..$wordsize ) {
346 $randomstring .= $alphabet[ rand( scalar( @alphabet ) ) ];
348 return $randomstring;
354 $self->add_biblios( count => 10,
358 count: number of biblios to add
359 add_items: should you add items for each one?
365 adds the biblionumbers to the $self->{'biblios'} listref
368 Should I allow you to pass in biblio information, like title?
369 Since this method is in the KohaTest class, all tests in it will be ignored, unless you call this from your own namespace.
370 This runs 10 tests, plus 4 for each "count", plus 3 more for each item added.
378 $param{'count'} = 1 unless defined( $param{'count'} );
379 $param{'add_items'} = 0 unless defined( $param{'add_items'} );
381 foreach my $counter ( 1..$param{'count'} ) {
382 my $marcrecord = MARC::Record->new();
383 isa_ok( $marcrecord, 'MARC::Record' );
384 my $appendedfieldscount = $marcrecord->append_fields( MARC::Field->new( '100', '1', '0',
387 MARC::Field->new( '245', '1', '4',
388 a => sprintf( 'The Adventures of Huckleberry Finn Test %s', $counter ),
389 c => "Mark Twain ; illustrated by E.W. Kemble." )
391 is( $appendedfieldscount, 2, 'added 2 fields' );
393 my $frameworkcode = ''; # XXX I'd like to put something reasonable here.
394 my ( $biblionumber, $biblioitemnumber ) = AddBiblio( $marcrecord, $frameworkcode );
395 ok( $biblionumber, "the biblionumber is $biblionumber" );
396 ok( $biblioitemnumber, "the biblioitemnumber is $biblioitemnumber" );
397 if ( $param{'add_items'} ) {
398 # my @iteminfo = AddItem( {}, $biblionumber );
399 my @iteminfo = AddItemFromMarc( $marcrecord, $biblionumber );
400 is( $iteminfo[0], $biblionumber, "biblionumber is $biblionumber" );
401 is( $iteminfo[1], $biblioitemnumber, "biblioitemnumber is $biblioitemnumber" );
402 ok( $iteminfo[2], "itemnumber is $iteminfo[2]" );
404 push @{$self->{'biblios'}}, $biblionumber;
407 my $query = 'Finn Test';
409 # XXX we're going to repeatedly try to fetch the marc records that
410 # we inserted above. It may take a while before they all show
413 DELAY: foreach my $trial ( 1..$tries ) {
414 diag "waiting for zebra indexing. Trial: $trial of $tries";
415 my ( $error, $results ) = SimpleSearch( $query );
416 if ( $param{'count'} <= scalar( @$results ) ) {
417 ok( $tries, "found all $param{'count'} titles after $trial tries" );
422 if ( $trial == $tries ) {
423 fail( "we never found all $param{'count'} titles even after $tries tries." );