use strict; use warnings; use lib 't/lib'; use Fey::Test; use Test::More; use Fey::Schema; { my $s = Fey::Schema->new( name => 'Test' ); is( $s->name(), 'Test', 'schema name is Test' ); $s->set_name('NewTest'); is( $s->name(), 'NewTest', 'schema name is now NewTest' ); } { my $s = Fey::Schema->new( name => 'Test' ); my $t = Fey::Table->new( name => 'Test' ); ok( !$t->schema(), 'table has no schema when created' ); $s->add_table($t); is( $t->schema(), $s, 'table has a schema after calling add_table()' ); is( $s->table( $t->name() ), $t, 'table is in schema' ); $s->remove_table($t); ok( !$t->schema(), 'table has no schema after calling remove_table()' ); ok( !$s->table( $t->name() ), 'table is not in schema' ); $s->add_table($t); $s->remove_table( $t->name() ); ok( !$t->schema(), 'table has no schema after calling remove_table()' ); $s->add_table($t); eval { $s->add_table($t); }; like( $@, qr/already contains a table named Test/, 'error when adding the same table twice' ); } { require Fey::FK; my $s = Fey::Test->mock_test_schema(); my $fk = Fey::FK->new( source_columns => $s->table('User')->column('user_id'), target_columns => $s->table('UserGroup')->column('user_id'), ); $s->add_foreign_key($fk); { my @fk = $s->foreign_keys_for_table('User'); is( scalar @fk, 1, 'one fk for User table - passed as name' ); } my @fk = $s->foreign_keys_for_table( $s->table('User') ); is( scalar @fk, 1, 'one fk for User table - passed as object' ); is( $fk[0]->source_table()->name(), 'User', 'source table is user' ); is( $fk[0]->source_columns()->[0]->name(), 'user_id', 'source column is user_id' ); $s->add_foreign_key($fk); @fk = $s->foreign_keys_for_table('User'); is( scalar @fk, 1, 'one fk for User table - dupes are ignored' ); @fk = $s->foreign_keys_for_table('UserGroup'); is( scalar @fk, 1, 'one fk for UserGroup table' ); is( $fk[0]->id(), $fk->id(), 'foreign key for UserGroup is same as original fk' ); @fk = $s->foreign_keys_between_tables( 'User', 'UserGroup' ); is( scalar @fk, 1, 'one fk for UserGroup table' ); is( $fk[0]->id(), $fk->id(), 'one foreign key between User and UserGroup is same as original' ); my $alias = $s->table('User')->alias( alias_name => 'UserA' ); @fk = $s->foreign_keys_between_tables( $alias, 'UserGroup' ); is( scalar @fk, 1, 'one fk between alias of User table and UserGroup table' ); is( $fk[0]->source_columns()->[0]->table(), $alias, 'source column points to alias' ); @fk = $s->foreign_keys_between_tables( 'UserGroup', 'User' ); is( scalar @fk, 1, 'one fk for UserGroup table' ); is( $fk[0]->id(), $fk->id(), 'one foreign key between UserGroup and User' ); @fk = $s->foreign_keys_between_tables( $s->table('User'), $s->table('UserGroup') ); is( scalar @fk, 1, 'one fk for UserGroup table - passed as objects' ); @fk = $s->foreign_keys_between_tables( 'User', 'Group' ); is( scalar @fk, 0, 'no fks between User and Group' ); $s->remove_foreign_key($fk); @fk = $s->foreign_keys_for_table('User'); is( scalar @fk, 0, 'no fks for User table' ); $s->add_foreign_key($fk); my $user_t = $s->table('User'); $s->remove_table('User'); @fk = $s->foreign_keys_for_table('UserGroup'); is( scalar @fk, 0, 'no fks for UserGroup table after User table is removed' ); $s->add_table($user_t); $fk = Fey::FK->new( source_columns => $s->table('User')->column('user_id'), target_columns => $s->table('UserGroup')->column('user_id'), ); $s->add_foreign_key($fk); $user_t->remove_column('user_id'); @fk = $s->foreign_keys_for_table('UserGroup'); is( scalar @fk, 0, 'no fks for UserGroup table after User.user_id column is removed' ); @fk = $s->foreign_keys_between_tables( $s->table('User'), $s->table('UserGroup') ); is( scalar @fk, 0, 'no fks between User and UserGroup after User.user_id columns is removed' ); @fk = $s->foreign_keys_between_tables( $s->table('UserGroup'), $s->table('User') ); is( scalar @fk, 0, 'no fks between UserGroup and User after User.user_id columns is removed' ); @fk = $s->foreign_keys_between_tables( $s->table('Message'), $s->table('Message') ); is( scalar @fk, 0, 'no fks between Message and Message' ); } { my $s = Fey::Test->mock_test_schema(); my $fk = Fey::FK->new( source_columns => $s->table('Message')->column('parent_message_id'), target_columns => $s->table('Message')->column('message_id'), ); $s->add_foreign_key($fk); my @fks = $s->foreign_keys_for_table('Message'); is( @fks, 1, 'foreign_keys_for_table() returns just one fk in the case of a self-referential fk' ); is_deeply( [ map { $_->name() } @{ $fks[0]->source_columns() } ], ['parent_message_id'], 'source_columns() returns Message.parent_message_id' ); @fks = $s->foreign_keys_between_tables( 'Message', 'Message' ); is( @fks, 1, 'foreign_keys_between_tables() returns just one fk in the case of a self-referential fk' ); is_deeply( [ map { $_->name() } @{ $fks[0]->source_columns() } ], ['parent_message_id'], 'source_columns() returns Message.parent_message_id' ); } { my $s = Fey::Test->mock_test_schema(); my @tables = sort map { $_->name() } $s->tables(); is( scalar @tables, 4, 'schema has 4 tables' ); is_deeply( \@tables, [ 'Group', 'Message', 'User', 'UserGroup' ], 'tables are Group, Message, User, & UserGroup' ); @tables = sort map { $_->name() } $s->tables( 'User', 'Group' ); is( scalar @tables, 2, 'tables() returns named tables' ); is_deeply( \@tables, [ 'Group', 'User' ], 'tables are Group & User' ); @tables = sort map { $_->name() } $s->tables('NoSuchTable'); is( scalar @tables, 0, 'tables() ignores tables which do not exist' ); } done_testing();