Create and parse FK constraints in SQLite
[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           'DROP TABLE Basic',
99           '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           'CREATE INDEX titleindex ON Basic (title)',
113           'CREATE UNIQUE INDEX emailuniqueindex ON Basic (email)',
114           'CREATE UNIQUE INDEX very_long_index_name_on_title_field_which_should_be_truncated_for_various_rdbms ON Basic (title)',
115           'DROP TABLE Another',
116           'CREATE TABLE Another (
117   id INTEGER PRIMARY KEY NOT NULL,
118   num numeric(10,2)
119 )',
120           'DROP VIEW IF EXISTS email_list',
121           'CREATE VIEW email_list AS
122     SELECT email FROM Basic WHERE (email IS NOT NULL)',
123           'DROP TRIGGER IF EXISTS foo_trigger',
124           'CREATE TRIGGER foo_trigger after insert on Basic BEGIN update modified=timestamp(); END',
125           'DROP TRIGGER IF EXISTS bar_trigger_insert',
126           'CREATE TRIGGER bar_trigger_insert before insert on Basic BEGIN update modified2=timestamp(); END',
127           'DROP TRIGGER IF EXISTS bar_trigger_update',
128           '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