Added list of constants exported to the docs.
[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
23
24# Testing 1,2,3,4...
25#=============================================================================
26
27eval { require XML::Writer; };
28if ($@ && $@ =~ m!locate XML::Writer.pm in!) {
ac62dff1 29 plan skip_all => "You need XML::Writer to use XML::SQLFairy.";
d0c12b9f 30}
31eval { require Test::Differences; };
32if ($@ && $@ =~ m!locate Test/Differences.pm in!) {
33 plan skip_all => "You need Test::Differences for this test.";
34}
35use Test::Differences;
1e3867bf 36plan tests => 18;
d0c12b9f 37
38use SQL::Translator;
ac62dff1 39use SQL::Translator::Producer::XML::SQLFairy;
d0c12b9f 40
d0c12b9f 41
42#
43# emit_empty_tags => 0
44#
1e3867bf 45{
46my ($obj,$ans,$xml);
d0c12b9f 47
48$ans = <<EOXML;
49<sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
1caf2bb2 50 <sqlt:database></sqlt:database>
3b80481c 51 <sqlt:name></sqlt:name>
d0c12b9f 52 <sqlt:table>
53 <sqlt:name>Basic</sqlt:name>
54 <sqlt:order>1</sqlt:order>
55 <sqlt:fields>
56 <sqlt:field>
3b80481c 57 <sqlt:comments>comment on id field</sqlt:comments>
d0c12b9f 58 <sqlt:data_type>integer</sqlt:data_type>
59 <sqlt:is_auto_increment>1</sqlt:is_auto_increment>
d0c12b9f 60 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
3b80481c 61 <sqlt:is_nullable>0</sqlt:is_nullable>
62 <sqlt:is_primary_key>1</sqlt:is_primary_key>
63 <sqlt:name>id</sqlt:name>
d0c12b9f 64 <sqlt:order>1</sqlt:order>
65 <sqlt:size>10</sqlt:size>
66 </sqlt:field>
67 <sqlt:field>
3b80481c 68 <sqlt:comments></sqlt:comments>
d0c12b9f 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>
d0c12b9f 72 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
3b80481c 73 <sqlt:is_nullable>0</sqlt:is_nullable>
74 <sqlt:is_primary_key>0</sqlt:is_primary_key>
75 <sqlt:name>title</sqlt:name>
d0c12b9f 76 <sqlt:order>2</sqlt:order>
77 <sqlt:size>100</sqlt:size>
78 </sqlt:field>
79 <sqlt:field>
3b80481c 80 <sqlt:comments></sqlt:comments>
d0c12b9f 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>
d0c12b9f 84 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
3b80481c 85 <sqlt:is_nullable>1</sqlt:is_nullable>
86 <sqlt:is_primary_key>0</sqlt:is_primary_key>
87 <sqlt:name>description</sqlt:name>
d0c12b9f 88 <sqlt:order>3</sqlt:order>
ac62dff1 89 <sqlt:size>65535</sqlt:size>
d0c12b9f 90 </sqlt:field>
91 <sqlt:field>
3b80481c 92 <sqlt:comments></sqlt:comments>
d0c12b9f 93 <sqlt:data_type>varchar</sqlt:data_type>
94 <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
d0c12b9f 95 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
3b80481c 96 <sqlt:is_nullable>1</sqlt:is_nullable>
97 <sqlt:is_primary_key>0</sqlt:is_primary_key>
98 <sqlt:name>email</sqlt:name>
d0c12b9f 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>
d0c12b9f 118 <sqlt:on_delete></sqlt:on_delete>
119 <sqlt:on_update></sqlt:on_update>
3b80481c 120 <sqlt:options></sqlt:options>
d0c12b9f 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>
d0c12b9f 130 <sqlt:on_delete></sqlt:on_delete>
131 <sqlt:on_update></sqlt:on_update>
3b80481c 132 <sqlt:options></sqlt:options>
d0c12b9f 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>
139EOXML
140
141$obj = SQL::Translator->new(
142 debug => DEBUG,
143 trace => TRACE,
144 show_warnings => 1,
145 add_drop_table => 1,
ac62dff1 146 from => 'MySQL',
147 to => 'XML-SQLFairy',
d0c12b9f 148);
f11724ad 149lives_ok {$xml = $obj->translate($file);} "Translate (emit_empty_tags=>0) ran";
d0c12b9f 150ok("$xml" ne "" ,"Produced something!");
151print "XML:\n$xml" if DEBUG;
152# Strip sqlf header with its variable date so we diff safely
153$xml =~ s/^([^\n]*\n){7}//m;
154eq_or_diff $xml, $ans ,"XML looks right";
155
1e3867bf 156} # end emit_empty_tags=>0
157
d0c12b9f 158#
159# emit_empty_tags => 1
160#
1e3867bf 161{
162my ($obj,$ans,$xml);
d0c12b9f 163
164$ans = <<EOXML;
165<sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
1caf2bb2 166 <sqlt:database></sqlt:database>
3b80481c 167 <sqlt:name></sqlt:name>
d0c12b9f 168 <sqlt:table>
169 <sqlt:name>Basic</sqlt:name>
170 <sqlt:order>2</sqlt:order>
171 <sqlt:fields>
172 <sqlt:field>
3b80481c 173 <sqlt:comments>comment on id field</sqlt:comments>
d0c12b9f 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>
d0c12b9f 177 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
3b80481c 178 <sqlt:is_nullable>0</sqlt:is_nullable>
179 <sqlt:is_primary_key>1</sqlt:is_primary_key>
180 <sqlt:name>id</sqlt:name>
d0c12b9f 181 <sqlt:order>5</sqlt:order>
182 <sqlt:size>10</sqlt:size>
183 </sqlt:field>
184 <sqlt:field>
3b80481c 185 <sqlt:comments></sqlt:comments>
d0c12b9f 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>
d0c12b9f 189 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
3b80481c 190 <sqlt:is_nullable>0</sqlt:is_nullable>
191 <sqlt:is_primary_key>0</sqlt:is_primary_key>
192 <sqlt:name>title</sqlt:name>
d0c12b9f 193 <sqlt:order>6</sqlt:order>
194 <sqlt:size>100</sqlt:size>
195 </sqlt:field>
196 <sqlt:field>
3b80481c 197 <sqlt:comments></sqlt:comments>
d0c12b9f 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>
d0c12b9f 201 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
3b80481c 202 <sqlt:is_nullable>1</sqlt:is_nullable>
203 <sqlt:is_primary_key>0</sqlt:is_primary_key>
204 <sqlt:name>description</sqlt:name>
d0c12b9f 205 <sqlt:order>7</sqlt:order>
ac62dff1 206 <sqlt:size>65535</sqlt:size>
d0c12b9f 207 </sqlt:field>
208 <sqlt:field>
3b80481c 209 <sqlt:comments></sqlt:comments>
d0c12b9f 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>
d0c12b9f 213 <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
3b80481c 214 <sqlt:is_nullable>1</sqlt:is_nullable>
215 <sqlt:is_primary_key>0</sqlt:is_primary_key>
216 <sqlt:name>email</sqlt:name>
d0c12b9f 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>
d0c12b9f 236 <sqlt:on_delete></sqlt:on_delete>
237 <sqlt:on_update></sqlt:on_update>
3b80481c 238 <sqlt:options></sqlt:options>
d0c12b9f 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>
d0c12b9f 249 <sqlt:on_delete></sqlt:on_delete>
250 <sqlt:on_update></sqlt:on_update>
3b80481c 251 <sqlt:options></sqlt:options>
d0c12b9f 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>
259EOXML
260
d0c12b9f 261$obj = SQL::Translator->new(
262 debug => DEBUG,
263 trace => TRACE,
264 show_warnings => 1,
265 add_drop_table => 1,
ac62dff1 266 from => 'MySQL',
267 to => 'XML-SQLFairy',
d0c12b9f 268 producer_args => { emit_empty_tags => 1 },
269);
f11724ad 270lives_ok { $xml=$obj->translate($file); } "Translate (emit_empty_tags=>1) ran";
d0c12b9f 271ok("$xml" ne "" ,"Produced something!");
272print "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;
275eq_or_diff $xml, $ans ,"XML looks right";
d0c12b9f 276
1e3867bf 277} # end emit_empty_tags => 1
f11724ad 278
279#
280# attrib_values => 1
281#
1e3867bf 282{
283my ($obj,$ans,$xml);
f11724ad 284
285$ans = <<EOXML;
286<sqlt:schema database="" name="" xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
446dfcbd 287 <sqlt:table name="Basic" order="3">
f11724ad 288 <sqlt:fields>
446dfcbd 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" />
f11724ad 293 </sqlt:fields>
294 <sqlt:indices>
446dfcbd 295 <sqlt:index fields="title" name="titleindex" options="" type="NORMAL" />
f11724ad 296 </sqlt:indices>
297 <sqlt:constraints>
446dfcbd 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" />
f11724ad 300 </sqlt:constraints>
301 </sqlt:table>
302</sqlt:schema>
303EOXML
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);
314lives_ok {$xml = $obj->translate($file);} "Translate (attrib_values=>1) ran";
315ok("$xml" ne "" ,"Produced something!");
316print "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;
319eq_or_diff $xml, $ans ,"XML looks right";
320
1e3867bf 321} # end attrib_values => 1
322
323#
324# View
325#
326# Thanks to Ken for the schema setup lifted from 13schema.t
327{
328my ($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>
341EOXML
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{
377my ($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>
392EOXML
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{
431my ($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>
446EOXML
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