X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F16xml-parser.t;h=165d11fb25a8162b0591adec0f2d204472e02120;hb=2c4ace8a43bc2f9c387fc0d4d22699b8e1c1baca;hp=a407d2c04b51dd6a941547ae0803fc6cf254cb87;hpb=2d691ec135298f8a4523656dc0516dcb7af3e8cd;p=dbsrgits%2FSQL-Translator.git diff --git a/t/16xml-parser.t b/t/16xml-parser.t index a407d2c..165d11f 100644 --- a/t/16xml-parser.t +++ b/t/16xml-parser.t @@ -1,4 +1,4 @@ -#!/usr/bin/perl -w +#!/usr/bin/perl -w # vim:filetype=perl # Before `make install' is performed this script should be runnable with @@ -25,144 +25,251 @@ use constant DEBUG => (exists $opt{d} ? 1 : 0); # Testing 1,2,3,4... #============================================================================= - + BEGIN { - maybe_plan(284, 'SQL::Translator::Parser::XML::SQLFairy'); + maybe_plan(undef, 'SQL::Translator::Parser::XML::SQLFairy'); } -foreach ( - "$Bin/data/xml/schema-basic.xml", - "$Bin/data/xml/schema-basic-attribs.xml" -) { - do_file($_); +my $testschema = "$Bin/data/xml/schema.xml"; + +my $sqlt; +$sqlt = SQL::Translator->new( + debug => DEBUG, + show_warnings => 1, + add_drop_table => 1, +); +die "Can't find test schema $testschema" unless -e $testschema; + +my $sql; +{ + my @w; + local $SIG{__WARN__} = sub { push @w, $_[0] if $_[0] =~ /The database_event tag is deprecated - please use database_events/ }; + + $sql = $sqlt->translate( + from => 'XML-SQLFairy', + to => 'MySQL', + filename => $testschema, + ) or die $sqlt->error; + print $sql if DEBUG; + + ok (@w, 'database_event deprecation warning issued'); } -sub do_file { - my $testschema = shift; - # Parse the test XML schema - my $obj; - $obj = SQL::Translator->new( - debug => DEBUG, - show_warnings => 1, - add_drop_table => 1, - ); - die "Can't find test schema $testschema" unless -e $testschema; - my $sql = $obj->translate( - from => 'XML-SQLFairy', - to => 'MySQL', - filename => $testschema, - ); - print $sql if DEBUG; - - # Test the schema objs generted from the XML - # - my $scma = $obj->schema; - - # Hmmm, when using schema_ok the field test data gets a bit too nested and - # fiddly to work with. (See 28xml-xmi-parser-sqlfairy.t for more split out - # version) - schema_ok( $scma, { - tables => [ - { - name => "Basic", - fields => [ - { - name => "id", - data_type => "int", - default_value => undef, - is_nullable => 0, - size => 10, - is_primary_key => 1, - is_auto_increment => 1, - }, - { - name => "title", - data_type => "varchar", - is_nullable => 0, - default_value => "hello", - size => 100, - }, - { - name => "description", - data_type => "text", - is_nullable => 1, - default_value => "", - }, - { - name => "email", - data_type => "varchar", - size => 255, - is_unique => 1, - default_value => undef, - is_nullable => 1, - }, - { - name => "explicitnulldef", - data_type => "varchar", - default_value => undef, - is_nullable => 1, - }, - { - name => "explicitemptystring", - data_type => "varchar", - default_value => "", - is_nullable => 1, - }, - { - name => "emptytagdef", - data_type => "varchar", - default_value => "", - is_nullable => 1, - }, - ], - constraints => [ - { - type => PRIMARY_KEY, - fields => ["id"], - }, - { - name => 'emailuniqueindex', - type => UNIQUE, - fields => ["email"], +# Test the schema objs generted from the XML +# +my $scma = $sqlt->schema; + +# Hmmm, when using schema_ok the field test data gets a bit too nested and +# fiddly to work with. (See 28xml-xmi-parser-sqlfairy.t for more a split out +# version) +schema_ok( $scma, { + tables => [ + { + name => "Basic", + options => [ { ENGINE => 'InnoDB' } ], + extra => { + foo => "bar", + hello => "world", + bar => "baz", + }, + fields => [ + { + name => "id", + data_type => "int", + default_value => undef, + is_nullable => 0, + size => 10, + is_primary_key => 1, + is_auto_increment => 1, + extra => { ZEROFILL => 1 }, + }, + { + name => "title", + data_type => "varchar", + is_nullable => 0, + default_value => "hello", + size => 100, + is_unique => 1, + }, + { + name => "description", + data_type => "text", + is_nullable => 1, + default_value => "", + }, + { + name => "email", + data_type => "varchar", + size => 500, + is_unique => 1, + default_value => undef, + is_nullable => 1, + extra => { + foo => "bar", + hello => "world", + bar => "baz", } - ], - indices => [ - { - name => "titleindex", - fields => ["title"], + }, + { + name => "explicitnulldef", + data_type => "varchar", + default_value => undef, + is_nullable => 1, + size => 255, + }, + { + name => "explicitemptystring", + data_type => "varchar", + default_value => "", + is_nullable => 1, + size => 255, + }, + { + name => "emptytagdef", + data_type => "varchar", + default_value => "", + is_nullable => 1, + comments => "Hello emptytagdef", + size => 255, + }, + { + name => "another_id", + data_type => "int", + size => "10", + default_value => 2, + is_nullable => 1, + is_foreign_key => 1, + }, + { + name => "timest", + data_type => "timestamp", + size => "0", + is_nullable => 1, + }, + ], + constraints => [ + { + type => PRIMARY_KEY, + fields => ["id"], + extra => { + foo => "bar", + hello => "world", + bar => "baz", + }, + }, + { + name => 'emailuniqueindex', + type => UNIQUE, + fields => ["email"], + }, + { + name => 'very_long_index_name_on_title_field_which_should_be_truncated_for_various_rdbms', + type => UNIQUE, + fields => ["title"], + }, + { + type => FOREIGN_KEY, + fields => ["another_id"], + reference_table => "Another", + reference_fields => ["id"], + name => 'Basic_fk' + }, + ], + indices => [ + { + name => "titleindex", + fields => ["title"], + extra => { + foo => "bar", + hello => "world", + bar => "baz", }, - ], - } # end table Basic - ], # end tables - - views => [ - { - name => 'email_list', - sql => "SELECT email FROM Basic WHERE email IS NOT NULL", - fields => ['email'], + }, + ], + }, # end table Basic + { + name => "Another", + extra => { + foo => "bar", + hello => "world", + bar => "baz", }, - ], - - triggers => [ - { - name => 'foo_trigger', - perform_action_when => 'after', - database_event => 'insert', - on_table => 'foo', - action => 'update modified=timestamp();', + options => [ { ENGINE => 'InnoDB' } ], + fields => [ + { + name => "id", + data_type => "int", + default_value => undef, + is_nullable => 0, + size => 10, + is_primary_key => 1, + is_auto_increment => 1, + }, + { + name => "num", + data_type => "numeric", + default_value => undef, + size => '10,2', + }, + ], + }, # end table Another + ], # end tables + + views => [ + { + name => 'email_list', + sql => "SELECT email FROM Basic WHERE (email IS NOT NULL)", + fields => ['email'], + extra => { + foo => "bar", + hello => "world", + bar => "baz", + }, + }, + ], + + triggers => [ + { + name => 'foo_trigger', + perform_action_when => 'after', + database_events => 'insert', + on_table => 'Basic', + action => 'update modified=timestamp();', + scope => 'row', + extra => { + foo => "bar", + hello => "world", + bar => "baz", }, - ], - - procedures => [ - { - name => 'foo_proc', - sql => 'select foo from bar', - parameters => ['foo', 'bar'], - owner => 'Nomar', - comments => 'Go Sox!', + }, + { + name => 'bar_trigger', + perform_action_when => 'before', + database_events => 'insert,update', + on_table => 'Basic', + action => 'update modified2=timestamp();', + scope => 'row', + extra => { + hello => "aliens", + }, + }, + ], + + procedures => [ + { + name => 'foo_proc', + sql => 'select foo from bar', + parameters => ['foo', 'bar'], + owner => 'Nomar', + comments => 'Go Sox!', + extra => { + foo => "bar", + hello => "world", + bar => "baz", }, - ], + }, + ], - }); # end schema +}); # end schema -} # end do_file() +done_testing;