Teach YAML producer to encode extra attributes
[dbsrgits/SQL-Translator.git] / t / 24yaml.t
1 use warnings;
2 use strict;
3 use Test::More;
4 use Test::Differences;
5 use Test::SQL::Translator qw(maybe_plan);
6 use SQL::Translator;
7 use FindBin '$Bin';
8
9 BEGIN {
10     maybe_plan(2,
11         'SQL::Translator::Parser::SQLite',
12         'SQL::Translator::Producer::YAML');
13 }
14
15 my $sqlt_version = $SQL::Translator::VERSION;
16 my $yaml = <<YAML;
17 ---
18 schema:
19   procedures: {}
20   tables:
21     person:
22       constraints:
23         - deferrable: 1
24           expression: ''
25           fields:
26             - person_id
27           match_type: ''
28           name: ''
29           on_delete: ''
30           on_update: ''
31           options: []
32           reference_fields: []
33           reference_table: ''
34           type: PRIMARY KEY
35         - deferrable: 1
36           expression: ''
37           fields:
38             - name
39           match_type: ''
40           name: u_name
41           on_delete: ''
42           on_update: ''
43           options: []
44           reference_fields: []
45           reference_table: ''
46           type: UNIQUE
47       fields:
48         age:
49           data_type: integer
50           default_value: ~
51           is_nullable: 1
52           is_primary_key: 0
53           is_unique: 0
54           name: age
55           order: 3
56           size:
57             - 0
58         description:
59           data_type: text
60           default_value: ~
61           is_nullable: 1
62           is_primary_key: 0
63           is_unique: 0
64           name: description
65           order: 6
66           size:
67             - 0
68         iq:
69           data_type: tinyint
70           default_value: 0
71           is_nullable: 1
72           is_primary_key: 0
73           is_unique: 0
74           name: iq
75           order: 5
76           size:
77             - 0
78         name:
79           data_type: varchar
80           default_value: ~
81           is_nullable: 0
82           is_primary_key: 0
83           is_unique: 1
84           name: name
85           order: 2
86           size:
87             - 20
88         person_id:
89           data_type: INTEGER
90           default_value: ~
91           is_nullable: 0
92           is_primary_key: 1
93           is_unique: 0
94           name: person_id
95           order: 1
96           size:
97             - 0
98         weight:
99           data_type: double
100           default_value: ~
101           is_nullable: 1
102           is_primary_key: 0
103           is_unique: 0
104           name: weight
105           order: 4
106           size:
107             - 11
108             - 2
109       indices: []
110       name: person
111       options: []
112       order: 1
113     pet:
114       constraints:
115         - deferrable: 1
116           expression: ''
117           fields: []
118           match_type: ''
119           name: ''
120           on_delete: ''
121           on_update: ''
122           options: []
123           reference_fields: []
124           reference_table: ''
125           type: CHECK
126         - deferrable: 1
127           expression: ''
128           fields:
129             - pet_id
130             - person_id
131           match_type: ''
132           name: ''
133           on_delete: ''
134           on_update: ''
135           options: []
136           reference_fields: []
137           reference_table: ''
138           type: PRIMARY KEY
139       fields:
140         age:
141           data_type: int
142           default_value: ~
143           is_nullable: 1
144           is_primary_key: 0
145           is_unique: 0
146           name: age
147           order: 4
148           size:
149             - 0
150         name:
151           data_type: varchar
152           default_value: ~
153           is_nullable: 1
154           is_primary_key: 0
155           is_unique: 0
156           name: name
157           order: 3
158           size:
159             - 30
160         person_id:
161           data_type: int
162           default_value: ~
163           is_nullable: 0
164           is_primary_key: 1
165           is_unique: 0
166           name: person_id
167           order: 2
168           size:
169             - 0
170         pet_id:
171           data_type: int
172           default_value: ~
173           is_nullable: 0
174           is_primary_key: 1
175           is_unique: 0
176           name: pet_id
177           order: 1
178           size:
179             - 0
180       indices: []
181       name: pet
182       options: []
183       order: 2
184   triggers:
185     pet_trig:
186       action:
187         for_each: ~
188         steps:
189           - update pet set name=name
190         when: ~
191       database_events:
192         - insert
193       fields: ~
194       name: pet_trig
195       on_table: pet
196       order: 1
197       perform_action_when: after
198   views:
199     person_pet:
200       fields: ''
201       name: person_pet
202       order: 1
203       sql: |
204         select pr.person_id, pr.name as person_name, pt.name as pet_name
205           from   person pr, pet pt
206           where  person.person_id=pet.pet_id
207 translator:
208   add_drop_table: 0
209   filename: ~
210   no_comments: 0
211   parser_args: {}
212   parser_type: SQL::Translator::Parser::SQLite
213   producer_args: {}
214   producer_type: SQL::Translator::Producer::YAML
215   show_warnings: 0
216   trace: 0
217   version: $sqlt_version
218 YAML
219
220 my $file = "$Bin/data/sqlite/create.sql";
221 open FH, "<$file" or die "Can't read '$file': $!\n";
222 local $/;
223 my $data = <FH>;
224 my $tr   = SQL::Translator->new(
225     parser   => 'SQLite',
226     producer => 'YAML',
227     data     => $data,
228 );
229
230 my $out;
231 ok( $out = $tr->translate, 'Translate SQLite to YAML' );
232 eq_or_diff( $out, $yaml, 'YAML matches expected' );