#!/usr/bin/perl -w
use strict;
use Test::More tests => 36;
BEGIN
{
require 't/test-lib.pl';
use_ok('Rose::DB::Object');
use_ok('Rose::DB::Object::Metadata');
}
my $meta = Rose::DB::Object::Metadata->new(class => 'MyDBObject');
my $meta2 = Rose::DB::Object::Metadata->for_class('MyDBObject');
is(ref $meta, 'Rose::DB::Object::Metadata', 'new()');
is(ref $meta2, 'Rose::DB::Object::Metadata', 'for_class');
is($meta, $meta2, 'new() & for_class()');
#$meta->schema('priv');
$meta->table('mytable');
#is($meta->schema, 'priv', 'schema()');
is($meta->table, 'mytable', 'table()');
is($meta->fq_table_sql(MyDBObject->init_db), 'rose_db_object_private.mytable', 'fq_table_sql()');
$meta->columns
(
'name',
id => { primary_key => 1 },
password => { type => 'chkpass' },
flag => { type => 'boolean', default => 1 },
flag2 => { type => 'boolean' },
status => { default => 'active' },
start => { type => 'date', default => '12/24/1980' },
save => { type => 'scalar' },
nums => { type => 'array' },
bits => { type => 'bitfield', bits => 5, default => 101 },
date_created => { type => 'timestamp' },
);
is($meta->first_column->name, 'name', 'first_column 1');
$meta->add_columns(
Rose::DB::Object::Metadata::Column::Timestamp->new(
name => 'last_modified'));
ok(!$meta->column('foo'), 'column()');
$meta->add_column('foo');
ok($meta->column('foo'), 'add_column()');
$meta->add_columns('bar', baz => { type => 'bitfield', bits => 10 });
ok($meta->column('bar'), 'add_columns() 1');
ok($meta->column('baz'), 'add_columns() 2');
eval { $meta->initialize(preserve_existing => 1) };
ok($@, 'initialize() reserved method');
is($meta->column_aliases, undef, 'column_aliases() 1');
my $aliases = $meta->column_aliases;
is($aliases, undef, 'column_aliases() 3');
$meta->alias_column(save => 'save_col');
$meta->initialize(preserve_existing => 1);
is($meta->class_for(table => 'mytable'), 'MyDBObject',
'class_for() as object method');
is(Rose::DB::Object::Metadata->class_for(table => 'mytable'), 'MyDBObject',
'class_for() as class method');
is(join(',', sort $meta->column_names), 'bar,baz,bits,date_created,flag,flag2,foo,id,last_modified,name,nums,password,save,start,status', 'column_names');
$aliases = $meta->column_aliases;
is(join(',', sort keys %$aliases), 'save', 'column_aliases() 3');
is($aliases->{'save'}, 'save_col', 'column_aliases() 4');
my $methods = $meta->column_rw_method_names;
is(join(',', sort @$methods), 'bar,baz,bits,date_created,flag,flag2,foo,id,last_modified,name,nums,password,save_col,start,status', 'column_rw_method_names()');
eval { $meta->convention_manager('nonesuch') };
ok($@, 'convention_manager nonesuch');
$meta->convention_manager('null');
is(ref $meta->convention_manager, 'Rose::DB::Object::ConventionManager::Null',
'convention_manager null');
my $class = ref $meta;
is($class->convention_manager_class('default'), 'Rose::DB::Object::ConventionManager',
'convention_manager default');
$class->convention_manager_class(foo => 'bar');
$class->convention_manager_class(default => 'Rose::DB::Object::ConventionManager::Null');
is($class->convention_manager_class('foo'), 'bar', 'convention_manager bar');
$class->delete_convention_manager_class('foo');
ok(!defined $class->convention_manager_class('foo'), 'delete_convention_manager_class');
is(ref $class->init_convention_manager, 'Rose::DB::Object::ConventionManager::Null',
'init_convention_manager');
$meta = MyDBOBjectCustom->meta;
$meta->init_auto_helper;
eval { $meta->make_column_methods() };
ok($@ =~ /^Yay!/, 'custom meta override');
# default_manager_base_class
is($meta->default_manager_base_class, 'Rose::DB::Object::Manager', 'default_manager_base_class object 1');
is(ref($meta)->default_manager_base_class, 'Rose::DB::Object::Manager', 'default_manager_base_class class 1');
$meta->default_manager_base_class('Foo');
is($meta->default_manager_base_class, 'Foo', 'default_manager_base_class object 2');
is(ref($meta)->default_manager_base_class, 'Rose::DB::Object::Manager', 'default_manager_base_class class 2');
$meta->default_manager_base_class(undef);
ref($meta)->default_manager_base_class('Bar');
is($meta->default_manager_base_class, 'Bar', 'default_manager_base_class object 3');
is(ref($meta)->default_manager_base_class, 'Bar', 'default_manager_base_class class 3');
$meta->default_manager_base_class('Blee');
is($meta->default_manager_base_class, 'Blee', 'default_manager_base_class object 4');
is(ref($meta)->default_manager_base_class, 'Bar', 'default_manager_base_class class 4');
BEGIN
{
package MyDBObject;
our @ISA = qw(Rose::DB::Object);
sub init_db { Rose::DB->new('pg_with_schema') }
package MyDBObject::Metadata;
our @ISA = qw(Rose::DB::Object::Metadata);
sub make_column_methods { die "Yay!" }
package MyDBObject::Base;
our @ISA = qw(Rose::DB::Object);
sub init_db { Rose::DB->new('pg_with_schema') }
sub meta_class { 'MyDBObject::Metadata' }
package MyDBOBjectCustom;
our @ISA = qw(MyDBObject::Base);
}
1;