Improve trigger 'scope' attribute support (RT#119997)
[dbsrgits/SQL-Translator.git] / t / 17sqlfxml-producer.t
CommitLineData
ec791002 1#!/usr/bin/perl -w
d0c12b9f 2# vim:filetype=perl
3
4# Before `make install' is performed this script should be runnable with
5# `make test'. After `make install' it should work as `perl test.pl'
6
1ea530d4 7local $^W = 0;
8
d0c12b9f 9use strict;
10use Test::More;
11use Test::Exception;
2d691ec1 12use Test::SQL::Translator qw(maybe_plan);
d0c12b9f 13
14use Data::Dumper;
2e11379e 15my %opt;
d0c12b9f 16BEGIN { map { $opt{$_}=1 if s/^-// } @ARGV; }
17use constant DEBUG => (exists $opt{d} ? 1 : 0);
18use constant TRACE => (exists $opt{t} ? 1 : 0);
19
20use FindBin qw/$Bin/;
21
22my $file = "$Bin/data/mysql/sqlfxml-producer-basic.sql";
23
fbc0552f 24local $SIG{__WARN__} = sub {
25 CORE::warn(@_)
8ce5d615 26 unless $_[0] =~ m!XML/Writer!;
fbc0552f 27};
d0c12b9f 28
29# Testing 1,2,3,4...
30#=============================================================================
31
2d691ec1 32BEGIN {
87c5565e 33 maybe_plan(14,
2d691ec1 34 'XML::Writer',
35 'Test::Differences',
36 'SQL::Translator::Producer::XML::SQLFairy');
d0c12b9f 37}
d3422086 38
2d691ec1 39use Test::Differences;
d0c12b9f 40use SQL::Translator;
ac62dff1 41use SQL::Translator::Producer::XML::SQLFairy;
d0c12b9f 42
715b8295 43# Due to formatters being able to change style, e.g. by entries in .rc files
44# in $HOME, the layout and or indent might differ slightly. As leading white
45# is not important in XML, strip it when comparing
46sub xml_equals
47{
48 my ($got, $expect, $msg) = (@_, "XML looks right");
49 $got =~ s/^ +//gm;
50 $expect =~ s/^ +//gm;
51 eq_or_diff $got, $expect, $msg;
52}
53
d0c12b9f 54#
ec791002 55# basic stuff
d0c12b9f 56#
1e3867bf 57{
58my ($obj,$ans,$xml);
d0c12b9f 59
60$ans = <<EOXML;
983ed646 61<schema name="" database="" xmlns="http://sqlfairy.sourceforge.net/sqlfairy.xml">
0eebe059 62 <extra />
87c5565e 63 <tables>
64 <table name="Basic" order="1">
0eebe059 65 <extra />
87c5565e 66 <fields>
67 <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">
68 <extra />
69 <comments>comment on id field</comments>
70 </field>
71 <field name="title" data_type="varchar" size="100" is_nullable="0" default_value="hello" is_auto_increment="0" is_primary_key="0" is_foreign_key="0" order="2">
72 <extra />
73 <comments></comments>
74 </field>
75 <field name="description" data_type="text" size="65535" is_nullable="1" default_value="" is_auto_increment="0" is_primary_key="0" is_foreign_key="0" order="3">
76 <extra />
77 <comments></comments>
78 </field>
79 <field name="email" data_type="varchar" size="255" is_nullable="1" is_auto_increment="0" is_primary_key="0" is_foreign_key="0" order="4">
80 <extra />
81 <comments></comments>
82 </field>
83 </fields>
84 <indices>
0eebe059 85 <index name="titleindex" type="NORMAL" fields="title" options="">
86 <extra />
87 </index>
87c5565e 88 </indices>
89 <constraints>
0eebe059 90 <constraint name="" type="PRIMARY KEY" fields="id" reference_table="" reference_fields="" on_delete="" on_update="" match_type="" expression="" options="" deferrable="1">
91 <extra />
92 </constraint>
93 <constraint name="" type="UNIQUE" fields="email" reference_table="" reference_fields="" on_delete="" on_update="" match_type="" expression="" options="" deferrable="1">
94 <extra />
95 </constraint>
87c5565e 96 </constraints>
a4fb1ddc 97 <comments></comments>
87c5565e 98 </table>
99 </tables>
100 <views></views>
101 <triggers></triggers>
102 <procedures></procedures>
983ed646 103</schema>
f11724ad 104EOXML
105
106$obj = SQL::Translator->new(
107 debug => DEBUG,
108 trace => TRACE,
109 show_warnings => 1,
110 add_drop_table => 1,
111 from => "MySQL",
112 to => "XML-SQLFairy",
f11724ad 113);
87c5565e 114$xml = $obj->translate($file) or die $obj->error;
f11724ad 115ok("$xml" ne "" ,"Produced something!");
ec791002 116print "XML:\n$xml" if DEBUG;
f11724ad 117# Strip sqlf header with its variable date so we diff safely
ec791002 118$xml =~ s/^([^\n]*\n){7}//m;
715b8295 119xml_equals $xml, $ans;
f11724ad 120
ec791002 121} # end basic stuff
1e3867bf 122
123#
124# View
125#
126# Thanks to Ken for the schema setup lifted from 13schema.t
127{
128my ($obj,$ans,$xml);
129
130$ans = <<EOXML;
983ed646 131<schema name="" database="" xmlns="http://sqlfairy.sourceforge.net/sqlfairy.xml">
0eebe059 132 <extra />
87c5565e 133 <tables></tables>
134 <views>
135 <view name="foo_view" fields="name,age" order="1">
136 <sql>select name, age from person</sql>
0eebe059 137 <extra hello="world" />
87c5565e 138 </view>
139 </views>
140 <triggers></triggers>
141 <procedures></procedures>
983ed646 142</schema>
1e3867bf 143EOXML
144
145 $obj = SQL::Translator->new(
146 debug => DEBUG,
147 trace => TRACE,
148 show_warnings => 1,
149 add_drop_table => 1,
150 from => "MySQL",
151 to => "XML-SQLFairy",
152 );
153 my $s = $obj->schema;
154 my $name = 'foo_view';
155 my $sql = 'select name, age from person';
156 my $fields = 'name, age';
157 my $v = $s->add_view(
158 name => $name,
159 sql => $sql,
160 fields => $fields,
0eebe059 161 extra => { hello => "world" },
1e3867bf 162 schema => $s,
163 ) or die $s->error;
ec791002 164
1e3867bf 165 # As we have created a Schema we give translate a dummy string so that
166 # it will run the produce.
167 lives_ok {$xml =$obj->translate("FOO");} "Translate (View) ran";
168 ok("$xml" ne "" ,"Produced something!");
169 print "XML attrib_values=>1:\n$xml" if DEBUG;
170 # Strip sqlf header with its variable date so we diff safely
aee4b66e 171 $xml =~ s/^([^\n]*\n){7}//m;
715b8295 172 xml_equals $xml, $ans;
1e3867bf 173} # end View
174
175#
176# Trigger
177#
178# Thanks to Ken for the schema setup lifted from 13schema.t
179{
180my ($obj,$ans,$xml);
181
182$ans = <<EOXML;
983ed646 183<schema name="" database="" xmlns="http://sqlfairy.sourceforge.net/sqlfairy.xml">
0eebe059 184 <extra />
8ce5d615 185 <tables>
d37416fd 186 <table name="Basic" order="1">
8ce5d615 187 <extra />
188 <fields></fields>
189 <indices></indices>
190 <constraints></constraints>
191 <comments></comments>
192 </table>
193 </tables>
87c5565e 194 <views></views>
195 <triggers>
c0ec0e22 196 <trigger name="foo_trigger" database_events="insert" on_table="Basic" perform_action_when="after" order="1" scope="row">
87c5565e 197 <action>update modified=timestamp();</action>
0eebe059 198 <extra hello="world" />
87c5565e 199 </trigger>
200 </triggers>
201 <procedures></procedures>
983ed646 202</schema>
1e3867bf 203EOXML
204
205 $obj = SQL::Translator->new(
206 debug => DEBUG,
207 trace => TRACE,
208 show_warnings => 1,
209 add_drop_table => 1,
210 from => "MySQL",
211 to => "XML-SQLFairy",
212 );
213 my $s = $obj->schema;
214 my $name = 'foo_trigger';
215 my $perform_action_when = 'after';
216 my $database_event = 'insert';
1e3867bf 217 my $action = 'update modified=timestamp();';
8ce5d615 218 my $table = $s->add_table( name => "Basic" ) or die $s->error;
1e3867bf 219 my $t = $s->add_trigger(
220 name => $name,
221 perform_action_when => $perform_action_when,
f9c96971 222 database_events => [$database_event],
8ce5d615 223 table => $table,
1e3867bf 224 action => $action,
c0ec0e22 225 scope => 'row',
0eebe059 226 extra => { hello => "world" },
1e3867bf 227 ) or die $s->error;
ec791002 228
1e3867bf 229 # As we have created a Schema we give translate a dummy string so that
230 # it will run the produce.
231 lives_ok {$xml =$obj->translate("FOO");} "Translate (Trigger) ran";
232 ok("$xml" ne "" ,"Produced something!");
233 print "XML attrib_values=>1:\n$xml" if DEBUG;
234 # Strip sqlf header with its variable date so we diff safely
aee4b66e 235 $xml =~ s/^([^\n]*\n){7}//m;
715b8295 236 xml_equals $xml, $ans;
1e3867bf 237} # end Trigger
238
239#
240# Procedure
241#
242# Thanks to Ken for the schema setup lifted from 13schema.t
243{
244my ($obj,$ans,$xml);
245
246$ans = <<EOXML;
983ed646 247<schema name="" database="" xmlns="http://sqlfairy.sourceforge.net/sqlfairy.xml">
0eebe059 248 <extra />
87c5565e 249 <tables></tables>
250 <views></views>
251 <triggers></triggers>
252 <procedures>
253 <procedure name="foo_proc" parameters="foo,bar" owner="Nomar" order="1">
254 <sql>select foo from bar</sql>
255 <comments>Go Sox!</comments>
0eebe059 256 <extra hello="world" />
87c5565e 257 </procedure>
258 </procedures>
983ed646 259</schema>
1e3867bf 260EOXML
261
262 $obj = SQL::Translator->new(
263 debug => DEBUG,
264 trace => TRACE,
265 show_warnings => 1,
266 add_drop_table => 1,
267 from => "MySQL",
268 to => "XML-SQLFairy",
269 );
270 my $s = $obj->schema;
271 my $name = 'foo_proc';
272 my $sql = 'select foo from bar';
273 my $parameters = 'foo, bar';
274 my $owner = 'Nomar';
275 my $comments = 'Go Sox!';
276 my $p = $s->add_procedure(
277 name => $name,
278 sql => $sql,
279 parameters => $parameters,
280 owner => $owner,
281 comments => $comments,
0eebe059 282 extra => { hello => "world" },
1e3867bf 283 ) or die $s->error;
d3422086 284
1e3867bf 285 # As we have created a Schema we give translate a dummy string so that
286 # it will run the produce.
287 lives_ok {$xml =$obj->translate("FOO");} "Translate (Procedure) ran";
288 ok("$xml" ne "" ,"Produced something!");
289 print "XML attrib_values=>1:\n$xml" if DEBUG;
290 # Strip sqlf header with its variable date so we diff safely
aee4b66e 291 $xml =~ s/^([^\n]*\n){7}//m;
715b8295 292 xml_equals $xml, $ans;
1e3867bf 293} # end Procedure
e0a0c3e1 294
295#
296# Field.extra
297#
298{
299my ($obj,$ans,$xml);
300
301$ans = <<EOXML;
302<schema name="" database="" xmlns="http://sqlfairy.sourceforge.net/sqlfairy.xml">
0eebe059 303 <extra />
87c5565e 304 <tables>
d37416fd 305 <table name="Basic" order="1">
0eebe059 306 <extra />
87c5565e 307 <fields>
d37416fd 308 <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">
87c5565e 309 <extra ZEROFILL="1" />
310 <comments></comments>
311 </field>
0a0aab7b 312 <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">
313 <extra />
314 <comments></comments>
315 </field>
316 <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">
317 <extra />
318 <comments></comments>
319 </field>
87c5565e 320 </fields>
321 <indices></indices>
322 <constraints></constraints>
a4fb1ddc 323 <comments></comments>
87c5565e 324 </table>
325 </tables>
326 <views></views>
327 <triggers></triggers>
328 <procedures></procedures>
e0a0c3e1 329</schema>
330EOXML
331
332 $obj = SQL::Translator->new(
333 debug => DEBUG,
334 trace => TRACE,
335 show_warnings => 1,
336 add_drop_table => 1,
337 from => "MySQL",
338 to => "XML-SQLFairy",
339 );
340 my $s = $obj->schema;
341 my $t = $s->add_table( name => "Basic" ) or die $s->error;
342 my $f = $t->add_field(
343 name => "foo",
344 data_type => "integer",
345 size => "10",
346 ) or die $t->error;
347 $f->extra(ZEROFILL => "1");
348
0a0aab7b 349 $t->add_field(
350 name => "bar",
351 data_type => "numeric",
352 size => "10,2",
353 ) or die $t->error;
354 $t->add_field(
355 name => "baz",
356 data_type => "decimal",
357 size => [8,3],
358 ) or die $t->error;
359
360
e0a0c3e1 361 # As we have created a Schema we give translate a dummy string so that
362 # it will run the produce.
363 lives_ok {$xml =$obj->translate("FOO");} "Translate (Field.extra) ran";
364 ok("$xml" ne "" ,"Produced something!");
365 print "XML:\n$xml" if DEBUG;
366 # Strip sqlf header with its variable date so we diff safely
367 $xml =~ s/^([^\n]*\n){7}//m;
715b8295 368 xml_equals $xml, $ans;
e0a0c3e1 369} # end extra