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.
19 # Since this is an abstract base class, this prevents these tests from
20 # being run directly unless we're testing a subclass. It just makes
22 __PACKAGE__->SKIP_CLASS( 1 );
25 =head2 startup methods
27 these are run once, at the beginning of the whole test suite
31 =head2 startup_10_prepare_database
33 prepare a blank database.
35 This ends up getting run once for each test module, so that's several
36 times throughout the test suite. That may be too many times to refresh
37 the database. We may have to tune that.
41 sub startup_10_prepare_database : Test(startup => 1) {
43 # this is how I'm refreshing my database for now. I'll think of
44 # something better later. Eventually, I'd like to drop the
45 # database entirely and use the regular install code to rebuild a
47 my $class = ref $self;
49 # like( C4::Context->config( 'database '), qr/test$/, 'using test database: ' . C4::Context->config( 'database' ) )
50 like( C4::Context->database(), qr/test$/, 'using test database: ' . C4::Context->database() )
51 or BAIL_OUT( 'This appears to not be a test database.' );
56 sub startup_15_truncate_tables : Test( startup => 1 ) {
59 # my @truncate_tables = qw( accountlines
71 # auth_subfield_structure
98 # import_record_matches
108 # language_descriptions
109 # language_rfc4646_to_iso639
110 # language_script_bidi
111 # language_script_mapping
112 # language_subtag_registry
115 # marc_subfield_structure
118 # matcher_matchpoints
119 # matchpoint_component_norms
120 # matchpoint_components
133 # repeatable_holidays
150 # subscriptionhistory
151 # subscriptionroutinglist
156 # virtualshelfcontents
162 my @truncate_tables = qw( accountlines
183 import_record_matches
215 subscriptionroutinglist
221 my $failed_to_truncate = 0;
222 foreach my $table ( @truncate_tables ) {
223 my $dbh = C4::Context->dbh();
224 $dbh->do( "truncate $table" )
225 or $failed_to_truncate = 1;
227 is( $failed_to_truncate, 0, 'truncated tables' );
231 =head2 startup_20_add_bookseller
233 we need a bookseller for many of the tests, so let's insert one. Feel
234 free to use this one, or insert your own.
238 sub startup_20_add_bookseller : Test(startup => 1) {
241 my $booksellerinfo = { name => 'bookseller ' . $self->random_string(),
244 my $id = AddBookseller( $booksellerinfo );
245 ok( $id, "created bookseller: $id" );
246 $self->{'booksellerid'} = $id;
251 =head2 startup_22_add_bookfund
253 we need a bookfund for many of the tests. This currently uses one that
254 is in the skeleton database. free to use this one, or insert your
259 sub startup_22_add_bookfund : Test(startup => 2) {
262 my $bookfundid = 'GEN';
263 my $bookfund = GetBookFund( $bookfundid, undef );
264 # diag( Data::Dumper->Dump( [ $bookfund ], qw( bookfund ) ) );
265 is( $bookfund->{'bookfundid'}, $bookfundid, "found bookfund: '$bookfundid'" );
266 is( $bookfund->{'bookfundname'}, 'General Stacks', "found bookfund: '$bookfundid'" );
268 $self->{'bookfundid'} = $bookfundid;
272 =head2 startup_24_add_member
274 Add a patron/member for the tests to use
278 sub startup_24_add_member : Test(startup => 1) {
281 my $memberinfo = { surname => 'surname ' . $self->random_string(),
282 firstname => 'firstname' . $self->random_string(),
283 address => 'address' . $self->random_string(),
284 city => 'city' . $self->random_string(),
285 branchcode => 'CPL', # CPL => Centerville
286 categorycode => 'PT', # PT => PaTron
289 my $id = AddMember( %$memberinfo );
290 ok( $id, "created member: $id" );
291 $self->{'memberid'} = $id;
298 setup methods are run before every test method
302 =head2 teardown methods
304 teardown methods are many time, once at the end of each test method.
308 =head2 shutdown methods
310 shutdown methods are run once, at the end of the test suite
314 =head2 utility methods
316 These are not test methods, but they're handy
322 Nice for generating names and such. It's not actually random, more
330 my $wordsize = 6; # how many letters in your string?
332 # leave out these characters: "oOlL10". They're too confusing.
333 my @alphabet = ( 'a'..'k','m','n','p'..'z', 'A'..'K','M','N','P'..'Z', 2..9 );
336 foreach ( 0..$wordsize ) {
337 $randomstring .= $alphabet[ rand( scalar( @alphabet ) ) ];
339 return $randomstring;
345 $self->add_biblios( count => 10,
349 count: number of biblios to add
350 add_items: should you add items for each one?
356 adds the biblionumbers to the $self->{'biblios'} listref
359 Should I allow you to pass in biblio information, like title?
360 Since this method is in the KohaTest class, all tests in it will be ignored, unless you call this from your own namespace.
361 This runs 10 tests, plus 4 for each "count", plus 3 more for each item added.
369 $param{'count'} = 1 unless defined( $param{'count'} );
370 $param{'add_items'} = 0 unless defined( $param{'add_items'} );
372 foreach my $counter ( 1..$param{'count'} ) {
373 my $marcrecord = MARC::Record->new();
374 isa_ok( $marcrecord, 'MARC::Record' );
375 my $appendedfieldscount = $marcrecord->append_fields( MARC::Field->new( '100', '1', '0',
378 MARC::Field->new( '245', '1', '4',
379 a => sprintf( 'The Adventures of Huckleberry Finn Test %s', $counter ),
380 c => "Mark Twain ; illustrated by E.W. Kemble." )
382 is( $appendedfieldscount, 2, 'added 2 fields' );
384 my $frameworkcode = ''; # XXX I'd like to put something reasonable here.
385 my ( $biblionumber, $biblioitemnumber ) = AddBiblio( $marcrecord, $frameworkcode );
386 ok( $biblionumber, "the biblionumber is $biblionumber" );
387 ok( $biblioitemnumber, "the biblioitemnumber is $biblioitemnumber" );
388 if ( $param{'add_items'} ) {
389 # my @iteminfo = AddItem( {}, $biblionumber );
390 my @iteminfo = AddItemFromMarc( $marcrecord, $biblionumber );
391 is( $iteminfo[0], $biblionumber, "biblionumber is $biblionumber" );
392 is( $iteminfo[1], $biblioitemnumber, "biblioitemnumber is $biblioitemnumber" );
393 ok( $iteminfo[2], "itemnumber is $iteminfo[2]" );
395 push @{$self->{'biblios'}}, $biblionumber;
398 my $query = 'Finn Test';
400 # XXX we're going to repeatedly try to fetch the marc records that
401 # we inserted above. It may take a while before they all show
404 DELAY: foreach my $trial ( 1..$tries ) {
405 diag "waiting for zebra indexing. Trial: $trial of $tries";
406 my ( $error, $results ) = SimpleSearch( $query );
407 if ( $param{'count'} <= scalar( @$results ) ) {
408 ok( $tries, "found all $param{'count'} titles after $trial tries" );
413 if ( $trial == $tries ) {
414 fail( "we never found all $param{'count'} titles even after $tries tries." );