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