Bring tests to passing.
[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 => 9;
37     
38 use SQL::Translator;
39 use SQL::Translator::Producer::XML::SQLFairy;
40
41 my ($obj,$ans,$xml);
42
43 #
44 # emit_empty_tags => 0
45 #
46
47 $ans = <<EOXML;
48 <sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
49   <sqlt:database></sqlt:database>
50   <sqlt:name></sqlt:name>
51   <sqlt:table>
52     <sqlt:name>Basic</sqlt:name>
53     <sqlt:order>1</sqlt:order>
54     <sqlt:fields>
55       <sqlt:field>
56         <sqlt:comments>comment on id field</sqlt:comments>
57         <sqlt:data_type>integer</sqlt:data_type>
58         <sqlt:is_auto_increment>1</sqlt:is_auto_increment>
59         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
60         <sqlt:is_nullable>0</sqlt:is_nullable>
61         <sqlt:is_primary_key>1</sqlt:is_primary_key>
62         <sqlt:name>id</sqlt:name>
63         <sqlt:order>1</sqlt:order>
64         <sqlt:size>10</sqlt:size>
65       </sqlt:field>
66       <sqlt:field>
67         <sqlt:comments></sqlt:comments>
68         <sqlt:data_type>varchar</sqlt:data_type>
69         <sqlt:default_value>hello</sqlt:default_value>
70         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
71         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
72         <sqlt:is_nullable>0</sqlt:is_nullable>
73         <sqlt:is_primary_key>0</sqlt:is_primary_key>
74         <sqlt:name>title</sqlt:name>
75         <sqlt:order>2</sqlt:order>
76         <sqlt:size>100</sqlt:size>
77       </sqlt:field>
78       <sqlt:field>
79         <sqlt:comments></sqlt:comments>
80         <sqlt:data_type>text</sqlt:data_type>
81         <sqlt:default_value></sqlt:default_value>
82         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
83         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
84         <sqlt:is_nullable>1</sqlt:is_nullable>
85         <sqlt:is_primary_key>0</sqlt:is_primary_key>
86         <sqlt:name>description</sqlt:name>
87         <sqlt:order>3</sqlt:order>
88         <sqlt:size>65535</sqlt:size>
89       </sqlt:field>
90       <sqlt:field>
91         <sqlt:comments></sqlt:comments>
92         <sqlt:data_type>varchar</sqlt:data_type>
93         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
94         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
95         <sqlt:is_nullable>1</sqlt:is_nullable>
96         <sqlt:is_primary_key>0</sqlt:is_primary_key>
97         <sqlt:name>email</sqlt:name>
98         <sqlt:order>4</sqlt:order>
99         <sqlt:size>255</sqlt:size>
100       </sqlt:field>
101     </sqlt:fields>
102     <sqlt:indices>
103       <sqlt:index>
104         <sqlt:fields>title</sqlt:fields>
105         <sqlt:name>titleindex</sqlt:name>
106         <sqlt:options></sqlt:options>
107         <sqlt:type>NORMAL</sqlt:type>
108       </sqlt:index>
109     </sqlt:indices>
110     <sqlt:constraints>
111       <sqlt:constraint>
112         <sqlt:deferrable>1</sqlt:deferrable>
113         <sqlt:expression></sqlt:expression>
114         <sqlt:fields>id</sqlt:fields>
115         <sqlt:match_type></sqlt:match_type>
116         <sqlt:name></sqlt:name>
117         <sqlt:on_delete></sqlt:on_delete>
118         <sqlt:on_update></sqlt:on_update>
119         <sqlt:options></sqlt:options>
120         <sqlt:reference_table></sqlt:reference_table>
121         <sqlt:type>PRIMARY KEY</sqlt:type>
122       </sqlt:constraint>
123       <sqlt:constraint>
124         <sqlt:deferrable>1</sqlt:deferrable>
125         <sqlt:expression></sqlt:expression>
126         <sqlt:fields>email</sqlt:fields>
127         <sqlt:match_type></sqlt:match_type>
128         <sqlt:name></sqlt:name>
129         <sqlt:on_delete></sqlt:on_delete>
130         <sqlt:on_update></sqlt:on_update>
131         <sqlt:options></sqlt:options>
132         <sqlt:reference_table></sqlt:reference_table>
133         <sqlt:type>UNIQUE</sqlt:type>
134       </sqlt:constraint>
135     </sqlt:constraints>
136   </sqlt:table>
137 </sqlt:schema>
138 EOXML
139
140 $obj = SQL::Translator->new(
141     debug          => DEBUG,
142     trace          => TRACE,
143     show_warnings  => 1,
144     add_drop_table => 1,
145     from           => 'MySQL',
146     to             => 'XML-SQLFairy',
147 );
148 lives_ok {$xml = $obj->translate($file);} "Translate (emit_empty_tags=>0) ran";
149 ok("$xml" ne ""                             ,"Produced something!");
150 print "XML:\n$xml" if DEBUG;
151 # Strip sqlf header with its variable date so we diff safely
152 $xml =~ s/^([^\n]*\n){7}//m; 
153 eq_or_diff $xml, $ans                       ,"XML looks right";
154
155 #
156 # emit_empty_tags => 1
157 #
158
159 $ans = <<EOXML;
160 <sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
161   <sqlt:database></sqlt:database>
162   <sqlt:name></sqlt:name>
163   <sqlt:table>
164     <sqlt:name>Basic</sqlt:name>
165     <sqlt:order>2</sqlt:order>
166     <sqlt:fields>
167       <sqlt:field>
168         <sqlt:comments>comment on id field</sqlt:comments>
169         <sqlt:data_type>integer</sqlt:data_type>
170         <sqlt:default_value></sqlt:default_value>
171         <sqlt:is_auto_increment>1</sqlt:is_auto_increment>
172         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
173         <sqlt:is_nullable>0</sqlt:is_nullable>
174         <sqlt:is_primary_key>1</sqlt:is_primary_key>
175         <sqlt:name>id</sqlt:name>
176         <sqlt:order>5</sqlt:order>
177         <sqlt:size>10</sqlt:size>
178       </sqlt:field>
179       <sqlt:field>
180         <sqlt:comments></sqlt:comments>
181         <sqlt:data_type>varchar</sqlt:data_type>
182         <sqlt:default_value>hello</sqlt:default_value>
183         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
184         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
185         <sqlt:is_nullable>0</sqlt:is_nullable>
186         <sqlt:is_primary_key>0</sqlt:is_primary_key>
187         <sqlt:name>title</sqlt:name>
188         <sqlt:order>6</sqlt:order>
189         <sqlt:size>100</sqlt:size>
190       </sqlt:field>
191       <sqlt:field>
192         <sqlt:comments></sqlt:comments>
193         <sqlt:data_type>text</sqlt:data_type>
194         <sqlt:default_value></sqlt:default_value>
195         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
196         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
197         <sqlt:is_nullable>1</sqlt:is_nullable>
198         <sqlt:is_primary_key>0</sqlt:is_primary_key>
199         <sqlt:name>description</sqlt:name>
200         <sqlt:order>7</sqlt:order>
201         <sqlt:size>65535</sqlt:size>
202       </sqlt:field>
203       <sqlt:field>
204         <sqlt:comments></sqlt:comments>
205         <sqlt:data_type>varchar</sqlt:data_type>
206         <sqlt:default_value></sqlt:default_value>
207         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
208         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
209         <sqlt:is_nullable>1</sqlt:is_nullable>
210         <sqlt:is_primary_key>0</sqlt:is_primary_key>
211         <sqlt:name>email</sqlt:name>
212         <sqlt:order>8</sqlt:order>
213         <sqlt:size>255</sqlt:size>
214       </sqlt:field>
215     </sqlt:fields>
216     <sqlt:indices>
217       <sqlt:index>
218         <sqlt:fields>title</sqlt:fields>
219         <sqlt:name>titleindex</sqlt:name>
220         <sqlt:options></sqlt:options>
221         <sqlt:type>NORMAL</sqlt:type>
222       </sqlt:index>
223     </sqlt:indices>
224     <sqlt:constraints>
225       <sqlt:constraint>
226         <sqlt:deferrable>1</sqlt:deferrable>
227         <sqlt:expression></sqlt:expression>
228         <sqlt:fields>id</sqlt:fields>
229         <sqlt:match_type></sqlt:match_type>
230         <sqlt:name></sqlt:name>
231         <sqlt:on_delete></sqlt:on_delete>
232         <sqlt:on_update></sqlt:on_update>
233         <sqlt:options></sqlt:options>
234         <sqlt:reference_fields></sqlt:reference_fields>
235         <sqlt:reference_table></sqlt:reference_table>
236         <sqlt:type>PRIMARY KEY</sqlt:type>
237       </sqlt:constraint>
238       <sqlt:constraint>
239         <sqlt:deferrable>1</sqlt:deferrable>
240         <sqlt:expression></sqlt:expression>
241         <sqlt:fields>email</sqlt:fields>
242         <sqlt:match_type></sqlt:match_type>
243         <sqlt:name></sqlt:name>
244         <sqlt:on_delete></sqlt:on_delete>
245         <sqlt:on_update></sqlt:on_update>
246         <sqlt:options></sqlt:options>
247         <sqlt:reference_fields></sqlt:reference_fields>
248         <sqlt:reference_table></sqlt:reference_table>
249         <sqlt:type>UNIQUE</sqlt:type>
250       </sqlt:constraint>
251     </sqlt:constraints>
252   </sqlt:table>
253 </sqlt:schema>
254 EOXML
255
256 undef $obj;
257 $obj = SQL::Translator->new(
258     debug          => DEBUG,
259     trace          => TRACE,
260     show_warnings  => 1,
261     add_drop_table => 1,
262     from           => 'MySQL',
263     to             => 'XML-SQLFairy',
264     producer_args  => { emit_empty_tags => 1 },
265 );
266 lives_ok { $xml=$obj->translate($file); } "Translate (emit_empty_tags=>1) ran";
267 ok("$xml" ne ""                             ,"Produced something!");
268 print "XML emit_empty_tags=>1:\n$xml" if DEBUG;
269 # Strip sqlf header with its variable date so we diff safely
270 $xml =~ s/^([^\n]*\n){7}//m; 
271 eq_or_diff $xml, $ans                       ,"XML looks right";
272
273
274
275 #
276 # attrib_values => 1
277 #
278
279 $ans = <<EOXML;
280 <sqlt:schema database="" name="" xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
281   <sqlt:table order="3" name="Basic">
282     <sqlt:fields>
283       <sqlt:field comments="comment on id field" is_primary_key="1" data_type="integer" name="id" is_foreign_key="0" is_auto_increment="1" is_nullable="0" order="9" size="10" />
284       <sqlt:field comments="" is_primary_key="0" data_type="varchar" name="title" is_foreign_key="0" is_nullable="0" is_auto_increment="0" order="10" size="100" default_value="hello" />
285       <sqlt:field comments="" is_primary_key="0" data_type="text" name="description" is_foreign_key="0" is_nullable="1" is_auto_increment="0" order="11" size="65535" default_value="" />
286       <sqlt:field comments="" is_primary_key="0" data_type="varchar" name="email" is_foreign_key="0" is_nullable="1" is_auto_increment="0" order="12" size="255" />
287     </sqlt:fields>
288     <sqlt:indices>
289       <sqlt:index options="" name="titleindex" fields="title" type="NORMAL" />
290     </sqlt:indices>
291     <sqlt:constraints>
292       <sqlt:constraint reference_table="" options="" deferrable="1" name="" fields="id" on_delete="" expression="" on_update="" match_type="" type="PRIMARY KEY" />
293       <sqlt:constraint reference_table="" options="" deferrable="1" name="" fields="email" on_delete="" expression="" on_update="" match_type="" type="UNIQUE" />
294     </sqlt:constraints>
295   </sqlt:table>
296 </sqlt:schema>
297 EOXML
298
299 $obj = SQL::Translator->new(
300     debug          => DEBUG,
301     trace          => TRACE,
302     show_warnings  => 1,
303     add_drop_table => 1,
304     from           => "MySQL",
305     to             => "XML-SQLFairy",
306     producer_args  => { attrib_values => 1 },
307 );
308 lives_ok {$xml = $obj->translate($file);} "Translate (attrib_values=>1) ran";
309 ok("$xml" ne ""                             ,"Produced something!");
310 print "XML attrib_values=>1:\n$xml" if DEBUG;
311 # Strip sqlf header with its variable date so we diff safely
312 $xml =~ s/^([^\n]*\n){7}//m; 
313 eq_or_diff $xml, $ans                       ,"XML looks right";
314