Tab/WS crusade
[dbsrgits/SQL-Translator.git] / t / 48xml-to-sqlite.t
1 #!/usr/bin/perl
2 use strict;
3
4 use FindBin qw/$Bin/;
5 use Test::More;
6 use Test::SQL::Translator;
7 use Test::Exception;
8 use Test::Differences;
9 use Data::Dumper;
10 use SQL::Translator;
11 use SQL::Translator::Schema::Constants;
12
13
14 BEGIN {
15     maybe_plan(2, 'SQL::Translator::Parser::XML::SQLFairy',
16               'SQL::Translator::Producer::SQLite');
17 }
18
19 my $xmlfile = "$Bin/data/xml/schema.xml";
20
21 my $sqlt;
22 $sqlt = SQL::Translator->new(
23     no_comments => 1,
24     show_warnings  => 0,
25     add_drop_table => 1,
26 );
27
28 die "Can't find test schema $xmlfile" unless -e $xmlfile;
29
30 my $sql = $sqlt->translate(
31     from     => 'XML-SQLFairy',
32     to       => 'SQLite',
33     filename => $xmlfile,
34 ) or die $sqlt->error;
35
36 eq_or_diff($sql, << "SQL");
37 BEGIN TRANSACTION;
38
39 DROP TABLE 'Basic';
40
41 CREATE TABLE 'Basic' (
42   'id' INTEGER PRIMARY KEY NOT NULL,
43   'title' varchar(100) NOT NULL DEFAULT 'hello',
44   'description' text DEFAULT '',
45   'email' varchar(500),
46   'explicitnulldef' varchar,
47   'explicitemptystring' varchar DEFAULT '',
48   -- Hello emptytagdef
49   'emptytagdef' varchar DEFAULT '',
50   'another_id' int(10) DEFAULT 2,
51   'timest' timestamp,
52   FOREIGN KEY('another_id') REFERENCES 'Another'()
53 );
54
55 CREATE INDEX 'titleindex' ON 'Basic' ('title');
56
57 CREATE UNIQUE INDEX 'emailuniqueindex' ON 'Basic' ('email');
58
59 CREATE UNIQUE INDEX 'very_long_index_name_on_title_field_which_should_be_truncated_for_various_rdbms' ON 'Basic' ('title');
60
61 DROP TABLE 'Another';
62
63 CREATE TABLE 'Another' (
64   'id' INTEGER PRIMARY KEY NOT NULL,
65   'num' numeric(10,2)
66 );
67
68 DROP VIEW IF EXISTS 'email_list';
69
70 CREATE VIEW 'email_list' AS
71     SELECT email FROM Basic WHERE (email IS NOT NULL);
72
73 DROP TRIGGER IF EXISTS 'foo_trigger';
74
75 CREATE TRIGGER 'foo_trigger' after insert on 'Basic' BEGIN update modified=timestamp(); END;
76
77 DROP TRIGGER IF EXISTS 'bar_trigger_insert';
78
79 CREATE TRIGGER 'bar_trigger_insert' before insert on 'Basic' BEGIN update modified2=timestamp(); END;
80
81 DROP TRIGGER IF EXISTS 'bar_trigger_update';
82
83 CREATE TRIGGER 'bar_trigger_update' before update on 'Basic' BEGIN update modified2=timestamp(); END;
84
85 COMMIT;
86 SQL
87
88 # Test in list context
89 my @sql = $sqlt->translate(
90     from     => 'XML-SQLFairy',
91     to       => 'SQLite',
92     filename => $xmlfile,
93 ) or die $sqlt->error;
94
95 eq_or_diff(\@sql,
96           [
97           'BEGIN TRANSACTION',
98           q<DROP TABLE 'Basic'>,
99           q<CREATE TABLE 'Basic' (
100   'id' INTEGER PRIMARY KEY NOT NULL,
101   'title' varchar(100) NOT NULL DEFAULT 'hello',
102   'description' text DEFAULT '',
103   'email' varchar(500),
104   'explicitnulldef' varchar,
105   'explicitemptystring' varchar DEFAULT '',
106   -- Hello emptytagdef
107   'emptytagdef' varchar DEFAULT '',
108   'another_id' int(10) DEFAULT 2,
109   'timest' timestamp,
110   FOREIGN KEY('another_id') REFERENCES 'Another'()
111 )>,
112           q<CREATE INDEX 'titleindex' ON 'Basic' ('title')>,
113           q<CREATE UNIQUE INDEX 'emailuniqueindex' ON 'Basic' ('email')>,
114           q<CREATE UNIQUE INDEX 'very_long_index_name_on_title_field_which_should_be_truncated_for_various_rdbms' ON 'Basic' ('title')>,
115           q<DROP TABLE 'Another'>,
116           q<CREATE TABLE 'Another' (
117   'id' INTEGER PRIMARY KEY NOT NULL,
118   'num' numeric(10,2)
119 )>,
120           q<DROP VIEW IF EXISTS 'email_list'>,
121           q<CREATE VIEW 'email_list' AS
122     SELECT email FROM Basic WHERE (email IS NOT NULL)>,
123           q<DROP TRIGGER IF EXISTS 'foo_trigger'>,
124           q<CREATE TRIGGER 'foo_trigger' after insert on 'Basic' BEGIN update modified=timestamp(); END>,
125           q<DROP TRIGGER IF EXISTS 'bar_trigger_insert'>,
126           q<CREATE TRIGGER 'bar_trigger_insert' before insert on 'Basic' BEGIN update modified2=timestamp(); END>,
127           q<DROP TRIGGER IF EXISTS 'bar_trigger_update'>,
128           q<CREATE TRIGGER 'bar_trigger_update' before update on 'Basic' BEGIN update modified2=timestamp(); END>,
129           'COMMIT',
130
131           ], 'SQLite translate in list context matches');
132
133