X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F47postgres-producer.t;h=6201091dc45bc583b3484cf88e4fe8d1c98e85d7;hb=f38b7673315088c4b699fc1c6c823c441c5387a9;hp=d52136ffeabb76773dcf8ab2b1caa61115633441;hpb=5342f5c1a47ee390b226bf3d9b57cdfb8c803b63;p=dbsrgits%2FSQL-Translator.git diff --git a/t/47postgres-producer.t b/t/47postgres-producer.t index d52136f..6201091 100644 --- a/t/47postgres-producer.t +++ b/t/47postgres-producer.t @@ -14,7 +14,7 @@ use FindBin qw/$Bin/; #============================================================================= BEGIN { - maybe_plan(7, + maybe_plan(17, 'SQL::Translator::Producer::PostgreSQL', 'Test::Differences', ) @@ -22,7 +22,7 @@ BEGIN { use Test::Differences; use SQL::Translator; - +my $PRODUCER = \&SQL::Translator::Producer::PostgreSQL::create_field; my $table = SQL::Translator::Schema::Table->new( name => 'mytable'); @@ -52,17 +52,17 @@ my $field2 = SQL::Translator::Schema::Field->new( name => 'myfield', my $alter_field = SQL::Translator::Producer::PostgreSQL::alter_field($field1, $field2); -is($alter_field, qq[ALTER TABLE mytable ALTER COLUMN myfield SET NOT NULL; -ALTER TABLE mytable ALTER COLUMN myfield TYPE character varying(25);], +is($alter_field, qq[ALTER TABLE mytable ALTER COLUMN myfield SET NOT NULL +ALTER TABLE mytable ALTER COLUMN myfield TYPE character varying(25)], 'Alter field works'); $field1->name('field3'); my $add_field = SQL::Translator::Producer::PostgreSQL::add_field($field1); -is($add_field, 'ALTER TABLE mytable ADD COLUMN field3 character varying(10);', 'Add field works'); +is($add_field, 'ALTER TABLE mytable ADD COLUMN field3 character varying(10)', 'Add field works'); my $drop_field = SQL::Translator::Producer::PostgreSQL::drop_field($field2); -is($drop_field, 'ALTER TABLE mytable DROP COLUMN myfield;', 'Drop field works'); +is($drop_field, 'ALTER TABLE mytable DROP COLUMN myfield', 'Drop field works'); my $field3 = SQL::Translator::Schema::Field->new( name => 'time_field', table => $table, @@ -104,3 +104,154 @@ my $field5_sql = SQL::Translator::Producer::PostgreSQL::create_field($field5,{ p is($field5_sql, 'enum_field mytable_enum_field_type NOT NULL', 'Create real enum field works'); + + + +my $field6 = SQL::Translator::Schema::Field->new( + name => 'character', + table => $table, + data_type => 'character', + size => '123', + default_value => 'foobar', + is_auto_increment => 0, + is_nullable => 0, + is_foreign_key => 0, + is_unique => 0); + +my $field7 = SQL::Translator::Schema::Field->new( + name => 'character', + table => $table, + data_type => 'character', + size => '123', + default_value => undef, + is_auto_increment => 0, + is_nullable => 0, + is_foreign_key => 0, + is_unique => 0); + +$alter_field = SQL::Translator::Producer::PostgreSQL::alter_field($field6, + $field7); + +is($alter_field, q(ALTER TABLE mytable ALTER COLUMN character DROP DEFAULT), 'DROP DEFAULT'); + +$field7->default_value(q(foo'bar')); + +$alter_field = SQL::Translator::Producer::PostgreSQL::alter_field($field6, + $field7); + +is($alter_field, q(ALTER TABLE mytable ALTER COLUMN character SET DEFAULT 'foo''bar'''), 'DEFAULT with escaping'); + +$field7->default_value(\q(foobar)); + +$alter_field = SQL::Translator::Producer::PostgreSQL::alter_field($field6, + $field7); + +is($alter_field, q(ALTER TABLE mytable ALTER COLUMN character SET DEFAULT foobar), 'DEFAULT unescaped if scalarref'); + +$field7->is_nullable(1); +$field7->default_value(q(foobar)); + +$alter_field = SQL::Translator::Producer::PostgreSQL::alter_field($field6, + $field7); + +is($alter_field, q(ALTER TABLE mytable ALTER COLUMN character DROP NOT NULL), 'DROP NOT NULL'); + + +{ + # let's test default values! -- rjbs, 2008-09-30 + my %field = ( + table => $table, + data_type => 'VARCHAR', + size => 10, + is_auto_increment => 0, + is_nullable => 1, + is_foreign_key => 0, + is_unique => 0, + ); + + { + my $simple_default = SQL::Translator::Schema::Field->new( + %field, + name => 'str_default', + default_value => 'foo', + ); + + is( + $PRODUCER->($simple_default), + q{str_default character varying(10) DEFAULT 'foo'}, + 'default str', + ); + } + + { + my $null_default = SQL::Translator::Schema::Field->new( + %field, + name => 'null_default', + default_value => \'NULL', + ); + + is( + $PRODUCER->($null_default), + q{null_default character varying(10) DEFAULT NULL}, + 'default null', + ); + } + + { + my $null_default = SQL::Translator::Schema::Field->new( + %field, + name => 'null_default_2', + default_value => 'NULL', # XXX: this should go away + ); + + is( + $PRODUCER->($null_default), + q{null_default_2 character varying(10) DEFAULT NULL}, + 'default null from special cased string', + ); + } + + { + my $func_default = SQL::Translator::Schema::Field->new( + %field, + name => 'func_default', + default_value => \'func(funky)', + ); + + is( + $PRODUCER->($func_default), + q{func_default character varying(10) DEFAULT func(funky)}, + 'unquoted default from scalar ref', + ); + } +} + + +my $view1 = SQL::Translator::Schema::View->new( + name => 'view_foo', + fields => [qw/id name/], + sql => 'SELECT id, name FROM thing', +); +my $create_opts = { add_replace_view => 1, no_comments => 1 }; +my $view1_sql1 = SQL::Translator::Producer::PostgreSQL::create_view($view1, $create_opts); + +my $view_sql_replace = "CREATE VIEW view_foo ( id, name ) AS ( + SELECT id, name FROM thing + )"; +is($view1_sql1, $view_sql_replace, 'correct "CREATE OR REPLACE VIEW" SQL'); + +my $view2 = SQL::Translator::Schema::View->new( + name => 'view_foo2', + sql => 'SELECT id, name FROM thing', + extra => { + 'temporary' => '1', + 'check_option' => 'cascaded', + }, +); +my $create2_opts = { add_replace_view => 1, no_comments => 1 }; +my $view2_sql1 = SQL::Translator::Producer::PostgreSQL::create_view($view2, $create2_opts); + +my $view2_sql_replace = "CREATE TEMPORARY VIEW view_foo2 AS ( + SELECT id, name FROM thing + ) WITH CASCADED CHECK OPTION"; +is($view2_sql1, $view2_sql_replace, 'correct "CREATE OR REPLACE VIEW" SQL 2');