Only output trigger 'scope' if it's set in YAML and JSON producers
[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     quote_identifiers => 1,
24     no_comments => 1,
25     show_warnings  => 0,
26     add_drop_table => 1,
27 );
28
29 die "Can't find test schema $xmlfile" unless -e $xmlfile;
30
31 my $sql = $sqlt->translate(
32     from     => 'XML-SQLFairy',
33     to       => 'SQLite',
34     filename => $xmlfile,
35 ) or die $sqlt->error;
36
37 eq_or_diff($sql, << "SQL");
38 BEGIN TRANSACTION;
39
40 DROP TABLE "Basic";
41
42 CREATE TABLE "Basic" (
43   "id" INTEGER PRIMARY KEY NOT NULL,
44   "title" varchar(100) NOT NULL DEFAULT 'hello',
45   "description" text DEFAULT '',
46   "email" varchar(500),
47   "explicitnulldef" varchar,
48   "explicitemptystring" varchar DEFAULT '',
49   -- Hello emptytagdef
50   "emptytagdef" varchar DEFAULT '',
51   "another_id" int(10) DEFAULT 2,
52   "timest" timestamp,
53   FOREIGN KEY ("another_id") REFERENCES "Another"("id")
54 );
55
56 CREATE INDEX "titleindex" ON "Basic" ("title");
57
58 CREATE UNIQUE INDEX "emailuniqueindex" ON "Basic" ("email");
59
60 CREATE UNIQUE INDEX "very_long_index_name_on_title_field_which_should_be_truncated_for_various_rdbms" ON "Basic" ("title");
61
62 DROP TABLE "Another";
63
64 CREATE TABLE "Another" (
65   "id" INTEGER PRIMARY KEY NOT NULL,
66   "num" numeric(10,2)
67 );
68
69 DROP VIEW IF EXISTS "email_list";
70
71 CREATE VIEW "email_list" AS
72     SELECT email FROM Basic WHERE (email IS NOT NULL);
73
74 DROP TRIGGER IF EXISTS "foo_trigger";
75
76 CREATE TRIGGER "foo_trigger" after insert on "Basic" BEGIN update modified=timestamp(); END;
77
78 DROP TRIGGER IF EXISTS "bar_trigger_insert";
79
80 CREATE TRIGGER "bar_trigger_insert" before insert on "Basic" BEGIN update modified2=timestamp(); END;
81
82 DROP TRIGGER IF EXISTS "bar_trigger_update";
83
84 CREATE TRIGGER "bar_trigger_update" before update on "Basic" BEGIN update modified2=timestamp(); END;
85
86 COMMIT;
87 SQL
88
89 # Test in list context
90 my @sql = $sqlt->translate(
91     from     => 'XML-SQLFairy',
92     to       => 'SQLite',
93     filename => $xmlfile,
94 ) or die $sqlt->error;
95
96 eq_or_diff(\@sql,
97           [
98           'BEGIN TRANSACTION',
99           q<DROP TABLE "Basic">,
100           q<CREATE TABLE "Basic" (
101   "id" INTEGER PRIMARY KEY NOT NULL,
102   "title" varchar(100) NOT NULL DEFAULT 'hello',
103   "description" text DEFAULT '',
104   "email" varchar(500),
105   "explicitnulldef" varchar,
106   "explicitemptystring" varchar DEFAULT '',
107   -- Hello emptytagdef
108   "emptytagdef" varchar DEFAULT '',
109   "another_id" int(10) DEFAULT 2,
110   "timest" timestamp,
111   FOREIGN KEY ("another_id") REFERENCES "Another"("id")
112 )>,
113           q<CREATE INDEX "titleindex" ON "Basic" ("title")>,
114           q<CREATE UNIQUE INDEX "emailuniqueindex" ON "Basic" ("email")>,
115           q<CREATE UNIQUE INDEX "very_long_index_name_on_title_field_which_should_be_truncated_for_various_rdbms" ON "Basic" ("title")>,
116           q<DROP TABLE "Another">,
117           q<CREATE TABLE "Another" (
118   "id" INTEGER PRIMARY KEY NOT NULL,
119   "num" numeric(10,2)
120 )>,
121           q<DROP VIEW IF EXISTS "email_list">,
122           q<CREATE VIEW "email_list" AS
123     SELECT email FROM Basic WHERE (email IS NOT NULL)>,
124           q<DROP TRIGGER IF EXISTS "foo_trigger">,
125           q<CREATE TRIGGER "foo_trigger" after insert on "Basic" BEGIN update modified=timestamp(); END>,
126           q<DROP TRIGGER IF EXISTS "bar_trigger_insert">,
127           q<CREATE TRIGGER "bar_trigger_insert" before insert on "Basic" BEGIN update modified2=timestamp(); END>,
128           q<DROP TRIGGER IF EXISTS "bar_trigger_update">,
129           q<CREATE TRIGGER "bar_trigger_update" before update on "Basic" BEGIN update modified2=timestamp(); END>,
130           'COMMIT',
131
132           ], 'SQLite translate in list context matches');
133
134