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