Improve trigger 'scope' attribute support (RT#119997)
[dbsrgits/SQL-Translator.git] / t / 17sqlfxml-producer.t
index 091bee1..7989e35 100644 (file)
@@ -23,7 +23,7 @@ my $file = "$Bin/data/mysql/sqlfxml-producer-basic.sql";
 
 local $SIG{__WARN__} = sub {
     CORE::warn(@_)
-        unless $_[0] =~ m#XML/Writer#;
+        unless $_[0] =~ m!XML/Writer!;
 };
 
 # Testing 1,2,3,4...
@@ -40,6 +40,17 @@ use Test::Differences;
 use SQL::Translator;
 use SQL::Translator::Producer::XML::SQLFairy;
 
+# Due to formatters being able to change style, e.g. by entries in .rc files
+# in $HOME, the layout and or indent might differ slightly. As leading white
+# is not important in XML, strip it when comparing
+sub xml_equals
+{
+    my ($got, $expect, $msg) = (@_, "XML looks right");
+    $got    =~ s/^ +//gm;
+    $expect =~ s/^ +//gm;
+    eq_or_diff $got, $expect, $msg;
+}
+
 #
 # basic stuff
 #
@@ -48,8 +59,10 @@ my ($obj,$ans,$xml);
 
 $ans = <<EOXML;
 <schema name="" database="" xmlns="http://sqlfairy.sourceforge.net/sqlfairy.xml">
+  <extra />
   <tables>
     <table name="Basic" order="1">
+      <extra />
       <fields>
         <field name="id" data_type="integer" size="10" is_nullable="0" is_auto_increment="1" is_primary_key="1" is_foreign_key="0" order="1">
           <extra />
@@ -69,12 +82,19 @@ $ans = <<EOXML;
         </field>
       </fields>
       <indices>
-        <index name="titleindex" type="NORMAL" fields="title" options="" />
+        <index name="titleindex" type="NORMAL" fields="title" options="">
+          <extra />
+        </index>
       </indices>
       <constraints>
-        <constraint name="" type="PRIMARY KEY" fields="id" reference_table="" reference_fields="" on_delete="" on_update="" match_type="" expression="" options="" deferrable="1" />
-        <constraint name="" type="UNIQUE" fields="email" reference_table="" reference_fields="" on_delete="" on_update="" match_type="" expression="" options="" deferrable="1" />
+        <constraint name="" type="PRIMARY KEY" fields="id" reference_table="" reference_fields="" on_delete="" on_update="" match_type="" expression="" options="" deferrable="1">
+          <extra />
+        </constraint>
+        <constraint name="" type="UNIQUE" fields="email" reference_table="" reference_fields="" on_delete="" on_update="" match_type="" expression="" options="" deferrable="1">
+          <extra />
+        </constraint>
       </constraints>
+      <comments></comments>
     </table>
   </tables>
   <views></views>
@@ -96,7 +116,7 @@ ok("$xml" ne ""                             ,"Produced something!");
 print "XML:\n$xml" if DEBUG;
 # Strip sqlf header with its variable date so we diff safely
 $xml =~ s/^([^\n]*\n){7}//m;
-eq_or_diff $xml, $ans, "XML looks right";
+xml_equals $xml, $ans;
 
 } # end basic stuff
 
@@ -109,10 +129,12 @@ my ($obj,$ans,$xml);
 
 $ans = <<EOXML;
 <schema name="" database="" xmlns="http://sqlfairy.sourceforge.net/sqlfairy.xml">
+  <extra />
   <tables></tables>
   <views>
     <view name="foo_view" fields="name,age" order="1">
       <sql>select name, age from person</sql>
+      <extra hello="world" />
     </view>
   </views>
   <triggers></triggers>
@@ -136,6 +158,7 @@ EOXML
         name   => $name,
         sql    => $sql,
         fields => $fields,
+        extra  => { hello => "world" },
         schema => $s,
     ) or die $s->error;
 
@@ -145,8 +168,8 @@ EOXML
     ok("$xml" ne ""                             ,"Produced something!");
     print "XML attrib_values=>1:\n$xml" if DEBUG;
     # Strip sqlf header with its variable date so we diff safely
-    $xml =~ s/^([^\n]*\n){7}//m; 
-    eq_or_diff $xml, $ans                       ,"XML looks right";
+    $xml =~ s/^([^\n]*\n){7}//m;
+    xml_equals $xml, $ans;
 } # end View
 
 #
@@ -158,11 +181,21 @@ my ($obj,$ans,$xml);
 
 $ans = <<EOXML;
 <schema name="" database="" xmlns="http://sqlfairy.sourceforge.net/sqlfairy.xml">
-  <tables></tables>
+  <extra />
+  <tables>
+    <table name="Basic" order="1">
+      <extra />
+      <fields></fields>
+      <indices></indices>
+      <constraints></constraints>
+      <comments></comments>
+    </table>
+  </tables>
   <views></views>
   <triggers>
-    <trigger name="foo_trigger" database_event="insert" on_table="foo" perform_action_when="after" order="1">
+    <trigger name="foo_trigger" database_events="insert" on_table="Basic" perform_action_when="after" order="1" scope="row">
       <action>update modified=timestamp();</action>
+      <extra hello="world" />
     </trigger>
   </triggers>
   <procedures></procedures>
@@ -181,14 +214,16 @@ EOXML
     my $name                = 'foo_trigger';
     my $perform_action_when = 'after';
     my $database_event      = 'insert';
-    my $on_table            = 'foo';
     my $action              = 'update modified=timestamp();';
+    my $table = $s->add_table( name => "Basic" ) or die $s->error;
     my $t                   = $s->add_trigger(
         name                => $name,
         perform_action_when => $perform_action_when,
-        database_event      => $database_event,
-        on_table            => $on_table,
+        database_events     => [$database_event],
+        table               => $table,
         action              => $action,
+        scope               => 'row',
+        extra               => { hello => "world" },
     ) or die $s->error;
 
     # As we have created a Schema we give translate a dummy string so that
@@ -197,8 +232,8 @@ EOXML
     ok("$xml" ne ""                             ,"Produced something!");
     print "XML attrib_values=>1:\n$xml" if DEBUG;
     # Strip sqlf header with its variable date so we diff safely
-    $xml =~ s/^([^\n]*\n){7}//m; 
-    eq_or_diff $xml, $ans                       ,"XML looks right";
+    $xml =~ s/^([^\n]*\n){7}//m;
+    xml_equals $xml, $ans;
 } # end Trigger
 
 #
@@ -210,6 +245,7 @@ my ($obj,$ans,$xml);
 
 $ans = <<EOXML;
 <schema name="" database="" xmlns="http://sqlfairy.sourceforge.net/sqlfairy.xml">
+  <extra />
   <tables></tables>
   <views></views>
   <triggers></triggers>
@@ -217,6 +253,7 @@ $ans = <<EOXML;
     <procedure name="foo_proc" parameters="foo,bar" owner="Nomar" order="1">
       <sql>select foo from bar</sql>
       <comments>Go Sox!</comments>
+      <extra hello="world" />
     </procedure>
   </procedures>
 </schema>
@@ -242,6 +279,7 @@ EOXML
         parameters => $parameters,
         owner      => $owner,
         comments   => $comments,
+        extra      => { hello => "world" },
     ) or die $s->error;
 
     # As we have created a Schema we give translate a dummy string so that
@@ -250,8 +288,8 @@ EOXML
     ok("$xml" ne ""                             ,"Produced something!");
     print "XML attrib_values=>1:\n$xml" if DEBUG;
     # Strip sqlf header with its variable date so we diff safely
-    $xml =~ s/^([^\n]*\n){7}//m; 
-    eq_or_diff $xml, $ans                       ,"XML looks right";
+    $xml =~ s/^([^\n]*\n){7}//m;
+    xml_equals $xml, $ans;
 } # end Procedure
 
 #
@@ -262,16 +300,27 @@ my ($obj,$ans,$xml);
 
 $ans = <<EOXML;
 <schema name="" database="" xmlns="http://sqlfairy.sourceforge.net/sqlfairy.xml">
+  <extra />
   <tables>
-    <table name="Basic" order="2">
+    <table name="Basic" order="1">
+      <extra />
       <fields>
-        <field name="foo" data_type="integer" size="10" is_nullable="1" is_auto_increment="0" is_primary_key="0" is_foreign_key="0" order="5">
+        <field name="foo" data_type="integer" size="10" is_nullable="1" is_auto_increment="0" is_primary_key="0" is_foreign_key="0" order="1">
           <extra ZEROFILL="1" />
           <comments></comments>
         </field>
+        <field name="bar" data_type="numeric" size="10,2" is_nullable="1" is_auto_increment="0" is_primary_key="0" is_foreign_key="0" order="2">
+          <extra />
+          <comments></comments>
+        </field>
+        <field name="baz" data_type="decimal" size="8,3" is_nullable="1" is_auto_increment="0" is_primary_key="0" is_foreign_key="0" order="3">
+          <extra />
+          <comments></comments>
+        </field>
       </fields>
       <indices></indices>
       <constraints></constraints>
+      <comments></comments>
     </table>
   </tables>
   <views></views>
@@ -297,6 +346,18 @@ EOXML
     ) or die $t->error;
     $f->extra(ZEROFILL => "1");
 
+    $t->add_field(
+        name      => "bar",
+        data_type => "numeric",
+        size      => "10,2",
+    ) or die $t->error;
+    $t->add_field(
+        name      => "baz",
+        data_type => "decimal",
+        size      => [8,3],
+    ) or die $t->error;
+
+
     # As we have created a Schema we give translate a dummy string so that
     # it will run the produce.
     lives_ok {$xml =$obj->translate("FOO");} "Translate (Field.extra) ran";
@@ -304,5 +365,5 @@ EOXML
     print "XML:\n$xml" if DEBUG;
     # Strip sqlf header with its variable date so we diff safely
     $xml =~ s/^([^\n]*\n){7}//m;
-    eq_or_diff $xml, $ans                       ,"XML looks right";
+    xml_equals $xml, $ans;
 } # end extra