Fixed so they test for empty list reference_fields and not the old undef return.
[dbsrgits/SQL-Translator.git] / t / 17sqlfxml-producer.t
1 #!/usr/bin/perl -w 
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
7 local $^W = 0;
8
9 use strict;
10 use Test::More;
11 use Test::Exception;
12
13 use Data::Dumper;
14 my %opt;
15 BEGIN { map { $opt{$_}=1 if s/^-// } @ARGV; }
16 use constant DEBUG => (exists $opt{d} ? 1 : 0);
17 use constant TRACE => (exists $opt{t} ? 1 : 0);
18
19 use FindBin qw/$Bin/;
20
21 my $file = "$Bin/data/mysql/sqlfxml-producer-basic.sql";
22
23 local $SIG{__WARN__} = sub {
24     CORE::warn(@_)
25         unless $_[0] =~ m#XML/Writer#;
26 };
27
28 # Testing 1,2,3,4...
29 #=============================================================================
30
31 eval { require XML::Writer; };
32 if ($@ && $@ =~ m!locate XML::Writer.pm in!) {
33     plan skip_all => "You need XML::Writer to use XML::SQLFairy.";
34 }
35 eval { require Test::Differences; };
36 if ($@ && $@ =~ m!locate Test/Differences.pm in!) {
37     plan skip_all => "You need Test::Differences for this test.";
38 }
39 use Test::Differences;
40 plan tests => 18;
41
42 use SQL::Translator;
43 use SQL::Translator::Producer::XML::SQLFairy;
44
45 #
46 # emit_empty_tags => 0
47 #
48 {
49 my ($obj,$ans,$xml);
50
51 $ans = <<EOXML;
52 <sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
53   <sqlt:name></sqlt:name>
54   <sqlt:database></sqlt:database>
55   <sqlt:table>
56     <sqlt:name>Basic</sqlt:name>
57     <sqlt:order>1</sqlt:order>
58     <sqlt:fields>
59       <sqlt:field>
60         <sqlt:name>id</sqlt:name>
61         <sqlt:data_type>integer</sqlt:data_type>
62         <sqlt:size>10</sqlt:size>
63         <sqlt:is_nullable>0</sqlt:is_nullable>
64         <sqlt:is_auto_increment>1</sqlt:is_auto_increment>
65         <sqlt:is_primary_key>1</sqlt:is_primary_key>
66         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
67         <sqlt:comments>comment on id field</sqlt:comments>
68         <sqlt:order>1</sqlt:order>
69       </sqlt:field>
70       <sqlt:field>
71         <sqlt:name>title</sqlt:name>
72         <sqlt:data_type>varchar</sqlt:data_type>
73         <sqlt:size>100</sqlt:size>
74         <sqlt:is_nullable>0</sqlt:is_nullable>
75         <sqlt:default_value>hello</sqlt:default_value>
76         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
77         <sqlt:is_primary_key>0</sqlt:is_primary_key>
78         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
79         <sqlt:comments></sqlt:comments>
80         <sqlt:order>2</sqlt:order>
81       </sqlt:field>
82       <sqlt:field>
83         <sqlt:name>description</sqlt:name>
84         <sqlt:data_type>text</sqlt:data_type>
85         <sqlt:size>65535</sqlt:size>
86         <sqlt:is_nullable>1</sqlt:is_nullable>
87         <sqlt:default_value></sqlt:default_value>
88         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
89         <sqlt:is_primary_key>0</sqlt:is_primary_key>
90         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
91         <sqlt:comments></sqlt:comments>
92         <sqlt:order>3</sqlt:order>
93       </sqlt:field>
94       <sqlt:field>
95         <sqlt:name>email</sqlt:name>
96         <sqlt:data_type>varchar</sqlt:data_type>
97         <sqlt:size>255</sqlt:size>
98         <sqlt:is_nullable>1</sqlt:is_nullable>
99         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
100         <sqlt:is_primary_key>0</sqlt:is_primary_key>
101         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
102         <sqlt:comments></sqlt:comments>
103         <sqlt:order>4</sqlt:order>
104       </sqlt:field>
105     </sqlt:fields>
106     <sqlt:indices>
107       <sqlt:index>
108         <sqlt:name>titleindex</sqlt:name>
109         <sqlt:type>NORMAL</sqlt:type>
110         <sqlt:fields>title</sqlt:fields>
111         <sqlt:options></sqlt:options>
112       </sqlt:index>
113     </sqlt:indices>
114     <sqlt:constraints>
115       <sqlt:constraint>
116         <sqlt:name></sqlt:name>
117         <sqlt:type>PRIMARY KEY</sqlt:type>
118         <sqlt:fields>id</sqlt:fields>
119         <sqlt:reference_table></sqlt:reference_table>
120         <sqlt:reference_fields></sqlt:reference_fields>
121         <sqlt:on_delete></sqlt:on_delete>
122         <sqlt:on_update></sqlt:on_update>
123         <sqlt:match_type></sqlt:match_type>
124         <sqlt:expression></sqlt:expression>
125         <sqlt:options></sqlt:options>
126         <sqlt:deferrable>1</sqlt:deferrable>
127       </sqlt:constraint>
128       <sqlt:constraint>
129         <sqlt:name></sqlt:name>
130         <sqlt:type>UNIQUE</sqlt:type>
131         <sqlt:fields>email</sqlt:fields>
132         <sqlt:reference_table></sqlt:reference_table>
133         <sqlt:reference_fields></sqlt:reference_fields>
134         <sqlt:on_delete></sqlt:on_delete>
135         <sqlt:on_update></sqlt:on_update>
136         <sqlt:match_type></sqlt:match_type>
137         <sqlt:expression></sqlt:expression>
138         <sqlt:options></sqlt:options>
139         <sqlt:deferrable>1</sqlt:deferrable>
140       </sqlt:constraint>
141     </sqlt:constraints>
142   </sqlt:table>
143 </sqlt:schema>
144 EOXML
145
146 $obj = SQL::Translator->new(
147     debug          => DEBUG,
148     trace          => TRACE,
149     show_warnings  => 1,
150     add_drop_table => 1,
151     from           => 'MySQL',
152     to             => 'XML-SQLFairy',
153 );
154 lives_ok {$xml = $obj->translate($file);} "Translate (emit_empty_tags=>0) ran";
155 ok("$xml" ne ""                             ,"Produced something!");
156 print "XML:\n$xml" if DEBUG;
157 # Strip sqlf header with its variable date so we diff safely
158 $xml =~ s/^([^\n]*\n){7}//m; 
159 eq_or_diff $xml, $ans                       ,"XML looks right";
160
161 } # end emit_empty_tags=>0
162
163 #
164 # emit_empty_tags => 1
165 #
166 {
167 my ($obj,$ans,$xml);
168
169 $ans = <<EOXML;
170 <sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
171   <sqlt:name></sqlt:name>
172   <sqlt:database></sqlt:database>
173   <sqlt:table>
174     <sqlt:name>Basic</sqlt:name>
175     <sqlt:order>2</sqlt:order>
176     <sqlt:fields>
177       <sqlt:field>
178         <sqlt:name>id</sqlt:name>
179         <sqlt:data_type>integer</sqlt:data_type>
180         <sqlt:size>10</sqlt:size>
181         <sqlt:is_nullable>0</sqlt:is_nullable>
182         <sqlt:default_value></sqlt:default_value>
183         <sqlt:is_auto_increment>1</sqlt:is_auto_increment>
184         <sqlt:is_primary_key>1</sqlt:is_primary_key>
185         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
186         <sqlt:comments>comment on id field</sqlt:comments>
187         <sqlt:order>5</sqlt:order>
188       </sqlt:field>
189       <sqlt:field>
190         <sqlt:name>title</sqlt:name>
191         <sqlt:data_type>varchar</sqlt:data_type>
192         <sqlt:size>100</sqlt:size>
193         <sqlt:is_nullable>0</sqlt:is_nullable>
194         <sqlt:default_value>hello</sqlt:default_value>
195         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
196         <sqlt:is_primary_key>0</sqlt:is_primary_key>
197         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
198         <sqlt:comments></sqlt:comments>
199         <sqlt:order>6</sqlt:order>
200       </sqlt:field>
201       <sqlt:field>
202         <sqlt:name>description</sqlt:name>
203         <sqlt:data_type>text</sqlt:data_type>
204         <sqlt:size>65535</sqlt:size>
205         <sqlt:is_nullable>1</sqlt:is_nullable>
206         <sqlt:default_value></sqlt:default_value>
207         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
208         <sqlt:is_primary_key>0</sqlt:is_primary_key>
209         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
210         <sqlt:comments></sqlt:comments>
211         <sqlt:order>7</sqlt:order>
212       </sqlt:field>
213       <sqlt:field>
214         <sqlt:name>email</sqlt:name>
215         <sqlt:data_type>varchar</sqlt:data_type>
216         <sqlt:size>255</sqlt:size>
217         <sqlt:is_nullable>1</sqlt:is_nullable>
218         <sqlt:default_value></sqlt:default_value>
219         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
220         <sqlt:is_primary_key>0</sqlt:is_primary_key>
221         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
222         <sqlt:comments></sqlt:comments>
223         <sqlt:order>8</sqlt:order>
224       </sqlt:field>
225     </sqlt:fields>
226     <sqlt:indices>
227       <sqlt:index>
228         <sqlt:name>titleindex</sqlt:name>
229         <sqlt:type>NORMAL</sqlt:type>
230         <sqlt:fields>title</sqlt:fields>
231         <sqlt:options></sqlt:options>
232       </sqlt:index>
233     </sqlt:indices>
234     <sqlt:constraints>
235       <sqlt:constraint>
236         <sqlt:name></sqlt:name>
237         <sqlt:type>PRIMARY KEY</sqlt:type>
238         <sqlt:fields>id</sqlt:fields>
239         <sqlt:reference_table></sqlt:reference_table>
240         <sqlt:reference_fields></sqlt:reference_fields>
241         <sqlt:on_delete></sqlt:on_delete>
242         <sqlt:on_update></sqlt:on_update>
243         <sqlt:match_type></sqlt:match_type>
244         <sqlt:expression></sqlt:expression>
245         <sqlt:options></sqlt:options>
246         <sqlt:deferrable>1</sqlt:deferrable>
247       </sqlt:constraint>
248       <sqlt:constraint>
249         <sqlt:name></sqlt:name>
250         <sqlt:type>UNIQUE</sqlt:type>
251         <sqlt:fields>email</sqlt:fields>
252         <sqlt:reference_table></sqlt:reference_table>
253         <sqlt:reference_fields></sqlt:reference_fields>
254         <sqlt:on_delete></sqlt:on_delete>
255         <sqlt:on_update></sqlt:on_update>
256         <sqlt:match_type></sqlt:match_type>
257         <sqlt:expression></sqlt:expression>
258         <sqlt:options></sqlt:options>
259         <sqlt:deferrable>1</sqlt:deferrable>
260       </sqlt:constraint>
261     </sqlt:constraints>
262   </sqlt:table>
263 </sqlt:schema>
264 EOXML
265
266 $obj = SQL::Translator->new(
267     debug          => DEBUG,
268     trace          => TRACE,
269     show_warnings  => 1,
270     add_drop_table => 1,
271     from           => 'MySQL',
272     to             => 'XML-SQLFairy',
273     producer_args  => { emit_empty_tags => 1 },
274 );
275 lives_ok { $xml=$obj->translate($file); } "Translate (emit_empty_tags=>1) ran";
276 ok("$xml" ne ""                             ,"Produced something!");
277 print "XML emit_empty_tags=>1:\n$xml" if DEBUG;
278 # Strip sqlf header with its variable date so we diff safely
279 $xml =~ s/^([^\n]*\n){7}//m; 
280 eq_or_diff $xml, $ans                       ,"XML looks right";
281
282 } # end emit_empty_tags => 1
283
284 #
285 # attrib_values => 1
286 #
287 {
288 my ($obj,$ans,$xml);
289
290 $ans = <<EOXML;
291 <sqlt:schema name="" database="" xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
292   <sqlt:table name="Basic" order="3">
293     <sqlt:fields>
294       <sqlt:field name="id" data_type="integer" size="10" is_nullable="0" is_auto_increment="1" is_primary_key="1" is_foreign_key="0" comments="comment on id field" order="9" />
295       <sqlt: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" comments="" order="10" />
296       <sqlt: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" comments="" order="11" />
297       <sqlt:field name="email" data_type="varchar" size="255" is_nullable="1" is_auto_increment="0" is_primary_key="0" is_foreign_key="0" comments="" order="12" />
298     </sqlt:fields>
299     <sqlt:indices>
300       <sqlt:index name="titleindex" type="NORMAL" fields="title" options="" />
301     </sqlt:indices>
302     <sqlt:constraints>
303       <sqlt:constraint name="" type="PRIMARY KEY" fields="id" reference_table="" reference_fields="" on_delete="" on_update="" match_type="" expression="" options="" deferrable="1" />
304       <sqlt:constraint name="" type="UNIQUE" fields="email" reference_table="" reference_fields="" on_delete="" on_update="" match_type="" expression="" options="" deferrable="1" />
305     </sqlt:constraints>
306   </sqlt:table>
307 </sqlt:schema>
308 EOXML
309
310 $obj = SQL::Translator->new(
311     debug          => DEBUG,
312     trace          => TRACE,
313     show_warnings  => 1,
314     add_drop_table => 1,
315     from           => "MySQL",
316     to             => "XML-SQLFairy",
317     producer_args  => { attrib_values => 1 },
318 );
319 lives_ok {$xml = $obj->translate($file);} "Translate (attrib_values=>1) ran";
320 ok("$xml" ne ""                             ,"Produced something!");
321 print "XML attrib_values=>1:\n$xml" if DEBUG;
322 # Strip sqlf header with its variable date so we diff safely
323 $xml =~ s/^([^\n]*\n){7}//m; 
324 eq_or_diff $xml, $ans                       ,"XML looks right";
325
326 } # end attrib_values => 1
327
328 #
329 # View
330 #
331 # Thanks to Ken for the schema setup lifted from 13schema.t
332 {
333 my ($obj,$ans,$xml);
334
335 $ans = <<EOXML;
336 <sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
337   <sqlt:name></sqlt:name>
338   <sqlt:database></sqlt:database>
339   <sqlt:view>
340     <sqlt:name>foo_view</sqlt:name>
341     <sqlt:sql>select name, age from person</sqlt:sql>
342     <sqlt:fields>name,age</sqlt:fields>
343     <sqlt:order>1</sqlt:order>
344   </sqlt:view>
345 </sqlt:schema>
346 EOXML
347
348     $obj = SQL::Translator->new(
349         debug          => DEBUG,
350         trace          => TRACE,
351         show_warnings  => 1,
352         add_drop_table => 1,
353         from           => "MySQL",
354         to             => "XML-SQLFairy",
355     );
356     my $s      = $obj->schema;
357     my $name   = 'foo_view';
358     my $sql    = 'select name, age from person';
359     my $fields = 'name, age';
360     my $v      = $s->add_view(
361         name   => $name,
362         sql    => $sql,
363         fields => $fields,
364         schema => $s,
365     ) or die $s->error;
366     
367     # As we have created a Schema we give translate a dummy string so that
368     # it will run the produce.
369     lives_ok {$xml =$obj->translate("FOO");} "Translate (View) ran";
370     ok("$xml" ne ""                             ,"Produced something!");
371     print "XML attrib_values=>1:\n$xml" if DEBUG;
372     # Strip sqlf header with its variable date so we diff safely
373     $xml =~ s/^([^\n]*\n){7}//m; 
374     eq_or_diff $xml, $ans                       ,"XML looks right";
375 } # end View
376
377 #
378 # Trigger
379 #
380 # Thanks to Ken for the schema setup lifted from 13schema.t
381 {
382 my ($obj,$ans,$xml);
383
384 $ans = <<EOXML;
385 <sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
386   <sqlt:name></sqlt:name>
387   <sqlt:database></sqlt:database>
388   <sqlt:trigger>
389     <sqlt:name>foo_trigger</sqlt:name>
390     <sqlt:database_event>insert</sqlt:database_event>
391     <sqlt:action>update modified=timestamp();</sqlt:action>
392     <sqlt:on_table>foo</sqlt:on_table>
393     <sqlt:perform_action_when>after</sqlt:perform_action_when>
394     <sqlt:order>1</sqlt:order>
395   </sqlt:trigger>
396 </sqlt:schema>
397 EOXML
398
399     $obj = SQL::Translator->new(
400         debug          => DEBUG,
401         trace          => TRACE,
402         show_warnings  => 1,
403         add_drop_table => 1,
404         from           => "MySQL",
405         to             => "XML-SQLFairy",
406     );
407     my $s                   = $obj->schema;
408     my $name                = 'foo_trigger';
409     my $perform_action_when = 'after';
410     my $database_event      = 'insert';
411     my $on_table            = 'foo';
412     my $action              = 'update modified=timestamp();';
413     my $t                   = $s->add_trigger(
414         name                => $name,
415         perform_action_when => $perform_action_when,
416         database_event      => $database_event,
417         on_table            => $on_table,
418         action              => $action,
419     ) or die $s->error;
420     
421     # As we have created a Schema we give translate a dummy string so that
422     # it will run the produce.
423     lives_ok {$xml =$obj->translate("FOO");} "Translate (Trigger) ran";
424     ok("$xml" ne ""                             ,"Produced something!");
425     print "XML attrib_values=>1:\n$xml" if DEBUG;
426     # Strip sqlf header with its variable date so we diff safely
427     $xml =~ s/^([^\n]*\n){7}//m; 
428     eq_or_diff $xml, $ans                       ,"XML looks right";
429 } # end Trigger
430
431 #
432 # Procedure
433 #
434 # Thanks to Ken for the schema setup lifted from 13schema.t
435 {
436 my ($obj,$ans,$xml);
437
438 $ans = <<EOXML;
439 <sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
440   <sqlt:name></sqlt:name>
441   <sqlt:database></sqlt:database>
442   <sqlt:procedure>
443     <sqlt:name>foo_proc</sqlt:name>
444     <sqlt:sql>select foo from bar</sqlt:sql>
445     <sqlt:parameters>foo,bar</sqlt:parameters>
446     <sqlt:owner>Nomar</sqlt:owner>
447     <sqlt:comments>Go Sox!</sqlt:comments>
448     <sqlt:order>1</sqlt:order>
449   </sqlt:procedure>
450 </sqlt:schema>
451 EOXML
452
453     $obj = SQL::Translator->new(
454         debug          => DEBUG,
455         trace          => TRACE,
456         show_warnings  => 1,
457         add_drop_table => 1,
458         from           => "MySQL",
459         to             => "XML-SQLFairy",
460     );
461     my $s          = $obj->schema;
462     my $name       = 'foo_proc';
463     my $sql        = 'select foo from bar';
464     my $parameters = 'foo, bar';
465     my $owner      = 'Nomar';
466     my $comments   = 'Go Sox!';
467     my $p          = $s->add_procedure(
468         name       => $name,
469         sql        => $sql,
470         parameters => $parameters,
471         owner      => $owner,
472         comments   => $comments,
473     ) or die $s->error;
474
475     # As we have created a Schema we give translate a dummy string so that
476     # it will run the produce.
477     lives_ok {$xml =$obj->translate("FOO");} "Translate (Procedure) ran";
478     ok("$xml" ne ""                             ,"Produced something!");
479     print "XML attrib_values=>1:\n$xml" if DEBUG;
480     # Strip sqlf header with its variable date so we diff safely
481     $xml =~ s/^([^\n]*\n){7}//m; 
482     eq_or_diff $xml, $ans                       ,"XML looks right";
483 } # end Procedure