root/branches/release-40/t/lib/MT/Test.pm @ 2601

Revision 2601, 33.3 kB (checked in by fumiakiy, 18 months ago)

Fix for db driver tests

  • Drop sequences before creating new ones.
  • Specify IDs to new objects for later comparison.
  • Property svn:keywords set to Id Revision
Line 
1package MT::Test;
2use base qw( Exporter );
3
4our @EXPORT = qw( is_object are_objects );
5
6use strict;
7# Handle cwd = MT_DIR, MT_DIR/t
8use lib 't/lib', 'extlib', 'lib', '../lib', '../extlib';
9use File::Spec;
10use MT;
11
12use Test::More;
13use Test::Deep qw( eq_deeply );
14
15BEGIN {
16    # if MT_HOME is not set, set it
17    unless ($ENV{MT_HOME}) {
18        require Cwd;
19        my $cwd = Cwd::getcwd();
20        my @pieces = File::Spec->splitdir($cwd);
21        pop @pieces unless -d 't';
22        $ENV{MT_HOME} = File::Spec->catdir(@pieces);
23    }
24    # if MT_CONFIG is not set, set it
25    if ($ENV{MT_CONFIG}) {
26        if (!File::Spec->file_name_is_absolute($ENV{MT_CONFIG})) {
27            $ENV{MT_CONFIG} = File::Spec->catfile($ENV{MT_HOME}, "t", $ENV{MT_CONFIG});
28        }
29    } else {
30        $ENV{MT_CONFIG} = File::Spec->catfile($ENV{MT_HOME}, "t", "mt.cfg");
31    }
32    chdir $ENV{MT_HOME};
33    my $ds_dir = File::Spec->catdir($ENV{MT_HOME}, "t", "db");
34    if (!-d $ds_dir) {
35        mkdir $ds_dir;
36    }
37}
38
39# Override time and sleep so we can simulate time passing without making
40# test scripts wait for real wall seconds to pass.
41our $CORE_TIME;
42BEGIN {
43    *CORE::GLOBAL::time  = sub { my ($a) = @_; $a ? CORE::time + $_[0] : CORE::time };
44    *CORE::GLOBAL::sleep = sub { CORE::sleep };
45}
46
47sub import {
48    my $pkg = shift;
49    my @to_export;
50    # TODO: only use these init_* calls as calls, not as import args, now that we have real functions to export.
51    foreach my $opt (@_) {
52        if ($opt =~ m{ \A : (.+) \z }xms) {
53            my $command = "init_$1";
54            $pkg->$command() if $pkg->can($command);
55        }
56        else {
57            push @to_export, $opt;
58        }
59    }
60    # Export requested or all exportable functions.
61    $pkg->export_to_level(1, @to_export || qw( :DEFAULT ));
62}
63
64sub init_cms {
65    my $pkg = shift;
66    my ($cfg) = @_;
67
68    require MT::App::CMS;
69    MT::App::CMS->instance($cfg ? (Config => $cfg) : ());
70}
71
72sub init_time {
73    $CORE_TIME = time;
74   
75    no warnings 'redefine';
76    *CORE::GLOBAL::time  = sub { $CORE_TIME };
77    *CORE::GLOBAL::sleep = sub { $CORE_TIME += shift };
78}
79
80sub init_testdb {
81    my $pkg = shift;
82    # This is a bit of MT::Upgrade magic to prevent the full
83    # instantiation of the MT schema. We force the classes list
84    # to only contain the test 'Foo', 'Bar' classes and neuter
85    # the
86    require MT::Upgrade;
87    # Add our test 'Foo' and 'Bar' classes to the list of
88    # object classes to install.
89    %MT::Upgrade::classes = (foo=>'Foo',bar=>'Bar');
90    #MT::Upgrade->register_class(['Foo', 'Bar']);
91    MT->instance;
92    MT->registry->{object_types}->{foo} = 'Foo';
93    MT->registry->{object_types}->{bar} = 'Bar';
94
95    # Replace the standard seed_database/install_template functions
96    # with stubs since we're not creating a full schema.
97    MT::Upgrade->register_upgrade_function({
98        core_seed_database     => { code => sub { 1 } },
99        core_upgrade_templates => { code => sub { 1 } },
100        core_finish            => { code => sub { 1 } },
101    });
102    $pkg->init_db();
103}
104
105sub init_newdb {
106    my $pkg = shift;
107    my ($cfg) = @_;
108    diag "Initializing database";
109
110    my $mt = MT->instance($cfg ? (Config => $cfg) : ())
111        or die "No MT object " . MT->errstr;
112
113    my $types = MT->registry('object_types');
114    $types->{$_} = MT->model($_) for
115        grep { MT->model($_) }
116        map  { $_ . ':meta' }
117        grep { MT->model($_)->meta_pkg }
118        sort keys %$types;
119    my @classes = map { $types->{$_} } grep { $_ !~ /\./ } sort keys %$types;
120    foreach my $class (@classes) {
121        if (ref($class) eq 'ARRAY') {
122            next; #TODO for now - it won't hurt when we do driver-tests.
123        }
124        elsif (!defined *{ $class . '::__properties' }) {
125            eval '# line ' . __LINE__ . ' ' . __FILE__ . "\n" . 'require '.$class or die $@;
126        }
127    }
128
129    # Clear existing database tables
130    my $driver = MT::Object->driver();
131    foreach my $class (@classes) {
132        if (ref($class) eq 'ARRAY') {
133            next; #TODO for now - it won't hurt when we do driver-tests.
134        }
135        else {
136            if ($driver->dbd->ddl_class->table_exists($class)) {
137                $driver->sql(
138                    $driver->dbd->ddl_class->drop_table_sql($class),
139                );
140                $driver->dbd->ddl_class->drop_sequence($class),
141            }
142        }
143    }
144
145    1;
146}
147
148sub init_upgrade {
149    my $pkg = shift;
150
151    require MT::Upgrade;
152    # Initialize the MT database
153    MT::Upgrade->do_upgrade(
154        Install => 1, 
155        App     => __PACKAGE__, 
156        User    => {},
157        Blog    => {}
158    );
159    eval {
160        # line __LINE__ __FILE__
161        MT::Entry->remove;
162        MT::Comment->remove;
163    };
164    MT::ObjectDriver::Driver::Cache::RAM->clear_cache();
165
166    1;
167}
168
169sub init_db {
170    my $pkg = shift;
171    $pkg->init_newdb(@_) && $pkg->init_upgrade(@_);
172}
173
174sub progress {}
175sub error {
176    my ($x, $msg) = @_;
177    print "ERROR: $msg\n";
178}
179
180sub init_data {
181    my $pkg = shift;
182    diag "Initializing sample data";
183
184    my $blog = MT::Blog->new();
185    $blog->set_values({
186        name => 'none',
187        site_url => 'http://narnia.na/nana/',
188        archive_url => 'http://narnia.na/nana/archives/',
189        site_path => 't/site/',
190        archive_path => 't/site/archives/',
191        archive_type=>'Individual,Monthly,Weekly,Daily,Category,Page',
192        archive_type_preferred => 'Individual',
193        description => "Narnia None Test Blog",
194        custom_dynamic_templates => 'custom',
195        convert_paras => 1,
196        allow_reg_comments => 1,
197        allow_unreg_comments => 0,
198        allow_pings => 1,
199        sort_order_posts => 'descend',
200        sort_order_comments => 'ascend',
201        remote_auth_token => 'token',
202        convert_paras_comments => 1,
203        google_api_key => 'r9Vj5K8PsjEu+OMsNZ/EEKjWmbCeQAv1',
204        cc_license => 'by-nc-sa http://creativecommons.org/licenses/by-nc-sa/2.0/ http://creativecommons.org/images/public/somerights20.gif',
205        server_offset => '-3.5',
206        children_modified_on => '20000101000000',
207        language => 'en_us',
208        file_extension => 'html',
209    });
210    $blog->id(1);
211    $blog->commenter_authenticators('enabled_TypeKey');
212    $blog->save() or die "Couldn't save blog 1: ". $blog->errstr;
213    MT::ObjectDriver::Driver::Cache::RAM->clear_cache();
214    diag "Saved blog";
215
216    require MT::Entry;
217    require MT::Author;
218    my $chuckd = MT::Author->new();
219    $chuckd->set_values({
220        name => 'Chuck D',
221        nickname => 'Chucky Dee', 
222        email => 'chuckd@example.com',
223        url => 'http://chuckd.com/',
224        api_password => 'seecret',
225        auth_type => 'MT',
226        created_on => '19780131074500',
227    });
228    $chuckd->set_password("bass");
229    $chuckd->type(MT::Author::AUTHOR());
230    $chuckd->id(2);
231    $chuckd->is_superuser(1);
232    $chuckd->save()
233        or die "Couldn't save author record 2: " . $chuckd->errstr;
234    diag "Saved user Chuck D";
235
236    my $bobd = MT::Author->new();
237    $bobd->set_values({
238        name => 'Bob D',
239        nickname => 'Dylan', 
240        email => 'bobd@example.com',
241        auth_type => 'MT',
242        created_on => '19780131075000',
243    });
244    $bobd->set_password("flute");
245    $bobd->type(MT::Author::AUTHOR());
246    $bobd->id(3);
247    $bobd->save() or die "Couldn't save author record 3: " . $bobd->errstr;
248    diag "Saved user Bob D";
249
250    my $johnd = MT::Author->new();
251    $johnd->set_values({
252        name => 'John Doe',
253        nickname => 'John Doe',
254        email => 'jdoe@doe.com',
255        auth_type => 'TypeKey',
256        created_on => '19780131080000',
257    });
258    $johnd->type(MT::Author::COMMENTER());
259    $johnd->password('(none)');
260    $johnd->id(4);
261    $johnd->save() or die "Couldn't save author record 4: " . $johnd->errstr;
262    diag "Saved user John Doe";
263
264    my $hiro = MT::Author->new();
265    $hiro->set_values({
266        name => 'Hiro Nakamura',
267        nickname => 'Hiro',
268        email => 'hiro@heroes.com',
269        auth_type => 'MT',
270        created_on => '19780131081000',
271    });
272    $hiro->type(MT::Author::AUTHOR());
273    $hiro->password('time');
274    $hiro->id(5);
275    $hiro->status(2);
276    $hiro->save() or die "Couldn't save author record 5: " . $hiro->errstr;
277    diag "Saved user Hiro";
278
279    require MT::Role;
280    my ($admin_role, $author_role) = map { MT::Role->load({ name => $_ }) }
281        ('Blog Administrator', 'Author');
282
283    require MT::Association;
284    my $assoc = MT::Association->new();
285    $assoc->author_id($chuckd->id);
286    $assoc->blog_id(1);
287    $assoc->role_id($admin_role->id);
288    $assoc->type(1);
289    $assoc->save();
290
291    $assoc = MT::Association->new();
292    $assoc->author_id($bobd->id);
293    $assoc->blog_id(1);
294    $assoc->role_id($author_role->id);
295    $assoc->type(1);
296    $assoc->save();
297
298    $assoc = MT::Association->new();
299    $assoc->author_id($hiro->id);
300    $assoc->blog_id(1);
301    $assoc->role_id($admin_role->id);
302    $assoc->type(1);
303    $assoc->save();
304
305    # set permission record for johnd commenter on blog 1
306    $johnd->approve(1);
307
308    my $entry = MT::Entry->load(1);
309    # TODO: this test entry is never created; upgrading already adds entry #1.
310    if (!$entry) {
311        $entry = MT::Entry->new();
312        $entry->set_values({
313            blog_id => 1,
314            title => 'A Rainy Day',
315            text => 'On a drizzly day last weekend,',
316            text_more => 'I took my grandpa for a walk.',
317            excerpt => 'A story of a stroll.',
318            keywords => 'keywords',
319            created_on => '19780131074500',
320            authored_on => '19780131074500',
321            modified_on => '19780131074600',
322            authored_on => '19780131074500',
323            author_id => $chuckd->id,
324            pinged_urls => 'http://technorati.com/',
325            allow_comments => 1,
326            allow_pings => 1,
327            status => MT::Entry::RELEASE(),
328        });
329        $entry->id(1);
330        $entry->tags('rain', 'grandpa', 'strolling');
331        $entry->save() or die "Couldn't save entry record 1: ".$entry->errstr;
332        diag "Saved entry #1";
333    }
334    $entry->clear_cache();
335
336    $entry = MT::Entry->load(2);
337    if (!$entry) {
338        $entry = MT::Entry->new();
339        $entry->set_values({
340            blog_id => 1,
341            title => 'A preponderance of evidence',
342            text => 'It is sufficient to say...',
343            text_more => 'I suck at making up test data.',
344            created_on => '19790131074500',
345            authored_on => '19790131074500',
346            modified_on => '19790131074600',
347            authored_on => '19780131074500',
348            author_id => $bobd->id,
349            allow_comments => 1,
350            status => MT::Entry::FUTURE(),
351        });
352        $entry->id(2);
353        $entry->save() or die "Couldn't save entry record 2: ".$entry->errstr;
354        diag "Saved entry #2";
355    }
356    $entry->clear_cache();
357
358    $entry = MT::Entry->load(3);
359    if (!$entry) {
360        $entry = MT::Entry->new();
361        $entry->set_values({
362            blog_id => 1,
363            title => 'Spurious anemones',
364            text => '...are better than the non-spurious',
365            text_more => 'variety.',
366            created_on => '19770131074500',
367            authored_on => '19790131074500',
368            modified_on => '19770131074600',
369            authored_on => '19780131074500',
370            author_id => $chuckd->id,
371            allow_comments => 1,
372            allow_pings => 0,
373            status => MT::Entry::HOLD(),
374        });
375        $entry->id(3);
376        $entry->tags('anemones');
377        $entry->save() or die "Couldn't save entry record 3: ".$entry->errstr;
378        diag "Saved entry #3";
379    }
380    $entry->clear_cache();
381
382    require MT::Trackback;
383    my $tb = MT::Trackback->load(1);
384    if (!$tb) {
385        $tb = new MT::Trackback;
386        $tb->entry_id(1);
387        $tb->blog_id(1);
388        $tb->title("Entry TrackBack Title");
389        $tb->description("Entry TrackBack Description");
390        $tb->category_id(0);
391        $tb->id(1);
392        $tb->save or die "Couldn't save Trackback record 1: " . $tb->errstr;;
393    }
394
395    require MT::TBPing;
396    my $ping = MT::TBPing->load(1);
397    if (!$ping) {
398        $ping = new MT::TBPing;
399        $ping->tb_id(1);
400        $ping->blog_id(1);
401        $ping->ip('127.0.0.1');
402        $ping->title('Foo');
403        $ping->excerpt('Bar');
404        $ping->source_url('http://example.com/');
405        $ping->blog_name("Example Blog");
406        $ping->created_on('20050405000000');
407        $ping->id(1);
408        $ping->visible(1);
409        $ping->save or die "Couldn't save TBPing record 1: " . $ping->errstr;
410        diag "Saved a trackback ping";
411    }
412
413    my @verses = (
414        'Oh, where have you been, my blue-eyed son?
415Oh, where have you been, my darling young one?',
416        'I saw a newborn baby with wild wolves all around it
417I saw a highway of diamonds with nobody on it',
418        'Heard one hundred drummers whose hands were a-blazin\',
419Heard ten thousand whisperin\' and nobody listenin\'',
420        'I met one man who was wounded in love,
421I met another man who was wounded with hatred',
422        'Where hunger is ugly, where souls are forgotten,
423Where black is the color, where none is the number,
424And it\'s a hard, it\'s a hard, it\'s a hard, it\'s a hard,
425It\'s a hard rain\'s a-gonna fall',
426    );
427
428    require MT::Category;
429    my $cat = MT::Category->load({ label => 'foo', blog_id => 1});
430    if (!$cat) {
431        $cat = new MT::Category;
432        $cat->blog_id(1);
433        $cat->label('foo');
434        $cat->description('bar');
435        $cat->author_id($chuckd->id);
436        $cat->parent(0);
437        $cat->id(1);
438        $cat->save or die "Couldn't save category record 1: ". $cat->errstr;
439        diag "Saved category foo";
440    }
441
442    $cat = MT::Category->load({ label => 'bar', blog_id => 1});
443    if (!$cat) {
444        $cat = new MT::Category;
445        $cat->blog_id(1);
446        $cat->label('bar');
447        $cat->description('foo');
448        $cat->author_id($chuckd->id);
449        $cat->parent(0);
450        $cat->id(2);
451        $cat->save or die "Couldn't save category record 2: ". $cat->errstr;
452        diag "Saved category bar";
453    }
454
455    $tb = MT::Trackback->load(2);
456    if (!$tb) {
457        $tb = new MT::Trackback;
458        $tb->title("Category TrackBack Title");
459        $tb->description("Category TrackBack Description");
460        $tb->entry_id(0);
461        $tb->blog_id(1);
462        $tb->category_id(2);
463        $tb->id(2);
464        $tb->save or die "Couldn't save Trackback record 2: " . $tb->errstr;;
465        diag "Saved category bar's trackback target";
466    }
467
468    $cat = MT::Category->load({ label => 'subfoo', blog_id => 1});
469    if (!$cat) {
470        $cat = new MT::Category;
471        $cat->blog_id(1);
472        $cat->label('subfoo');
473        $cat->description('subcat');
474        $cat->author_id($bobd->id);
475        $cat->parent(1);
476        $cat->id(3);
477        $cat->save or die "Couldn't save category record 3: ". $cat->errstr;
478        diag "Saved subcategory subfoo";
479    }
480
481    require MT::Placement;
482    foreach my $i (1..@verses) {
483        $entry = MT::Entry->load($i+3);
484        if (!$entry) {
485            $entry = MT::Entry->new();
486            $entry->set_values({
487                blog_id => 1,
488                title => "Verse $i",
489                text => $verses[$i],
490                author_id => ($i == 3 ? $bobd->id : $chuckd->id),
491                created_on => sprintf("%04d0131074501", $i + 1960),
492                authored_on => sprintf("%04d0131074501", $i + 1960),
493                modified_on => sprintf("%04d0131074601", $i + 1960),
494                authored_on => sprintf("%04d0131074501", $i + 1960),
495                allow_comments => ($i <= 2 ? 0 : 1),
496                status => MT::Entry::RELEASE(),
497            });
498            $entry->id($i+3);
499            if ( $i == 1 || $i == 3 || $i == 5 ) {
500                $entry->tags('verse', 'rain');
501            }
502            else {
503                $entry->tags('verse', 'anemones');
504            }
505            $entry->save()
506                or die "Couldn't save entry record ".($entry->id).": ". $entry->errstr;
507            if ($i == 3) {
508                my $place = new MT::Placement;
509                $place->entry_id($entry->id);
510                $place->blog_id(1);
511                $place->category_id(1);
512                $place->is_primary(1);
513                $place->save
514                    or die "Couldn't save placement record: ".$place->errstr;
515                diag "Placed entry Verse 3 in category foo";
516            }
517            if ($i == 4) {
518                my $place = new MT::Placement;
519                $place->entry_id($entry->id);
520                $place->blog_id(1);
521                $place->category_id(3);
522                $place->is_primary(1);
523                $place->save
524                    or die "Couldn't save placement record: ".$place->errstr;
525                diag "Placed entry Verse 4 in category subfoo";
526            }
527        }
528    }
529
530    # entry id 1 - 1 visible comment
531    # entry id 4 - no comments, commenting is off
532    require MT::Comment;
533    unless (MT::Comment->count({entry_id => 1})) {
534        my $cmt = new MT::Comment();
535        $cmt->set_values({
536            text => 'Postmodern false consciousness has always been firmly rooted in post-Freudian Lacanian neo-Marxist bojangles. Needless to say, this quickly and asymptotically approches a purpletacular jouissance of etic jumpinmypants.',
537            entry_id => 1,
538            author => 'v14GrUH 4 cheep',
539            visible => 1,
540            email => 'jake@fatman.com',
541            url => 'http://fatman.com/',
542            blog_id => 1,
543            ip => '127.0.0.1',
544            created_on => '20040714182800',
545        });
546        $cmt->id(1);
547        $cmt->save() or die "Couldn't save comment record 1: ".$cmt->errstr;
548        diag "Saved comment #1";
549
550        $cmt->id(11);
551        $cmt->text('Comment reply for comment 1');
552        $cmt->author('Comment 11');
553        $cmt->created_on('20040812182900');
554        $cmt->parent_id(1);
555        $cmt->save() or die "Couldn't save comment record 11: ".$cmt->errstr;
556        diag "Saved child comment #11";
557
558        $cmt->id(12);
559        $cmt->text('Comment reply for comment 11');
560        $cmt->author('Comment 12');
561        $cmt->created_on('20040810183000');
562        $cmt->parent_id(11);
563        $cmt->save() or die "Couldn't save comment record 12: ".$cmt->errstr;
564        diag "Saved child comment #12";
565    }
566    # entry id 5 - 1 comment, commenting is off (closed)
567    unless (MT::Comment->count({entry_id => 5})) {
568        my $cmt = new MT::Comment();
569        $cmt->set_values({
570            text => 'Comment for entry 5, visible',
571            entry_id => 5,
572            author => 'Comment 2',
573            visible => 1,
574            email => 'johnd@doe.com',
575            url => 'http://john.doe.com/',
576            commenter_id => $johnd->id,
577            blog_id => 1,
578            ip => '127.0.0.1',
579            created_on => '20040912182800',
580        });
581        $cmt->id(2);
582        $cmt->junk_score(1.5);
583        $cmt->save() or die "Couldn't save comment record 2: ".$cmt->errstr;
584    }
585    # entry id 6 - 3 comment visible, 1 moderated
586    unless (MT::Comment->count({entry_id => 6})) {
587        my $cmt = new MT::Comment();
588        $cmt->set_values({
589            text => 'Comment for entry 6, visible',
590            entry_id => 6,
591            author => 'Comment 3',
592            visible => 1,
593            email => '',
594            url => '',
595            blog_id => 1,
596            ip => '127.0.0.1',
597            created_on => '20040911182800',
598        });
599        $cmt->id(3);
600        $cmt->save() or die "Couldn't save comment record 3: ".$cmt->errstr;
601
602        $cmt->id(4);
603        $cmt->visible(0);
604        $cmt->author('Comment 4');
605        $cmt->text('Comment for entry 6, moderated');
606        $cmt->created_on('20040910182800');
607        $cmt->save() or die "Couldn't save comment record 4: ".$cmt->errstr;
608       
609        $cmt->text("All your comments are belonged to me.");
610        $cmt->commenter_id($chuckd->id);
611        $cmt->visible(1);
612        $cmt->created_on('20040910183000');
613        $cmt->id(14);
614        $cmt->save or die "Couldn't save comment record 1: ".$cmt->errstr;
615
616        $cmt->text("All your comments are belonged to us MT Authors.");
617        $cmt->commenter_id($bobd->id);
618        $cmt->visible(1);
619        $cmt->created_on('20040910182800');
620        $cmt->id(15);
621        $cmt->save or die "Couldn't save comment record 1: ".$cmt->errstr;
622    }
623    # entry id 7 - 0 comment visible, 1 moderated
624    unless (MT::Comment->count({entry_id => 7})) {
625        my $cmt = new MT::Comment();
626        $cmt->set_values({
627            text => 'Comment for entry 7, moderated',
628            entry_id => 7,
629            author => 'Comment 7',
630            visible => 0,
631            email => '',
632            url => '',
633            blog_id => 1,
634            ip => '127.0.0.1',
635            created_on => '20040909182800',
636        });
637        $cmt->id(5);
638        $cmt->save() or die "Couldn't save comment record 5: ".$cmt->errstr;
639    }
640    # entry id 8 - 1 comment visible, 1 moderated, 1 junk
641    unless (MT::Comment->count({entry_id => 8})) {
642        my $cmt = new MT::Comment();
643        $cmt->set_values({
644            text => 'Comment for entry 8, visible',
645            entry_id => 8,
646            author => 'Comment 8',
647            visible => 1,
648            email => '',
649            url => '',
650            blog_id => 1,
651            ip => '127.0.0.1',
652            created_on => '20040614182800',
653        });
654        $cmt->id(6);
655        $cmt->save() or die "Couldn't save comment record 6: ".$cmt->errstr;
656
657        $cmt->id(7);
658        $cmt->visible(0);
659        $cmt->text('Comment for entry 8, moderated');
660        $cmt->author('JD7');
661        $cmt->created_on('20040812182800');
662        $cmt->save() or die "Couldn't save comment record 7: ".$cmt->errstr;
663
664        $cmt->id(8);
665        $cmt->visible(0);
666        $cmt->junk_status(-1);
667        $cmt->text('Comment for entry 8, junk');
668        $cmt->author('JD8');
669        $cmt->created_on('20040810182800');
670        $cmt->save() or die "Couldn't save comment record 8: ".$cmt->errstr;
671    }
672
673    require MT::Template;
674    require MT::TemplateMap;
675
676    my $tmpl = new MT::Template;
677    $tmpl->blog_id(1);
678    $tmpl->name('blog-name');
679    $tmpl->text('<MTBlogName>');
680    $tmpl->type('custom');
681    $tmpl->save or die "Couldn't save template record 1: ".$tmpl->errstr;
682    diag "Saved blog-name template";
683
684    ### Asset
685    use MT::Asset;
686
687    my $img_pkg = MT::Asset->class_handler('image');
688    my $file_pkg = MT::Asset->class_handler('file');
689    my $asset = new $img_pkg;
690    $asset->blog_id(1);
691    $asset->url('http://narnia.na/nana/images/test.jpg');
692    $asset->file_path(File::Spec->catfile($ENV{MT_HOME}, "t", 'images', 'test.jpg'));
693    $asset->file_name('test.jpg');
694    $asset->file_ext('jpg');
695    $asset->image_width(640);
696    diag "Set image asset's width metadata field";
697    $asset->image_height(480);
698    $asset->mime_type('image/jpeg');
699    $asset->label('Image photo');
700    $asset->description('This is a test photo.');
701    $asset->created_by(1);
702    $asset->tags('alpha', 'beta', 'gamma');
703    diag "Tagged image asset";
704    $asset->save or die "Couldn't save asset record 1: " . $asset->errstr;
705    diag "Saved image asset";
706
707    $asset->set_score('unit test', $bobd, 5, 1);
708    $asset->set_score('unit test', $johnd, 3, 1);
709    $asset->set_score('unit test', MT::Author->load(1), 4, 1);
710
711    $asset = new $file_pkg;
712    $asset->blog_id(1);
713    $asset->url('http://narnia.na/nana/files/test.tmpl');
714    $asset->file_path(File::Spec->catfile($ENV{MT_HOME}, "t", 'test.tmpl'));
715    $asset->file_name('test.tmpl');
716    $asset->file_ext('tmpl');
717    $asset->mime_type('text/plain');
718    $asset->label('Template');
719    $asset->description('This is a test template.');
720    $asset->created_by(1);
721    $asset->created_on('19780131074500');
722    $asset->tags('beta');
723    $asset->save or die "Couldn't save file asset record: " . $asset->errstr;
724    diag "Saved file asset";
725
726    $asset->set_score('unit test', $chuckd, 2, 1);
727    $asset->set_score('unit test', $johnd, 3, 1);
728   
729    ## ObjectScore
730    my $e5 = MT::Entry->load(5);
731    $e5->set_score('unit test', $bobd, 5, 1);
732    $e5->set_score('unit test', $johnd, 3, 1);
733    $e5->set_score('unit test', MT::Author->load(1), 4, 1);
734
735    my $e6 = MT::Entry->load(6);
736    $e6->set_score('unit test', $chuckd, 1, 1);
737    $e6->set_score('unit test', $johnd, 1, 1);
738   
739    my $e4 = MT::Entry->load(4);
740    $e4->set_score('unit test', $chuckd, 2, 1);
741    $e4->set_score('unit test', $johnd, 3, 1);
742    diag "Saved scores for entry #4";
743
744    ## Page
745    require MT::Page;
746    my $page = MT::Page->new();
747    $page->set_values({
748        blog_id => 1,
749        title => 'Watching the River Flow',
750        text => 'What the matter with me,',
751        text_more => 'I don\'t have much to say,',
752        keywords => 'no folder',
753        excerpt => 'excerpt',
754        created_on => '19780131074500',
755        authored_on => '19780131074500',
756        modified_on => '19780131074600',
757        author_id => $chuckd->id,
758        status => MT::Entry::RELEASE(),
759    });
760    $page->id(20);
761    $page->tags('river', 'flow', 'watch');
762    $page->save() or die "Couldn't save page record 20: ".$page->errstr;
763
764    require MT::Folder;
765    my $folder = MT::Folder->new();
766    $folder->blog_id(1);
767    $folder->label('info');
768    $folder->description('information');
769    $folder->author_id($chuckd->id);
770    $folder->parent(0);
771    $folder->id(20);
772    $folder->save or die "Could'n sae folder record 20:" . $folder->errstr;
773    diag "Saved folder #20";
774
775    $folder = MT::Folder->new();
776    $folder->blog_id(1);
777    $folder->label('download');
778    $folder->description('download top');
779    $folder->author_id($chuckd->id);
780    $folder->parent(0);
781    $folder->id(21);
782    $folder->save or die "Could'n sae folder record 21:" . $folder->errstr;
783
784    $folder = MT::Folder->new();
785    $folder->blog_id(1);
786    $folder->label('nightly');
787    $folder->description('nightly build');
788    $folder->author_id($chuckd->id);
789    $folder->parent(21);
790    $folder->id(22);
791    $folder->save or die "Could'n sae folder record 22:" . $folder->errstr;
792
793    $page = MT::Page->new();
794    $page->set_values({
795        blog_id => 1,
796        title => 'Page #1',
797        text => 'Wish I was back in the city',
798        text_more => 'Instead of this old bank of sand,',
799        keywords => 'keywords',
800        created_on => '19790131074500',
801        authored_on => '19790131074500',
802        modified_on => '19790131074600',
803        author_id => $chuckd->id,
804        status => MT::Entry::RELEASE(),
805    });
806    $page->id(21);
807    $page->tags('page1', 'page2', 'page3');
808    $page->save() or die "Couldn't save page record 21: ".$page->errstr;
809
810    my $folder_place = new MT::Placement;
811    $folder_place->entry_id(21);
812    $folder_place->blog_id(1);
813    $folder_place->category_id(20);
814    $folder_place->is_primary(1);
815    $folder_place->save
816        or die "Couldn't save placement record: ".$folder_place->errstr;
817
818    $page = MT::Page->new();
819    $page->set_values({
820        blog_id => 1,
821        title => 'Page #2',
822        text => 'With the sub beating down over the chimney tops',
823        text_more => 'And the one I love so close at hand',
824        keywords => 'keywords',
825        created_on => '19800131074500',
826        authored_on => '19800131074500',
827        modified_on => '19800131074600',
828        author_id => $chuckd->id,
829        status => MT::Entry::RELEASE(),
830    });
831    $page->id(22);
832    $page->tags('page2', 'page3');
833    $page->save() or die "Couldn't save page record 22: ".$page->errstr;
834
835    $folder_place = new MT::Placement;
836    $folder_place->entry_id(22);
837    $folder_place->blog_id(1);
838    $folder_place->category_id(21);
839    $folder_place->is_primary(1);
840    $folder_place->save
841        or die "Couldn't save placement record: ".$folder_place->errstr;
842
843    $page = MT::Page->new();
844    $page->set_values({
845        blog_id => 1,
846        title => 'Page #3',
847        text => 'If I had wings and I could fly,',
848        text_more => 'I know where I would go.',
849        keywords => 'keywords',
850        created_on => '19810131074500',
851        authored_on => '19810131074500',
852        modified_on => '19810131074600',
853        author_id => $bobd->id,
854        status => MT::Entry::RELEASE(),
855    });
856    $page->id(23);
857    $page->tags('page3');
858    $page->save() or die "Couldn't save page record 23: ".$page->errstr;
859
860    $folder_place = new MT::Placement;
861    $folder_place->entry_id(23);
862    $folder_place->blog_id(1);
863    $folder_place->category_id(22);
864    $folder_place->is_primary(1);
865    $folder_place->save
866        or die "Couldn't save placement record: ".$folder_place->errstr;
867
868    unless (MT::Comment->count({entry_id => $page->id})) {
869        my $page_cmt = new MT::Comment();
870        $page_cmt->set_values({
871            text => "Your time is limited, so don't waste it living someone else's life. Don't be trapped by dogma - which is living with the results of other people's thinking. Don't let the noise of others' opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary.",
872            entry_id => 23,
873            author => 'Steve Jobs',
874            visible => 1,
875            email => 'f@example.com',
876            url => 'http://example.com/',
877            blog_id => 1,
878            ip => '127.0.0.1',
879            created_on => '20040114182800',
880            modified_on => '20040114182800',
881        });
882        $page_cmt->id(13);
883        $page_cmt->save() or die "Couldn't save comment record 1: ".$page_cmt->errstr;
884    }
885
886    my $page_tb = MT::Trackback->new;
887    $page_tb->entry_id($page->id);
888    $page_tb->blog_id(1);
889    $page_tb->title("Page TrackBack Title");
890    $page_tb->description("Page TrackBack Description");
891    $page_tb->category_id(0);
892    $page_tb->id(3);
893    $page_tb->save or die "Couldn't save Trackback record 1: " . $tb->errstr;;
894
895    my $page_ping = MT::TBPing->new;
896    $page_ping->tb_id($page_tb->id);
897    $page_ping->blog_id(1);
898    $page_ping->ip('127.0.0.1');
899    $page_ping->title('Trackbacking to a page');
900    $page_ping->excerpt('Four bridges in the bayarea.  Golden Gate, Bay, San Mateo and Dan Burton.');
901    $page_ping->source_url('http://example.com/');
902    $page_ping->blog_name("Example Blog");
903    $page_ping->created_on('20040101000000');
904    $page_ping->modified_on('20040101000000');
905    $page_ping->visible(1);
906    $page_ping->id(3);
907    $page_ping->save or die "Couldn't save TBPing record 1: " . $ping->errstr;
908
909    MT->instance->rebuild(
910        BlogId => 1,
911        EntryCallback => sub { print STDERR "# Rebuilding entry " . $_[0]->id . "\n" }
912    );
913
914    ### Make ObjectAsset mappings
915    require MT::ObjectAsset;
916    my $map;
917    $entry = MT::Entry->load(1);
918    if ($entry) {
919        $map = new MT::ObjectAsset;
920        $map->blog_id($entry->blog_id);
921        $map->asset_id(1);
922        $map->object_ds($entry->datasource);
923        $map->object_id($entry->id);
924        $map->save;
925    }
926    $page = MT::Page->load(20);
927    if ($entry) {
928        $map = new MT::ObjectAsset;
929        $map->blog_id($page->blog_id);
930        $map->asset_id(2);
931        $map->object_ds($page->datasource);
932        $map->object_id($page->id);
933        $map->save;
934    }
935
936    1;
937}
938
939sub _is_object {
940    my ($got, $expected, $name) = @_;
941
942    if (!defined $got) {
943        fail($name);
944        diag('    got undef, not an object');
945        return;
946    }
947
948    if (!$got->isa(ref $expected)) {
949        fail($name);
950        diag('    got a ', ref($got), ' but expected a ', ref $expected);
951        return;
952    }
953
954    if ($got == $expected) {
955        fail($name);
956        diag('    got the exact same instance as expected, when really expected a different but equivalent object');
957        return;
958    }
959
960    # Ignore object columns that have undefined values.
961    my (%got_values, %expected_values);
962    while (my ($field, $value) = each %{ $got->{column_values} }) {
963        $got_values{$field} = $value if defined $value;
964    }
965    while (my ($field, $value) = each %{ $expected->{column_values} }) {
966        $expected_values{$field} = $value if defined $value;
967    }
968
969    if (!eq_deeply(\%got_values, \%expected_values)) {
970        # 'Test' again so the helpful failure diagnostics are output.
971        is_deeply(\%got_values, \%expected_values, $name);
972        return;
973    }
974
975    return 1;
976}
977
978sub is_object {
979    my ($got, $expected, $name) = @_;
980    pass($name) if _is_object(@_);
981}
982
983sub are_objects {
984    my ($got, $expected, $name) = @_;
985
986    my $count = scalar @$expected;
987    if ($count != scalar @$got) {
988        fail($name);
989        diag('    got ', scalar(@$got), ' objects but expected ', $count);
990        return;
991    }
992
993    for my $i (0..$count-1) {
994        return if !_is_object($$got[$i], $$expected[$i], "$name (#$i)");
995    }
996    pass($name);
997}
998
999sub reset_table_for {
1000    my $self = shift;
1001    for my $class (@_) {
1002        my $driver    = $class->dbi_driver;
1003        my $dbh       = $driver->rw_handle;
1004        my $ddl_class = $driver->dbd->ddl_class;
1005
1006        $dbh->do($ddl_class->drop_table_sql($class)) or die $dbh->errstr;
1007        $dbh->do($ddl_class->create_table_sql($class)) or die $dbh->errstr;
1008        $dbh->do($_) or die $dbh->errstr for $ddl_class->index_table_sql($class);
1009        $ddl_class->drop_sequence($class),
1010        $ddl_class->create_sequence($class);  # may do nothing       
1011    }
1012}
1013
1014sub make_objects {
1015    my $self = shift;
1016    my @obj_data = @_;
1017
1018    for my $data (@obj_data) {
1019        if (my $wait = delete $data->{__wait}) {
1020            sleep($wait);
1021        }
1022        my $class = delete $data->{__class};
1023        my $obj = $class->new;
1024        $obj->set_values($data);
1025        $obj->save() or die "Could not save test Foo: ", $obj->errstr, "\n";
1026    }
1027}
1028
10291;
Note: See TracBrowser for help on using the browser.