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.
20 # Since this is an abstract base class, this prevents these tests from
21 # being run directly unless we're testing a subclass. It just makes
23 __PACKAGE__->SKIP_CLASS( 1 );
26 =head2 startup methods
28 these are run once, at the beginning of the whole test suite
32 =head2 startup_10_prepare_database
34 prepare a blank database.
36 This ends up getting run once for each test module, so that's several
37 times throughout the test suite. That may be too many times to refresh
38 the database. We may have to tune that.
42 sub startup_10_prepare_database : Test(startup => 1) {
44 # this is how I'm refreshing my database for now. I'll think of
45 # something better later. Eventually, I'd like to drop the
46 # database entirely and use the regular install code to rebuild a
48 my $class = ref $self;
50 # like( C4::Context->config( 'database '), qr/test$/, 'using test database: ' . C4::Context->config( 'database' ) )
51 like( C4::Context->database(), qr/test$/, 'using test database: ' . C4::Context->database() )
52 or BAIL_OUT( 'This appears to not be a test database.' );
57 sub startup_15_truncate_tables : Test( startup => 1 ) {
60 # my @truncate_tables = qw( accountlines
72 # auth_subfield_structure
99 # import_record_matches
109 # language_descriptions
110 # language_rfc4646_to_iso639
111 # language_script_bidi
112 # language_script_mapping
113 # language_subtag_registry
116 # marc_subfield_structure
119 # matcher_matchpoints
120 # matchpoint_component_norms
121 # matchpoint_components
134 # repeatable_holidays
151 # subscriptionhistory
152 # subscriptionroutinglist
157 # virtualshelfcontents
163 my @truncate_tables = qw( accountlines
184 import_record_matches
216 subscriptionroutinglist
222 my $failed_to_truncate = 0;
223 foreach my $table ( @truncate_tables ) {
224 my $dbh = C4::Context->dbh();
225 $dbh->do( "truncate $table" )
226 or $failed_to_truncate = 1;
228 is( $failed_to_truncate, 0, 'truncated tables' );
232 =head2 startup_20_add_bookseller
234 we need a bookseller for many of the tests, so let's insert one. Feel
235 free to use this one, or insert your own.
239 sub startup_20_add_bookseller : Test(startup => 1) {
242 my $booksellerinfo = { name => 'bookseller ' . $self->random_string(),
245 my $id = AddBookseller( $booksellerinfo );
246 ok( $id, "created bookseller: $id" );
247 $self->{'booksellerid'} = $id;
252 =head2 startup_22_add_bookfund
254 we need a bookfund for many of the tests. This currently uses one that
255 is in the skeleton database. free to use this one, or insert your
260 sub startup_22_add_bookfund : Test(startup => 2) {
263 my $bookfundid = 'GEN';
264 my $bookfund = GetBookFund( $bookfundid, undef );
265 # diag( Data::Dumper->Dump( [ $bookfund ], qw( bookfund ) ) );
266 is( $bookfund->{'bookfundid'}, $bookfundid, "found bookfund: '$bookfundid'" );
267 is( $bookfund->{'bookfundname'}, 'General Stacks', "found bookfund: '$bookfundid'" );
269 $self->{'bookfundid'} = $bookfundid;
273 =head2 startup_24_add_member
275 Add a patron/member for the tests to use
279 sub startup_24_add_member : Test(startup => 1) {
282 my $memberinfo = { surname => 'surname ' . $self->random_string(),
283 firstname => 'firstname' . $self->random_string(),
284 address => 'address' . $self->random_string(),
285 city => 'city' . $self->random_string(),
286 branchcode => 'CPL', # CPL => Centerville
287 categorycode => 'PT', # PT => PaTron
290 my $id = AddMember( %$memberinfo );
291 ok( $id, "created member: $id" );
292 $self->{'memberid'} = $id;
299 setup methods are run before every test method
303 =head2 teardown methods
305 teardown methods are many time, once at the end of each test method.
309 =head2 shutdown methods
311 shutdown methods are run once, at the end of the test suite
315 =head2 utility methods
317 These are not test methods, but they're handy
323 Nice for generating names and such. It's not actually random, more
331 my $wordsize = 6; # how many letters in your string?
333 # leave out these characters: "oOlL10". They're too confusing.
334 my @alphabet = ( 'a'..'k','m','n','p'..'z', 'A'..'K','M','N','P'..'Z', 2..9 );
337 foreach ( 0..$wordsize ) {
338 $randomstring .= $alphabet[ rand( scalar( @alphabet ) ) ];
340 return $randomstring;
346 $self->add_biblios( count => 10,
350 count: number of biblios to add
351 add_items: should you add items for each one?
357 adds the biblionumbers to the $self->{'biblios'} listref
360 Should I allow you to pass in biblio information, like title?
361 Since this method is in the KohaTest class, all tests in it will be ignored, unless you call this from your own namespace.
362 This runs 10 tests, plus 4 for each "count", plus 3 more for each item added.
370 $param{'count'} = 1 unless defined( $param{'count'} );
371 $param{'add_items'} = 0 unless defined( $param{'add_items'} );
373 foreach my $counter ( 1..$param{'count'} ) {
374 my $marcrecord = MARC::Record->new();
375 isa_ok( $marcrecord, 'MARC::Record' );
376 my $appendedfieldscount = $marcrecord->append_fields( MARC::Field->new( '100', '1', '0',
379 MARC::Field->new( '245', '1', '4',
380 a => sprintf( 'The Adventures of Huckleberry Finn Test %s', $counter ),
381 c => "Mark Twain ; illustrated by E.W. Kemble." )
383 is( $appendedfieldscount, 2, 'added 2 fields' );
385 my $frameworkcode = ''; # XXX I'd like to put something reasonable here.
386 my ( $biblionumber, $biblioitemnumber ) = AddBiblio( $marcrecord, $frameworkcode );
387 ok( $biblionumber, "the biblionumber is $biblionumber" );
388 ok( $biblioitemnumber, "the biblioitemnumber is $biblioitemnumber" );
389 if ( $param{'add_items'} ) {
390 # my @iteminfo = AddItem( {}, $biblionumber );
391 my @iteminfo = AddItemFromMarc( $marcrecord, $biblionumber );
392 is( $iteminfo[0], $biblionumber, "biblionumber is $biblionumber" );
393 is( $iteminfo[1], $biblioitemnumber, "biblioitemnumber is $biblioitemnumber" );
394 ok( $iteminfo[2], "itemnumber is $iteminfo[2]" );
396 push @{$self->{'biblios'}}, $biblionumber;
399 my $query = 'Finn Test';
401 # XXX we're going to repeatedly try to fetch the marc records that
402 # we inserted above. It may take a while before they all show
405 DELAY: foreach my $trial ( 1..$tries ) {
406 diag "waiting for zebra indexing. Trial: $trial of $tries";
407 my ( $error, $results ) = SimpleSearch( $query );
408 if ( $param{'count'} <= scalar( @$results ) ) {
409 ok( $tries, "found all $param{'count'} titles after $trial tries" );
414 if ( $trial == $tries ) {
415 fail( "we never found all $param{'count'} titles even after $tries tries." );