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