initial xml test
Justin Hunter [Wed, 30 Sep 2009 18:51:36 +0000 (11:51 -0700)]
t/16xml-parser.t [new file with mode: 0644]
t/data/xml/samefield.xml [new file with mode: 0644]
t/data/xml/schema.xml [new file with mode: 0644]

diff --git a/t/16xml-parser.t b/t/16xml-parser.t
new file mode 100644 (file)
index 0000000..05145c6
--- /dev/null
@@ -0,0 +1,255 @@
+use strict;
+
+use FindBin qw/$Bin/;
+
+use Test::More;
+#use Test::SQL::Translator;
+use Test::Exception;
+use Data::Dumper;
+use SQL::Translator;
+use SQL::Translator::Constants qw(:sqlt_types :sqlt_constants);
+use Test::SQL::Translator qw(schema_ok);
+
+# Simple options. -d for debug
+my %opt;
+BEGIN { map { $opt{$_}=1 if s/^-// } @ARGV; }
+use constant DEBUG => (exists $opt{d} ? 1 : 0);
+
+
+# Testing 1,2,3,4...
+#=============================================================================
+
+#BEGIN {
+#    maybe_plan(212, 'SQL::Translator::Parser::XML::SQLFairy');
+#}
+
+my $testschema = "$Bin/data/xml/schema.xml";
+open (my $testschema_fh, '<', $testschema) or die "$testschema: $!";
+
+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(
+    parser     => 'XML',
+    producer   => 'MySQL',
+    data => do { local $/;  <$testschema_fh> },
+  ) or die $sqlt->error;
+  print $sql if DEBUG;
+
+  ok (@w, 'database_event deprecation warning issued');
+}
+
+# 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,
+                },
+                {
+                    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"],
+                },
+                {
+                    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 => "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,
+                },
+            ],
+        }, # 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();',
+            extra => {
+                foo => "bar",
+                hello => "world",
+                bar => "baz",
+            },
+        },
+        {
+            name                => 'bar_trigger',
+            perform_action_when => 'before',
+            database_events     => 'insert,update',
+            on_table            => 'Basic',
+            action              => 'update modified2=timestamp();',
+            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
+
+done_testing;
diff --git a/t/data/xml/samefield.xml b/t/data/xml/samefield.xml
new file mode 100644 (file)
index 0000000..3d75202
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 
+Created by SQL::Translator::Producer::SqlfXML
+Created on Fri Aug 15 15:08:18 2003
+
+ -->
+<schema xmlns="http://sqlfairy.sourceforge.net/sqlfairy.xml">
+    
+  <tables>
+      <table order="1" name="one">
+        <fields>
+          <field
+              name="same"
+              is_primary_key="0" is_foreign_key="0"
+              size="100" is_auto_increment="0" data_type="varchar"
+              order="1" default_value="hello" is_nullable="0" />
+        </fields>
+      </table>
+      <table order="2" name="two">
+        <fields>
+          <field
+              name="same"
+              is_primary_key="0" is_foreign_key="0"
+              size="100" is_auto_increment="0" data_type="varchar"
+              order="1" default_value="hello" is_nullable="0" />
+        </fields>
+      </table>
+  </tables>
+
+
+</schema>
diff --git a/t/data/xml/schema.xml b/t/data/xml/schema.xml
new file mode 100644 (file)
index 0000000..9949637
--- /dev/null
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 
+Created by SQL::Translator::Producer::SqlfXML
+Created on Fri Aug 15 15:08:18 2003
+
+ -->
+<schema xmlns="http://sqlfairy.sourceforge.net/sqlfairy.xml">
+    
+  <tables>
+      <table order="1" name="Basic">
+        <fields>
+          <field
+              name="id"
+              is_primary_key="1" is_foreign_key="0"
+              size="10" data_type="int" is_auto_increment="1" order="1"
+              is_nullable="0">
+              <extra ZEROFILL="1" />
+          </field>
+          <field
+              name="title"
+              is_primary_key="0" is_foreign_key="0"
+              size="100" is_auto_increment="0" data_type="varchar"
+              order="2" default_value="hello" is_nullable="0" />
+          <field
+              name="description"
+              size="0" data_type="text" order="3" default_value="" />
+          <field name="email" size="500" data_type="varchar" order="4">
+              <extra foo="bar" hello="world" bar="baz" />
+          </field>
+          <field name="explicitnulldef" size="0" data_type="varchar" order="5" />
+          <field name="explicitemptystring" size="0"
+              data_type="varchar" order="6" default_value="" />
+          <field name="emptytagdef" size="0"
+              data_type="varchar" order="7" default_value="" >
+              <comments>Hello emptytagdef</comments>
+          </field>
+          <field name="another_id" size="10"
+              data_type="int" default_value="2" />
+          <field name="timest" size="0"
+              data_type="timestamp" order="7" >
+          </field>
+        </fields>
+
+        <indices>
+          <index name="titleindex" fields="title" type="NORMAL">
+            <extra foo="bar" hello="world" bar="baz" />
+          </index>
+        </indices>
+
+        <constraints>
+          <constraint name="" type="PRIMARY KEY" fields="id"
+              reference_table="" options="" deferrable="1" match_type=""
+              expression="" on_update="" on_delete="">
+              <extra foo="bar" hello="world" bar="baz" />
+          </constraint>
+          <constraint name="emailuniqueindex" type="UNIQUE" fields="email" />
+          <constraint name="" type="FOREIGN KEY" fields="another_id"
+              reference_table="Another" options="" deferrable="1" match_type=""
+              expression="" on_update="" on_delete="">
+          </constraint>
+        </constraints>
+        
+        <extra foo="bar" hello="world" bar="baz" mysql_table_type="InnoDB" />
+      </table>
+
+      <table order="1" name="Another">
+        <fields>
+          <field
+              name="id"
+              is_primary_key="1" is_foreign_key="0"
+              size="10" data_type="int" is_auto_increment="1" order="1"
+              is_nullable="0">
+          </field>
+        </fields>
+
+        <constraints>
+          <constraint name="" type="PRIMARY KEY" fields="id"
+              reference_table="" options="" deferrable="1" match_type=""
+              expression="" on_update="" on_delete="">
+          </constraint>
+        </constraints>
+
+        <extra foo="bar" hello="world" bar="baz" mysql_table_type="InnoDB" />
+      </table>
+  </tables>
+
+  <views>
+      <view name="email_list" fields="email" order="1">
+          <sql>SELECT email FROM Basic WHERE (email IS NOT NULL)</sql>
+          <extra foo="bar" hello="world" bar="baz" />
+      </view>
+  </views>
+
+  <triggers>
+      <trigger name="foo_trigger" database_event="insert" on_table="Basic"
+          perform_action_when="after" order="1">
+          <action>update modified=timestamp();</action>
+          <extra foo="bar" hello="world" bar="baz" />
+      </trigger>
+      <trigger name="bar_trigger" database_events="insert , update" on_table="Basic"
+          perform_action_when="before" order="1">
+          <action>update modified2=timestamp();</action>
+          <extra hello="aliens" />
+      </trigger>
+  </triggers>
+
+  <procedures>
+      <procedure name="foo_proc" order="1" owner="Nomar" parameters="foo,bar">
+          <sql>select foo from bar</sql>
+          <comments>Go Sox!</comments>
+          <extra foo="bar" hello="world" bar="baz" />
+      </procedure>
+  </procedures>
+
+</schema>