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