Release commit for 1.62
[dbsrgits/SQL-Translator.git] / t / 16xml-parser.t
index a863ba4..165d11f 100644 (file)
@@ -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
@@ -26,146 +26,250 @@ use constant DEBUG => (exists $opt{d} ? 1 : 0);
 # Testing 1,2,3,4...
 #=============================================================================
 
-plan tests => 274;
+BEGIN {
+    maybe_plan(undef, 'SQL::Translator::Parser::XML::SQLFairy');
+}
+
+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;
 
-foreach (
-    "$Bin/data/xml/schema-basic.xml",
-    "$Bin/data/xml/schema-basic-attribs.xml"
-) {
-    do_file($_);
+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;
-    my @tblnames = map {$_->name} $scma->get_tables;
-    is_deeply( \@tblnames, [qw/Basic/], "tables");
-
-    # Basic
-    my $tbl = $scma->get_table("Basic");
-    is_deeply( [map {$_->name} $tbl->get_fields], [qw/
-        id title description email explicitnulldef explicitemptystring emptytagdef
-    /] , "Table Basic's fields");
-
-    table_ok( $scma->get_table("Basic"), {
-        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 => "",
-        },
+# 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 => "email",
-            data_type => "varchar",
-            size => 255,
-            is_unique => 1,
-            default_value => undef,
-            is_nullable => 1,
-        },
+            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",
+                    }
+                },
+                {
+                    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
         {
-            name => "explicitnulldef",
-            data_type => "varchar",
-            default_value => undef,
-            is_nullable => 1,
-        },
+            name => "Another",
+            extra => {
+                foo => "bar",
+                hello => "world",
+                bar => "baz",
+            },
+            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 => "explicitemptystring",
-            data_type => "varchar",
-            default_value => "",
-            is_nullable => 1,
+            name => 'email_list',
+            sql => "SELECT email FROM Basic WHERE (email IS NOT NULL)",
+            fields => ['email'],
+            extra => {
+                foo => "bar",
+                hello => "world",
+                bar => "baz",
+            },
         },
+    ],
+
+    triggers => [
         {
-            name => "emptytagdef",
-            data_type => "varchar",
-            default_value => "",
-            is_nullable => 1,
+            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",
+            },
         },
-        ],
-        constraints => [
         {
-            type => PRIMARY_KEY,
-            fields => ["id"],
+            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 => 'emailuniqueindex',
-            type => UNIQUE,
-            fields => ["email"],
-        }
-        ],
-        indices => [
-        {
-            name => "titleindex",
-            fields => ["title"],
+            name       => 'foo_proc',
+            sql        => 'select foo from bar',
+            parameters => ['foo', 'bar'],
+            owner      => 'Nomar',
+            comments   => 'Go Sox!',
+            extra => {
+                foo => "bar",
+                hello => "world",
+                bar => "baz",
+            },
         },
-        ],
-    });
-
-    #
-    # View
-    #
-    my @views = $scma->get_views;
-    view_ok( $views[0], {
-        name => 'email_list',
-        sql => "SELECT email FROM Basic WHERE email IS NOT NULL",
-        fields => ['email'],
-    });
-
-    my @triggs = $scma->get_triggers;
-    trigger_ok( $triggs[0], {
-        name                => 'foo_trigger',
-        perform_action_when => 'after',
-        database_event      => 'insert',
-        on_table            => 'foo',
-        action              => 'update modified=timestamp();',
-    });
-
-
-    #
-    # Procedure
-    #
-    my @procs = $scma->get_procedures;
-    procedure_ok( $procs[0], {
-        name       => 'foo_proc',
-        sql        => 'select foo from bar',
-        parameters => ['foo', 'bar'],
-        owner      => 'Nomar',
-        comments   => 'Go Sox!',
-    });
-
-    print "Debug:", Dumper($obj) if DEBUG;
-} # /Test of schema
+    ],
+
+}); # end schema
+
+done_testing;