#!/usr/bin/perl -w
package Local::SQL::Translator::Parser::XML::Xmldoom;
use base qw(Test::Class);
use SQL::Translator;
use SQL::Translator::Schema::Constants;
use SQL::Translator::Parser::XML::Xmldoom;
use Test::More;
use strict;
use Data::Dumper;
sub parse
{
my $translator = SQL::Translator->new(@_);
SQL::Translator::Parser::XML::Xmldoom::parse($translator, ${$translator->data});
return $translator->schema;
}
sub testDatabaseTag : Test(2)
{
my $self = shift;
my $xml = << "EOF";
EOF
my $schema = parse(data => $xml);
is( $schema->name, 'bookstore' );
is( $schema->extra('defaultIdMethod'), 'native');
}
sub testTableTag : Test(2)
{
my $self = shift;
my $xml = << "EOF";
EOF
my $schema = parse(data => $xml);
my $table = $schema->get_table('book');
is( $table->name, 'book' );
is( $table->extra('description'), 'Book Table');
}
sub testColumnTag : Test(20)
{
my $self = shift;
my $xml = << "EOF";
EOF
my $schema = parse(data => $xml);
my $table = $schema->get_table('book');
my $field1 = $table->get_field('book_id');
my $field2 = $table->get_field('title');
my $field3 = $table->get_field('active');
my $field4 = $table->get_field('last_changed');
# check first field
is( $field1->name, 'book_id' );
is( $field1->data_type, 'INTEGER' );
is( $field1->is_primary_key, 1 );
is( $field1->is_nullable, 1 );
is( $field1->is_auto_increment, 1 );
is( $field1->extra('description'), 'Book Id' );
is( $field1->extra('idGenerator'), 'Some::Perl::Class' );
# check second field
is( $field2->name, 'title' );
is( $field2->data_type, 'VARCHAR' );
is( $field2->is_primary_key, 0 );
is( $field2->is_nullable, 0 );
is( $field2->is_auto_increment, 0 );
is( $field2->extra('description'), 'Book Title' );
is( $field2->default_value, 'Unknown' );
# check enum field
my $options = $field3->extra( 'list' );
is( scalar @$options, 2 );
is( $options->[0], 'Y' );
is( $options->[1], 'N' );
# check the timestamp attribute
is( $field4->extra('timestamp'), 'current' );
my @primary_key;
foreach my $constraint ( $table->get_constraints )
{
if ( $constraint->type eq PRIMARY_KEY )
{
@primary_key = $constraint->field_names;
last;
}
}
ok( scalar @primary_key == 1 );
is( $primary_key[0], 'book_id' );
}
sub testForeignKeyTag : Test(6)
{
my $self = shift;
my $xml = << "EOF";
EOF
my $schema = parse(data => $xml);
my $table = $schema->get_table('book');
my @foreign_keys;
foreach my $constraint ( $table->get_constraints )
{
if ( $constraint->type eq FOREIGN_KEY )
{
push @foreign_keys, $constraint;
}
}
ok( scalar @foreign_keys == 1 );
is( $foreign_keys[0]->reference_table, 'author' );
my @local_fields = $foreign_keys[0]->fields;
my @foreign_fields = $foreign_keys[0]->reference_fields;
ok( scalar @local_fields == 1 );
is( $local_fields[0], 'author_id' );
ok( scalar @foreign_fields == 1 );
is( $foreign_fields[0], 'author_id' );
}
1;