Uses Test::SQL::Translator.pm
[dbsrgits/SQL-Translator.git] / t / 17sqlfxml-producer.t
CommitLineData
d0c12b9f 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
1ea530d4 7local $^W = 0;
8
d0c12b9f 9use strict;
10use Test::More;
11use Test::Exception;
12
13use Data::Dumper;
2e11379e 14my %opt;
d0c12b9f 15BEGIN { map { $opt{$_}=1 if s/^-// } @ARGV; }
16use constant DEBUG => (exists $opt{d} ? 1 : 0);
17use constant TRACE => (exists $opt{t} ? 1 : 0);
18
19use FindBin qw/$Bin/;
20
21my $file = "$Bin/data/mysql/sqlfxml-producer-basic.sql";
22
fbc0552f 23local $SIG{__WARN__} = sub {
24 CORE::warn(@_)
25 unless $_[0] =~ m#XML/Writer#;
26};
d0c12b9f 27
28# Testing 1,2,3,4...
29#=============================================================================
30
31eval { require XML::Writer; };
32if ($@ && $@ =~ m!locate XML::Writer.pm in!) {
ac62dff1 33 plan skip_all => "You need XML::Writer to use XML::SQLFairy.";
d0c12b9f 34}
35eval { require Test::Differences; };
36if ($@ && $@ =~ m!locate Test/Differences.pm in!) {
37 plan skip_all => "You need Test::Differences for this test.";
38}
39use Test::Differences;
1e3867bf 40plan tests => 18;
d3422086 41
d0c12b9f 42use SQL::Translator;
ac62dff1 43use SQL::Translator::Producer::XML::SQLFairy;
d0c12b9f 44
d0c12b9f 45#
46# emit_empty_tags => 0
47#
1e3867bf 48{
49my ($obj,$ans,$xml);
d0c12b9f 50
51$ans = <<EOXML;
52<sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
3b80481c 53 <sqlt:name></sqlt:name>
d3422086 54 <sqlt:database></sqlt:database>
d0c12b9f 55 <sqlt:table>
56 <sqlt:name>Basic</sqlt:name>
57 <sqlt:order>1</sqlt:order>
58 <sqlt:fields>
59 <sqlt:field>
d3422086 60 <sqlt:name>id</sqlt:name>
d0c12b9f 61 <sqlt:data_type>integer</sqlt:data_type>
d3422086 62 <sqlt:size>10</sqlt:size>
3b80481c 63 <sqlt:is_nullable>0</sqlt:is_nullable>
d3422086 64 <sqlt:is_auto_increment>1</sqlt:is_auto_increment>
3b80481c 65 <sqlt:is_primary_key>1</sqlt:is_primary_key>
d3422086 66 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
67 <sqlt:comments>comment on id field</sqlt:comments>
d0c12b9f 68 <sqlt:order>1</sqlt:order>
d0c12b9f 69 </sqlt:field>
70 <sqlt:field>
d3422086 71 <sqlt:name>title</sqlt:name>
d0c12b9f 72 <sqlt:data_type>varchar</sqlt:data_type>
d3422086 73 <sqlt:size>100</sqlt:size>
74 <sqlt:is_nullable>0</sqlt:is_nullable>
d0c12b9f 75 <sqlt:default_value>hello</sqlt:default_value>
76 <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
3b80481c 77 <sqlt:is_primary_key>0</sqlt:is_primary_key>
d3422086 78 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
79 <sqlt:comments></sqlt:comments>
d0c12b9f 80 <sqlt:order>2</sqlt:order>
d0c12b9f 81 </sqlt:field>
82 <sqlt:field>
d3422086 83 <sqlt:name>description</sqlt:name>
d0c12b9f 84 <sqlt:data_type>text</sqlt:data_type>
d3422086 85 <sqlt:size>65535</sqlt:size>
86 <sqlt:is_nullable>1</sqlt:is_nullable>
d0c12b9f 87 <sqlt:default_value></sqlt:default_value>
88 <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
3b80481c 89 <sqlt:is_primary_key>0</sqlt:is_primary_key>
d3422086 90 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
91 <sqlt:comments></sqlt:comments>
d0c12b9f 92 <sqlt:order>3</sqlt:order>
d0c12b9f 93 </sqlt:field>
94 <sqlt:field>
d3422086 95 <sqlt:name>email</sqlt:name>
d0c12b9f 96 <sqlt:data_type>varchar</sqlt:data_type>
d3422086 97 <sqlt:size>255</sqlt:size>
3b80481c 98 <sqlt:is_nullable>1</sqlt:is_nullable>
d3422086 99 <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
3b80481c 100 <sqlt:is_primary_key>0</sqlt:is_primary_key>
d3422086 101 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
102 <sqlt:comments></sqlt:comments>
d0c12b9f 103 <sqlt:order>4</sqlt:order>
d0c12b9f 104 </sqlt:field>
105 </sqlt:fields>
106 <sqlt:indices>
107 <sqlt:index>
d0c12b9f 108 <sqlt:name>titleindex</sqlt:name>
d0c12b9f 109 <sqlt:type>NORMAL</sqlt:type>
d3422086 110 <sqlt:fields>title</sqlt:fields>
111 <sqlt:options></sqlt:options>
d0c12b9f 112 </sqlt:index>
113 </sqlt:indices>
114 <sqlt:constraints>
115 <sqlt:constraint>
d0c12b9f 116 <sqlt:name></sqlt:name>
d3422086 117 <sqlt:type>PRIMARY KEY</sqlt:type>
118 <sqlt:fields>id</sqlt:fields>
119 <sqlt:reference_table></sqlt:reference_table>
e6c155dd 120 <sqlt:reference_fields></sqlt:reference_fields>
d0c12b9f 121 <sqlt:on_delete></sqlt:on_delete>
122 <sqlt:on_update></sqlt:on_update>
d3422086 123 <sqlt:match_type></sqlt:match_type>
124 <sqlt:expression></sqlt:expression>
3b80481c 125 <sqlt:options></sqlt:options>
d3422086 126 <sqlt:deferrable>1</sqlt:deferrable>
d0c12b9f 127 </sqlt:constraint>
128 <sqlt:constraint>
d0c12b9f 129 <sqlt:name></sqlt:name>
d3422086 130 <sqlt:type>UNIQUE</sqlt:type>
131 <sqlt:fields>email</sqlt:fields>
132 <sqlt:reference_table></sqlt:reference_table>
e6c155dd 133 <sqlt:reference_fields></sqlt:reference_fields>
d0c12b9f 134 <sqlt:on_delete></sqlt:on_delete>
135 <sqlt:on_update></sqlt:on_update>
d3422086 136 <sqlt:match_type></sqlt:match_type>
137 <sqlt:expression></sqlt:expression>
3b80481c 138 <sqlt:options></sqlt:options>
d3422086 139 <sqlt:deferrable>1</sqlt:deferrable>
d0c12b9f 140 </sqlt:constraint>
141 </sqlt:constraints>
142 </sqlt:table>
143</sqlt:schema>
144EOXML
145
146$obj = SQL::Translator->new(
147 debug => DEBUG,
148 trace => TRACE,
149 show_warnings => 1,
150 add_drop_table => 1,
ac62dff1 151 from => 'MySQL',
152 to => 'XML-SQLFairy',
d0c12b9f 153);
f11724ad 154lives_ok {$xml = $obj->translate($file);} "Translate (emit_empty_tags=>0) ran";
d0c12b9f 155ok("$xml" ne "" ,"Produced something!");
156print "XML:\n$xml" if DEBUG;
157# Strip sqlf header with its variable date so we diff safely
158$xml =~ s/^([^\n]*\n){7}//m;
159eq_or_diff $xml, $ans ,"XML looks right";
160
1e3867bf 161} # end emit_empty_tags=>0
162
d0c12b9f 163#
164# emit_empty_tags => 1
165#
1e3867bf 166{
167my ($obj,$ans,$xml);
d0c12b9f 168
169$ans = <<EOXML;
170<sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
3b80481c 171 <sqlt:name></sqlt:name>
d3422086 172 <sqlt:database></sqlt:database>
d0c12b9f 173 <sqlt:table>
174 <sqlt:name>Basic</sqlt:name>
175 <sqlt:order>2</sqlt:order>
176 <sqlt:fields>
177 <sqlt:field>
d3422086 178 <sqlt:name>id</sqlt:name>
d0c12b9f 179 <sqlt:data_type>integer</sqlt:data_type>
d3422086 180 <sqlt:size>10</sqlt:size>
181 <sqlt:is_nullable>0</sqlt:is_nullable>
d0c12b9f 182 <sqlt:default_value></sqlt:default_value>
183 <sqlt:is_auto_increment>1</sqlt:is_auto_increment>
3b80481c 184 <sqlt:is_primary_key>1</sqlt:is_primary_key>
d3422086 185 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
186 <sqlt:comments>comment on id field</sqlt:comments>
d0c12b9f 187 <sqlt:order>5</sqlt:order>
d0c12b9f 188 </sqlt:field>
189 <sqlt:field>
d3422086 190 <sqlt:name>title</sqlt:name>
d0c12b9f 191 <sqlt:data_type>varchar</sqlt:data_type>
d3422086 192 <sqlt:size>100</sqlt:size>
193 <sqlt:is_nullable>0</sqlt:is_nullable>
d0c12b9f 194 <sqlt:default_value>hello</sqlt:default_value>
195 <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
3b80481c 196 <sqlt:is_primary_key>0</sqlt:is_primary_key>
d3422086 197 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
198 <sqlt:comments></sqlt:comments>
d0c12b9f 199 <sqlt:order>6</sqlt:order>
d0c12b9f 200 </sqlt:field>
201 <sqlt:field>
d3422086 202 <sqlt:name>description</sqlt:name>
d0c12b9f 203 <sqlt:data_type>text</sqlt:data_type>
d3422086 204 <sqlt:size>65535</sqlt:size>
205 <sqlt:is_nullable>1</sqlt:is_nullable>
d0c12b9f 206 <sqlt:default_value></sqlt:default_value>
207 <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
3b80481c 208 <sqlt:is_primary_key>0</sqlt:is_primary_key>
d3422086 209 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
210 <sqlt:comments></sqlt:comments>
d0c12b9f 211 <sqlt:order>7</sqlt:order>
d0c12b9f 212 </sqlt:field>
213 <sqlt:field>
d3422086 214 <sqlt:name>email</sqlt:name>
d0c12b9f 215 <sqlt:data_type>varchar</sqlt:data_type>
d3422086 216 <sqlt:size>255</sqlt:size>
217 <sqlt:is_nullable>1</sqlt:is_nullable>
d0c12b9f 218 <sqlt:default_value></sqlt:default_value>
219 <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
3b80481c 220 <sqlt:is_primary_key>0</sqlt:is_primary_key>
d3422086 221 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
222 <sqlt:comments></sqlt:comments>
d0c12b9f 223 <sqlt:order>8</sqlt:order>
d0c12b9f 224 </sqlt:field>
225 </sqlt:fields>
226 <sqlt:indices>
227 <sqlt:index>
d0c12b9f 228 <sqlt:name>titleindex</sqlt:name>
d0c12b9f 229 <sqlt:type>NORMAL</sqlt:type>
d3422086 230 <sqlt:fields>title</sqlt:fields>
231 <sqlt:options></sqlt:options>
d0c12b9f 232 </sqlt:index>
233 </sqlt:indices>
234 <sqlt:constraints>
235 <sqlt:constraint>
d0c12b9f 236 <sqlt:name></sqlt:name>
d3422086 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>
d0c12b9f 241 <sqlt:on_delete></sqlt:on_delete>
242 <sqlt:on_update></sqlt:on_update>
d3422086 243 <sqlt:match_type></sqlt:match_type>
244 <sqlt:expression></sqlt:expression>
3b80481c 245 <sqlt:options></sqlt:options>
d3422086 246 <sqlt:deferrable>1</sqlt:deferrable>
d0c12b9f 247 </sqlt:constraint>
248 <sqlt:constraint>
d0c12b9f 249 <sqlt:name></sqlt:name>
d3422086 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>
d0c12b9f 254 <sqlt:on_delete></sqlt:on_delete>
255 <sqlt:on_update></sqlt:on_update>
d3422086 256 <sqlt:match_type></sqlt:match_type>
257 <sqlt:expression></sqlt:expression>
3b80481c 258 <sqlt:options></sqlt:options>
d3422086 259 <sqlt:deferrable>1</sqlt:deferrable>
d0c12b9f 260 </sqlt:constraint>
261 </sqlt:constraints>
262 </sqlt:table>
263</sqlt:schema>
264EOXML
265
d0c12b9f 266$obj = SQL::Translator->new(
267 debug => DEBUG,
268 trace => TRACE,
269 show_warnings => 1,
270 add_drop_table => 1,
ac62dff1 271 from => 'MySQL',
272 to => 'XML-SQLFairy',
d0c12b9f 273 producer_args => { emit_empty_tags => 1 },
274);
f11724ad 275lives_ok { $xml=$obj->translate($file); } "Translate (emit_empty_tags=>1) ran";
d0c12b9f 276ok("$xml" ne "" ,"Produced something!");
277print "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;
280eq_or_diff $xml, $ans ,"XML looks right";
d0c12b9f 281
1e3867bf 282} # end emit_empty_tags => 1
f11724ad 283
284#
285# attrib_values => 1
286#
1e3867bf 287{
288my ($obj,$ans,$xml);
f11724ad 289
290$ans = <<EOXML;
d3422086 291<sqlt:schema name="" database="" xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
446dfcbd 292 <sqlt:table name="Basic" order="3">
f11724ad 293 <sqlt:fields>
d3422086 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" />
f11724ad 298 </sqlt:fields>
299 <sqlt:indices>
d3422086 300 <sqlt:index name="titleindex" type="NORMAL" fields="title" options="" />
f11724ad 301 </sqlt:indices>
302 <sqlt:constraints>
e6c155dd 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" />
f11724ad 305 </sqlt:constraints>
306 </sqlt:table>
307</sqlt:schema>
308EOXML
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);
319lives_ok {$xml = $obj->translate($file);} "Translate (attrib_values=>1) ran";
320ok("$xml" ne "" ,"Produced something!");
321print "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;
324eq_or_diff $xml, $ans ,"XML looks right";
325
1e3867bf 326} # end attrib_values => 1
327
328#
329# View
330#
331# Thanks to Ken for the schema setup lifted from 13schema.t
332{
333my ($obj,$ans,$xml);
334
335$ans = <<EOXML;
336<sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
1e3867bf 337 <sqlt:name></sqlt:name>
d3422086 338 <sqlt:database></sqlt:database>
1e3867bf 339 <sqlt:view>
1e3867bf 340 <sqlt:name>foo_view</sqlt:name>
1e3867bf 341 <sqlt:sql>select name, age from person</sqlt:sql>
d3422086 342 <sqlt:fields>name,age</sqlt:fields>
343 <sqlt:order>1</sqlt:order>
1e3867bf 344 </sqlt:view>
345</sqlt:schema>
346EOXML
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{
382my ($obj,$ans,$xml);
383
384$ans = <<EOXML;
385<sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
1e3867bf 386 <sqlt:name></sqlt:name>
d3422086 387 <sqlt:database></sqlt:database>
1e3867bf 388 <sqlt:trigger>
1e3867bf 389 <sqlt:name>foo_trigger</sqlt:name>
d3422086 390 <sqlt:database_event>insert</sqlt:database_event>
391 <sqlt:action>update modified=timestamp();</sqlt:action>
1e3867bf 392 <sqlt:on_table>foo</sqlt:on_table>
1e3867bf 393 <sqlt:perform_action_when>after</sqlt:perform_action_when>
d3422086 394 <sqlt:order>1</sqlt:order>
1e3867bf 395 </sqlt:trigger>
396</sqlt:schema>
397EOXML
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{
436my ($obj,$ans,$xml);
437
438$ans = <<EOXML;
439<sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
1e3867bf 440 <sqlt:name></sqlt:name>
d3422086 441 <sqlt:database></sqlt:database>
1e3867bf 442 <sqlt:procedure>
1e3867bf 443 <sqlt:name>foo_proc</sqlt:name>
1e3867bf 444 <sqlt:sql>select foo from bar</sqlt:sql>
d3422086 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>
1e3867bf 449 </sqlt:procedure>
450</sqlt:schema>
451EOXML
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;
d3422086 474
1e3867bf 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