call inflate_result on new_result, but not from the CDBI compat layer
[dbsrgits/DBIx-Class.git] / t / row / inflate_result.t
CommitLineData
db4e9221 1package My::Schema::Result::User;
2
3use strict;
4use warnings;
de621449 5use DBIx::Class::ResultClass::HashRefInflator;
db4e9221 6use base qw/DBIx::Class::Core/;
7
8### Define what our admin class is, for ensure_class_loaded()
9my $admin_class = __PACKAGE__ . '::Admin';
10
11__PACKAGE__->table('users');
12
13__PACKAGE__->add_columns(
14 qw/user_id email password
15 firstname lastname active
16 admin/
17);
18
19__PACKAGE__->set_primary_key('user_id');
20
21sub inflate_result {
22 my $self = shift;
23 my $ret = $self->next::method(@_);
de621449 24
db4e9221 25 if ( $ret->admin ) { ### If this is an admin, rebless for extra functions
26 $self->ensure_class_loaded($admin_class);
27 bless $ret, $admin_class;
28 }
29 return $ret;
30}
31
32sub hello {
33 return "I am a regular user.";
34}
35
36package My::Schema::Result::User::Admin;
37
38use strict;
39use warnings;
40use base qw/My::Schema::Result::User/;
41
42# This line is important
43__PACKAGE__->table('users');
44
45sub hello {
46 return "I am an admin.";
47}
48
49sub do_admin_stuff {
50 return "I am doing admin stuff";
51}
52
53package My::Schema;
54
55use base qw/DBIx::Class::Schema/;
56
57My::Schema->register_class( Admin => 'My::Schema::Result::User::Admin' );
58My::Schema->register_class( User => 'My::Schema::Result::User' );
59
601;
61
62package main;
63
64use lib qw(t/lib);
65use DBICTest;
de621449 66use DBIx::Class::ResultClass::HashRefInflator;
db4e9221 67
68use Test::More;
69
70my $user_data = {
71 email => 'someguy@place.com',
72 password => 'pass1',
73 admin => 0
74};
75
76my $admin_data = {
77 email => 'someadmin@adminplace.com',
78 password => 'pass2',
79 admin => 1
80};
81
82ok( my $schema = My::Schema->connection('dbi:SQLite:dbname=:memory:') );
83
84ok(
85 $schema->storage->dbh->do(
86"create table users (user_id, email, password, firstname, lastname, active, admin)"
87 )
88);
89
de621449 90my $rs = $schema->resultset('User');
91
db4e9221 92TODO: {
93 local $TODO = 'New objects should also be inflated';
de621449 94 my $user = $rs->create($user_data);
95 my $admin = $rs->create($admin_data);
db4e9221 96
97 is( ref $user, 'My::Schema::Result::User' );
98 is( ref $admin, 'My::Schema::Result::User::Admin' );
99
100}
101
102my $user = $schema->resultset('User')->single($user_data);
103my $admin = $schema->resultset('User')->single($admin_data);
104
105is( ref $user, 'My::Schema::Result::User' );
106is( ref $admin, 'My::Schema::Result::User::Admin' );
107
108is( $user->password, 'pass1' );
109is( $admin->password, 'pass2' );
110is( $user->hello, 'I am a regular user.' );
111is( $admin->hello, 'I am an admin.' );
112
113ok( !$user->can('do_admin_stuff') );
114ok( $admin->can('do_admin_stuff') );
115
116done_testing;