Teach YAML producer to encode extra attributes
[dbsrgits/SQL-Translator.git] / t / 36-filters.t
CommitLineData
185c34d5 1#!/usr/bin/perl -w
2# vim:filetype=perl
3
44eb9098 4#=============================================================================
5# Test Package based filters that oks when called.
6package SQL::Translator::Filter::Ok;
7use strict;
8
9sub filter { Test::More::pass(@_) }
10
11# Hack to allow sqlt to see our module as it wasn't loaded from a .pm
12$INC{'SQL/Translator/Filter/Ok.pm'} = 'lib/SQL/Translator/Filter/Ok.pm';
185c34d5 13
185c34d5 14#=============================================================================
44eb9098 15# SQL::Translator::Filter::HelloWorld - Test filter in a package
da06ac74 16package # hide from cpan
17 SQL::Translator::Filter::HelloWorld;
185c34d5 18
19use strict;
185c34d5 20
21sub filter {
44eb9098 22 my ($schema,%args) = (shift,@_);
185c34d5 23
44eb9098 24 my $greeting = $args{greeting} || "Hello";
25 my $newtable = "${greeting}World";
26 $schema->add_table( name => $newtable );
185c34d5 27}
28
29# Hack to allow sqlt to see our module as it wasn't loaded from a .pm
30$INC{'SQL/Translator/Filter/HelloWorld.pm'}
31 = 'lib/SQL/Translator/Filter/HelloWorld.pm';
32
33#=============================================================================
34
35package main;
36
37use strict;
38use Test::More;
39use Test::Exception;
40use Test::SQL::Translator qw(maybe_plan);
41
42use Data::Dumper;
43
44BEGIN {
44eb9098 45 maybe_plan(16, 'Template', 'Test::Differences')
185c34d5 46}
47use Test::Differences;
48use SQL::Translator;
49
50my $in_yaml = qq{--- #YAML:1.0
51schema:
52 tables:
53 person:
54 name: person
55 fields:
56 first_name:
57 data_type: foovar
58 name: First_Name
59};
60
495c5c2f 61my $sqlt_version = $SQL::Translator::VERSION;
e7a96c90 62my $ans_yaml = qq{---
185c34d5 63schema:
64 procedures: {}
65 tables:
44eb9098 66 GdayWorld:
44eb9098 67 constraints: []
68 fields: {}
69 indices: []
70 name: GdayWorld
71 options: []
72 order: 3
185c34d5 73 HelloWorld:
185c34d5 74 constraints: []
75 fields: {}
76 indices: []
77 name: HelloWorld
78 options: []
79 order: 2
80 PERSON:
185c34d5 81 constraints: []
82 fields:
83 first_name:
84 data_type: foovar
85 default_value: ~
185c34d5 86 is_nullable: 1
87 is_primary_key: 0
88 is_unique: 0
89 name: first_name
90 order: 1
91 size:
92 - 0
93 indices: []
94 name: PERSON
95 options: []
96 order: 1
97 triggers: {}
98 views: {}
99translator:
100 add_drop_table: 0
101 filename: ~
102 no_comments: 0
103 parser_args: {}
104 parser_type: SQL::Translator::Parser::YAML
105 producer_args: {}
106 producer_type: SQL::Translator::Producer::YAML
107 show_warnings: 1
108 trace: 0
495c5c2f 109 version: $sqlt_version
185c34d5 110};
111
112# Parse the test XML schema
113my $obj;
114$obj = SQL::Translator->new(
115 debug => 0,
116 show_warnings => 1,
117 parser => "YAML",
118 data => $in_yaml,
119 to => "YAML",
120 filters => [
121 # Check they get called ok
122 sub {
123 pass("Filter 1 called");
124 isa_ok($_[0],"SQL::Translator::Schema", "Filter 1, arg0 ");
44eb9098 125 is( $#_, 0, "Filter 1, got no args");
185c34d5 126 },
127 sub {
128 pass("Filter 2 called");
129 isa_ok($_[0],"SQL::Translator::Schema", "Filter 2, arg0 ");
44eb9098 130 is( $#_, 0, "Filter 2, got no args");
185c34d5 131 },
132
133 # Sub filter with args
134 [ sub {
135 pass("Filter 3 called");
136 isa_ok($_[0],"SQL::Translator::Schema", "Filter 3, arg0 ");
44eb9098 137 is( $#_, 2, "Filter 3, go 2 args");
138 is( $_[1], "hello", "Filter 3, arg1=hello");
139 is( $_[2], "world", "Filter 3, arg2=world");
185c34d5 140 },
44eb9098 141 hello => "world" ],
185c34d5 142
143 # Uppercase all the table names.
144 sub {
145 my $schema = shift;
146 foreach ($schema->get_tables) {
147 $_->name(uc $_->name);
148 }
149 },
150
151 # lowercase all the field names.
152 sub {
153 my $schema = shift;
154 foreach ( map { $_->get_fields } $schema->get_tables ) {
155 $_->name(lc $_->name);
156 }
157 },
158
159 # Filter from SQL::Translator::Filter::*
44eb9098 160 'Ok',
185c34d5 161 [ 'HelloWorld' ],
44eb9098 162 [ 'HelloWorld', greeting => 'Gday' ],
185c34d5 163 ],
164
165) or die "Failed to create translator object: ".SQL::Translator->error;
166
167my $out;
168lives_ok { $out = $obj->translate; } "Translate ran";
169is $obj->error, '' ,"No errors";
170ok $out ne "" ,"Produced something!";
171eq_or_diff $out, $ans_yaml ,"Output looks right";