Handel/t/storage_dbic_schema_instance.t
#!perl -w
use strict;
use warnings;
BEGIN {
use lib 't/lib';
use Handel::Test;
eval 'require DBD::SQLite';
if($@) {
plan skip_all => 'DBD::SQLite not installed';
} else {
plan tests => 83;
};
use_ok('Handel::Storage::DBIC');
use_ok('Handel::Exception', ':try');
};
my $dsn = Handel::Test->init_schema(no_populate => 1)->dsn;
my $constraints = {
id => {'check_id' => sub{}},
name => {'check_name' => sub{}}
};
## now for an instance
my $storage = Handel::Storage::DBIC->new({
schema_class => 'Handel::Cart::Schema',
schema_source => 'Carts',
default_values => {id => 1, name => 'New Cart'},
validation_profile => {cart => [param1 => [ ['BLANK'], ['ASCII', 2, 12] ]]},
add_columns => [qw/custom/],
remove_columns => [qw/description/],
constraints => $constraints,
currency_columns => [qw/name/],
connection_info => [
$dsn
]
});
{
## create a new storage and check schema_instance configuration
isa_ok($storage, 'Handel::Storage');
my $schema = $storage->schema_instance;
isa_ok($schema, 'Handel::Cart::Schema');
my $cart_class = $schema->class('Carts');
my $item_class = $schema->class('Items');
my $cart_source = $schema->source('Carts');
my $item_source = $schema->source('Items');
## make sure we're running clones unique classes
like($cart_class, qr/Handel::Storage::DBIC::[A-F0-9]{32}::Carts/, 'class is the composed style');
like($item_class, qr/Handel::Storage::DBIC::[A-F0-9]{32}::Items/, 'class is the composed style');
## make sure we loaded the validation profile Component and values
ok($cart_class->isa('Handel::Components::Validation'), 'Validation component is loaded');
is_deeply($cart_class->validation_profile, {cart => [param1 => [ ['BLANK'], ['ASCII', 2, 12] ]]}, 'profile was stored in component');
ok(!$item_class->isa('Handel::Components::Validation'), 'Validation component still not loaded in item class');
## make sure we loaded the default values Component and values
ok($cart_class->isa('Handel::Components::DefaultValues'), 'Defaults component is loaded');
is_deeply($cart_class->default_values, {id => 1, name => 'New Cart'}, 'default values was storage in component');
ok(!$item_class->isa('Handel::Components::DefaultValues'), 'Defaults component still not loaded in item class');
## make sure we loaded the constraints Component and values
ok($cart_class->isa('Handel::Components::Constraints'), 'Constraints component is loaded');
is_deeply($cart_class->constraints, $constraints, 'constraints stored in component');
ok(!$item_class->isa('Handel::Components::Constraints'), 'Constraints component still not loaded in item class');
## make sure we added/removed columns
my %columns = map {$_ => 1} $cart_source->columns;
ok(exists $columns{'custom'}, 'column custom not added');
ok(!exists $columns{'description'}, 'column description not removed');
## make sure we set inflate/deflate
ok($cart_class->column_info('name')->{'_inflate_info'}->{'inflate'}, 'inflate sub added');
ok($cart_class->column_info('name')->{'_inflate_info'}->{'deflate'}, 'deflate sub added');
## pass in a schema_instance and recheck schema configuration
my $new_schema = Handel::Cart::Schema->connect($dsn);
isa_ok($new_schema, 'Handel::Cart::Schema');
$storage->schema_instance($new_schema);
$new_schema = $storage->schema_instance;
my $new_cart_class = $new_schema->class('Carts');
my $new_item_class = $new_schema->class('Items');
my $new_cart_source = $new_schema->source('Carts');
my $new_item_source = $new_schema->source('Items');
## make sure we're not the first schema in disguise
isnt($cart_class, $new_cart_class, 'not original cart class');
isnt($item_class, $new_item_class, 'not original item class');
## make sure we're running clones unique classes
like($new_cart_class, qr/Handel::Storage::DBIC::[A-F0-9]{32}::Carts/, 'class is the composed style');
like($new_item_class, qr/Handel::Storage::DBIC::[A-F0-9]{32}::Items/, 'class is the composed style');
## make sure we loaded the validation profile Component and values
ok($new_cart_class->isa('Handel::Components::Validation'), 'Validation component is loaded');
is_deeply($new_cart_class->validation_profile, {cart => [param1 => [ ['BLANK'], ['ASCII', 2, 12] ]]}, 'validation profile is loaded');
ok(!$new_item_class->isa('Handel::Components::Validation'), 'Validation component not loaded in item class');
## make sure we loaded the default values Component and values
ok($new_cart_class->isa('Handel::Components::DefaultValues'), 'DefaultValues component is loaded');
is_deeply($new_cart_class->default_values, {id => 1, name => 'New Cart'}, 'default values are loaded');
ok(!$new_item_class->isa('Handel::Components::DefaultValues'), 'efaultValues component not loaded in item class');
## make sure we loaded the constraints Component and values
ok($new_cart_class->isa('Handel::Components::Constraints'), 'Constraints component is loaded');
is_deeply($new_cart_class->constraints, $constraints, 'constraints are loaded');
ok(!$new_item_class->isa('Handel::Components::Constraints'), 'Constraints component not loaded in item class');
## make sure we added/removed columns
my %new_columns = map {$_ => 1} $new_cart_source->columns;
ok(exists $new_columns{'custom'}, 'column custom not added');
ok(!exists $new_columns{'description'}, 'column description not removed');
## unset it
ok($storage->_schema_instance, 'have schema instance');
$storage->schema_instance(undef);
is($storage->_schema_instance, undef, 'unloaded schema instance');
## throw exception if schema_class is empty
{
try {
local $ENV{'LANGUAGE'} = 'en';
my $storage = Handel::Storage::DBIC->new({
schema_source => 'Carts',
connection_info => [$dsn]
});
$storage->schema_instance;
fail('no exception thrown');
} catch Handel::Exception::Storage with {
pass('caught storage exception');
like(shift, qr/no schema_class/i, 'no schema class in message')
} otherwise {
fail('other exception caught');
};
};
## throw exception if schema_source is empty
{
try {
local $ENV{'LANGUAGE'} = 'en';
my $storage = Handel::Storage::DBIC->new({
schema_class => 'Handel::Cart::Schema',
connection_info => [$dsn]
});
$storage->schema_instance;
fail('no exception thrown');
} catch Handel::Exception::Storage with {
pass('storage exception caught');
like(shift, qr/no schema_source/i, 'no schema source in message')
} otherwise {
fail('other exception caught');
};
};
## throw exception if item_relationship is missing
{
try {
local $ENV{'LANGUAGE'} = 'en';
my $storage = Handel::Storage::DBIC->new({
schema_class => 'Handel::Cart::Schema',
schema_source => 'Carts',
item_storage_class => 'Handel::Storage::DBIC::Cart::Item',
item_relationship => 'foo',
connection_info => [$dsn]
});
$storage->schema_instance;
fail('no exception thrown');
} catch Handel::Exception::Storage with {
pass('caught storage exception');
like(shift, qr/no relationship named/i, 'no relationship in message')
} otherwise {
fail('other exception caught');
};
};
};
## work on class too
{
Handel::Storage::DBIC->schema_class('Handel::Cart::Schema');
Handel::Storage::DBIC->schema_source('Carts');
Handel::Storage::DBIC->constraints($constraints);
Handel::Storage::DBIC->default_values({id => 1, name => 'New Cart'});
Handel::Storage::DBIC->validation_profile({cart => [param1 => [ ['BLANK'], ['ASCII', 2, 12] ]]});
Handel::Storage::DBIC->add_columns(qw/custom/);
Handel::Storage::DBIC->remove_columns(qw/description/);
Handel::Storage::DBIC->currency_columns(qw/name/);
my $schema = Handel::Storage::DBIC->schema_instance;
isa_ok($schema, 'Handel::Cart::Schema');
my $cart_class = $schema->class('Carts');
my $item_class = $schema->class('Items');
my $cart_source = $schema->source('Carts');
my $item_source = $schema->source('Items');
## make sure we're running clones unique classes
like($cart_class, qr/Handel::Storage::DBIC::[A-F0-9]{32}::Carts/, 'class is the composed style');
like($item_class, qr/Handel::Storage::DBIC::[A-F0-9]{32}::Items/, 'class is the composed style');
## make sure we loaded the validation profile Component and values
ok($cart_class->isa('Handel::Components::Validation'), 'Validation component loaded');
is_deeply($cart_class->validation_profile, {cart => [param1 => [ ['BLANK'], ['ASCII', 2, 12] ]]}, 'validaiton profile loaded');
ok(!$item_class->isa('Handel::Components::Validation'), 'Validation component no loaded in item class');
## make sure we loaded the default values Component and values
ok($cart_class->isa('Handel::Components::DefaultValues'), 'DefaultValues component is loaded');
is_deeply($cart_class->default_values, {id => 1, name => 'New Cart'}, 'default values is loaded');
ok(!$item_class->isa('Handel::Components::DefaultValues'), 'DefaultValues not loaded in item class');
## make sure we loaded the constraints Component and values
ok($cart_class->isa('Handel::Components::Constraints'), 'Constraints component is loaded');
is_deeply($cart_class->constraints, $constraints, 'constraints are loaded');
ok(!$item_class->isa('Handel::Components::Constraints'), 'Constraints component not loaded in item class');
## make sure we added/removed columns
my %columns = map {$_ => 1} $cart_source->columns;
ok(exists $columns{'custom'}, 'column custom not added');
ok(!exists $columns{'description'}, 'column description not removed');
## make sure we set inflate/deflate
ok($cart_class->column_info('name')->{'_inflate_info'}->{'inflate'}, 'inflate subs loaded');
ok($cart_class->column_info('name')->{'_inflate_info'}->{'deflate'}, 'deflate subs loaded');
## pass in a schema_instance and recheck schema configuration
my $new_schema = Handel::Cart::Schema->connect($dsn);
isa_ok($new_schema, 'Handel::Cart::Schema');
Handel::Storage::DBIC->schema_instance($new_schema);
$new_schema = Handel::Storage::DBIC->schema_instance;
my $new_cart_class = $new_schema->class('Carts');
my $new_item_class = $new_schema->class('Items');
my $new_cart_source = $new_schema->source('Carts');
my $new_item_source = $new_schema->source('Items');
## make sure we're not the first schema in disguise
isnt($cart_class, $new_cart_class, 'not original cart class');
isnt($item_class, $new_item_class, 'not original item class');
## make sure we're running clones unique classes
like($new_cart_class, qr/Handel::Storage::DBIC::[A-F0-9]{32}::Carts/, 'class is the composed style');
like($new_item_class, qr/Handel::Storage::DBIC::[A-F0-9]{32}::Items/, 'class is the composed style');
## make sure we loaded the validation profile Component and values
ok($new_cart_class->isa('Handel::Components::Validation'), 'Validation component is loaded');
is_deeply($new_cart_class->validation_profile, {cart => [param1 => [ ['BLANK'], ['ASCII', 2, 12] ]]}, 'validation profile is loaded');
ok(!$new_item_class->isa('Handel::Components::Validation'), 'Validation component not loaded in item class');
## make sure we loaded the default values Component and values
ok($new_cart_class->isa('Handel::Components::DefaultValues'), 'Defaultvalues component is loaded');
is_deeply($new_cart_class->default_values, {id => 1, name => 'New Cart'}, 'default values are loaded');
ok(!$new_item_class->isa('Handel::Components::DefaultValues'), 'DefaultValues component is not loaded in item class');
## make sure we loaded the constraints Component and values
ok($new_cart_class->isa('Handel::Components::Constraints'), 'Constraints component is loaded');
is_deeply($new_cart_class->constraints, $constraints, 'constraints are loaded');
ok(!$new_item_class->isa('Handel::Components::Constraints'), 'Constraints component is not loaded in item class');
## make sure we added/removed columns
my %new_columns = map {$_ => 1} $new_cart_source->columns;
ok(exists $new_columns{'custom'}, 'column custom not added');
ok(!exists $new_columns{'description'}, 'column description not removed');
## unset it
ok(Handel::Storage::DBIC->_schema_instance, 'we have a schema instance');
Handel::Storage::DBIC->schema_instance(undef);
is(Handel::Storage::DBIC->_schema_instance, undef, 'schema instance was unloaded');
## throw exception if schema_class is empty
{
try {
local $ENV{'LANGUAGE'} = 'en';
Handel::Storage::DBIC->schema_class(undef);
Handel::Storage::DBIC->schema_instance;
fail('no exception thrown');
} catch Handel::Exception::Storage with {
pass('storage exception caught');
like(shift, qr/no schema_class/i, 'no schema class in message')
} otherwise {
fail('other exception caught');
};
};
## throw exception if schema_source is empty
{
try {
local $ENV{'LANGUAGE'} = 'en';
Handel::Storage::DBIC->schema_class('Handel::Cart::Schema');
Handel::Storage::DBIC->schema_source(undef);
Handel::Storage::DBIC->schema_instance;
fail('no exception thrown');
} catch Handel::Exception::Storage with {
pass('storage exception caught');
like(shift, qr/no schema_source/i, 'no schema source in message')
} otherwise {
fail('other exception caught');
};
};
## throw exception if item_relationship is missing
{
try {
local $ENV{'LANGUAGE'} = 'en';
Handel::Storage::DBIC->schema_class('Handel::Cart::Schema');
Handel::Storage::DBIC->schema_source('Carts');
Handel::Storage::DBIC->item_storage_class('Handel::Storage::DBIC::Cart::Item');
Handel::Storage::DBIC->item_relationship('foo');
Handel::Storage::DBIC->schema_instance;
fail('no exception thrown');
} catch Handel::Exception::Storage with {
pass('storage exception caught');
like(shift, qr/no relationship named/i, 'no relationship in message')
} otherwise {
fail('caught other exception');
};
};
};