-#!/usr/bin/perl -w
+#!/usr/bin/perl -w
# vim:filetype=perl
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'
-
-#
-# basic.t
-# -------
-# Tests that;
#
-
-use Test::More;
-use Test::Exception;
+# Run script with -d for debug.
use strict;
-use Data::Dumper;
-our %opt;
-BEGIN { map { $opt{$_}=1 if s/^-// } @ARGV; }
-use constant DEBUG => (exists $opt{d} ? 1 : 0);
-local $SIG{__WARN__} = sub { diag "[warn] ", @_; };
use FindBin qw/$Bin/;
-# Usefull test subs for the schema objs
-#=============================================================================
+use Test::More;
+use Test::SQL::Translator;
+use Test::Exception;
+use Data::Dumper;
+use SQL::Translator;
+use SQL::Translator::Schema::Constants;
-our %ATTRIBUTES;
-$ATTRIBUTES{field} = [qw/
-name
-order
-data_type
-default_value
-size
-is_primary_key
-is_unique
-is_nullable
-is_foreign_key
-is_auto_increment
-/];
-
-sub test_field {
- my ($fld,$test) = @_;
- die "test_field needs a least a name!" unless $test->{name};
- my $name = $test->{name};
- is $fld->name, $name, "$name - Name right";
-
- foreach my $attr ( @{$ATTRIBUTES{field}} ) {
- if ( exists $test->{$attr} ) {
- my $ans = $test->{$attr};
- if ( $attr =~ m/^is_/ ) {
- if ($ans) { ok $fld->$attr, " $name - $attr true"; }
- else { ok !$fld->$attr, " $name - $attr false"; }
- }
- else {
- is $fld->$attr, $ans, " $name - $attr = '"
- .(defined $ans ? $ans : "NULL" )."'";
- }
- }
- else {
- ok !$fld->$attr, "$name - $attr not set";
- }
- }
-}
+# Simple options. -d for debug
+my %opt;
+BEGIN { map { $opt{$_}=1 if s/^-// } @ARGV; }
+use constant DEBUG => (exists $opt{d} ? 1 : 0);
-# TODO test_constraint, test_index
# Testing 1,2,3,4...
#=============================================================================
-plan tests => 89;
+BEGIN {
+ maybe_plan(238, 'SQL::Translator::Parser::XML::SQLFairy');
+}
-use SQL::Translator;
-use SQL::Translator::Schema::Constants;
+my $testschema = "$Bin/data/xml/schema.xml";
-# Parse the test XML schema
-our $obj;
-$obj = SQL::Translator->new(
+my $sqlt;
+$sqlt = SQL::Translator->new(
debug => DEBUG,
show_warnings => 1,
add_drop_table => 1,
);
-my $testschema = "$Bin/data/xml/schema-basic.xml";
die "Can't find test schema $testschema" unless -e $testschema;
-my $sql = $obj->translate(
- from => "SqlfXML",
- to =>"MySQL",
+
+my $sql;
+{
+ my @w;
+ local $SIG{__WARN__} = sub { push @w, $_[0] if $_[0] =~ /The database_event tag is deprecated - please use database_events/ };
+
+ $sql = $sqlt->translate(
+ from => 'XML-SQLFairy',
+ to => 'MySQL',
filename => $testschema,
-);
-print $sql if DEBUG;
-#print "Debug:", Dumper($obj) if DEBUG;
+ ) or die $sqlt->error;
+ print $sql if DEBUG;
+
+ ok (@w, 'database_event deprecation warning issued');
+}
# Test the schema objs generted from the XML
#
-my $scma = $obj->schema;
-my @tblnames = map {$_->name} $scma->get_tables;
-is_deeply( \@tblnames, [qw/Basic/], "tables");
-
-# Basic
-my $tbl = $scma->get_table("Basic");
-is $tbl->order, 1, "Basic->order";
-is_deeply( [map {$_->name} $tbl->get_fields], [qw/
- id title description email explicitnulldef explicitemptystring emptytagdef
-/] , "Table Basic's fields");
-test_field($tbl->get_field("id"),{
- name => "id",
- order => 1,
- data_type => "int",
- default_value => undef,
- is_nullable => 0,
- size => 10,
- is_primary_key => 1,
- is_auto_increment => 1,
-});
-test_field($tbl->get_field("title"),{
- name => "title",
- order => 2,
- data_type => "varchar",
- is_nullable => 0,
- default_value => "hello",
- size => 100,
-});
-test_field($tbl->get_field("description"),{
- name => "description",
- order => 3,
- data_type => "text",
- is_nullable => 1,
- default_value => "",
-});
-test_field($tbl->get_field("email"),{
- name => "email",
- order => 4,
- data_type => "varchar",
- size => 255,
- is_unique => 1,
- default_value => undef,
- is_nullable => 1,
-});
-test_field($tbl->get_field("explicitnulldef"),{
- name => "explicitnulldef",
- order => 5,
- data_type => "varchar",
- default_value => undef,
- is_nullable => 1,
-});
-test_field($tbl->get_field("explicitemptystring"),{
- name => "explicitemptystring",
- order => 6,
- data_type => "varchar",
- default_value => "",
- is_nullable => 1,
-});
-test_field($tbl->get_field("emptytagdef"),{
- name => "emptytagdef",
- order => 7,
- data_type => "varchar",
- default_value => "",
- is_nullable => 1,
-});
-
-my @indices = $tbl->get_indices;
-is scalar(@indices), 1, "Table basic has 1 index";
-
-my @constraints = $tbl->get_constraints;
-is scalar(@constraints), 2, "Table basic has 2 constraints";
-my $con = shift @constraints;
-is $con->table, $tbl, "Constaints table right";
-is $con->name, "", "Constaints table right";
-is $con->type, PRIMARY_KEY, "Constaint is primary key";
-is_deeply [$con->fields], ["id"], "Constaint fields";
-$con = shift @constraints;
-is $con->table, $tbl, "Constaints table right";
-is $con->type, UNIQUE, "Constaint UNIQUE";
-is_deeply [$con->fields], ["email"], "Constaint fields";
+my $scma = $sqlt->schema;
+
+# Hmmm, when using schema_ok the field test data gets a bit too nested and
+# fiddly to work with. (See 28xml-xmi-parser-sqlfairy.t for more a split out
+# version)
+schema_ok( $scma, {
+ tables => [
+ {
+ name => "Basic",
+ options => [ { ENGINE => 'InnoDB' } ],
+ extra => {
+ foo => "bar",
+ hello => "world",
+ bar => "baz",
+ },
+ fields => [
+ {
+ name => "id",
+ data_type => "int",
+ default_value => undef,
+ is_nullable => 0,
+ size => 10,
+ is_primary_key => 1,
+ is_auto_increment => 1,
+ extra => { ZEROFILL => 1 },
+ },
+ {
+ name => "title",
+ data_type => "varchar",
+ is_nullable => 0,
+ default_value => "hello",
+ size => 100,
+ is_unique => 1,
+ },
+ {
+ name => "description",
+ data_type => "text",
+ is_nullable => 1,
+ default_value => "",
+ },
+ {
+ name => "email",
+ data_type => "varchar",
+ size => 500,
+ is_unique => 1,
+ default_value => undef,
+ is_nullable => 1,
+ extra => {
+ foo => "bar",
+ hello => "world",
+ bar => "baz",
+ }
+ },
+ {
+ name => "explicitnulldef",
+ data_type => "varchar",
+ default_value => undef,
+ is_nullable => 1,
+ size => 255,
+ },
+ {
+ name => "explicitemptystring",
+ data_type => "varchar",
+ default_value => "",
+ is_nullable => 1,
+ size => 255,
+ },
+ {
+ name => "emptytagdef",
+ data_type => "varchar",
+ default_value => "",
+ is_nullable => 1,
+ comments => "Hello emptytagdef",
+ size => 255,
+ },
+ {
+ name => "another_id",
+ data_type => "int",
+ size => "10",
+ default_value => 2,
+ is_nullable => 1,
+ is_foreign_key => 1,
+ },
+ {
+ name => "timest",
+ data_type => "timestamp",
+ size => "0",
+ is_nullable => 1,
+ },
+ ],
+ constraints => [
+ {
+ type => PRIMARY_KEY,
+ fields => ["id"],
+ extra => {
+ foo => "bar",
+ hello => "world",
+ bar => "baz",
+ },
+ },
+ {
+ name => 'emailuniqueindex',
+ type => UNIQUE,
+ fields => ["email"],
+ },
+ {
+ name => 'very_long_index_name_on_title_field_which_should_be_truncated_for_various_rdbms',
+ type => UNIQUE,
+ fields => ["title"],
+ },
+ {
+ type => FOREIGN_KEY,
+ fields => ["another_id"],
+ reference_table => "Another",
+ reference_fields => ["id"],
+ name => 'Basic_fk'
+ },
+ ],
+ indices => [
+ {
+ name => "titleindex",
+ fields => ["title"],
+ extra => {
+ foo => "bar",
+ hello => "world",
+ bar => "baz",
+ },
+ },
+ ],
+ }, # end table Basic
+ {
+ name => "Another",
+ extra => {
+ foo => "bar",
+ hello => "world",
+ bar => "baz",
+ },
+ options => [ { ENGINE => 'InnoDB' } ],
+ fields => [
+ {
+ name => "id",
+ data_type => "int",
+ default_value => undef,
+ is_nullable => 0,
+ size => 10,
+ is_primary_key => 1,
+ is_auto_increment => 1,
+ },
+ {
+ name => "num",
+ data_type => "numeric",
+ default_value => undef,
+ size => '10,2',
+ },
+ ],
+ }, # end table Another
+ ], # end tables
+
+ views => [
+ {
+ name => 'email_list',
+ sql => "SELECT email FROM Basic WHERE (email IS NOT NULL)",
+ fields => ['email'],
+ extra => {
+ foo => "bar",
+ hello => "world",
+ bar => "baz",
+ },
+ },
+ ],
+
+ triggers => [
+ {
+ name => 'foo_trigger',
+ perform_action_when => 'after',
+ database_events => 'insert',
+ on_table => 'Basic',
+ action => 'update modified=timestamp();',
+ extra => {
+ foo => "bar",
+ hello => "world",
+ bar => "baz",
+ },
+ },
+ {
+ name => 'bar_trigger',
+ perform_action_when => 'before',
+ database_events => 'insert,update',
+ on_table => 'Basic',
+ action => 'update modified2=timestamp();',
+ extra => {
+ hello => "aliens",
+ },
+ },
+ ],
+
+ procedures => [
+ {
+ name => 'foo_proc',
+ sql => 'select foo from bar',
+ parameters => ['foo', 'bar'],
+ owner => 'Nomar',
+ comments => 'Go Sox!',
+ extra => {
+ foo => "bar",
+ hello => "world",
+ bar => "baz",
+ },
+ },
+ ],
+
+}); # end schema