Introduce GOVERNANCE document and empty RESOLUTIONS file.
[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   user_id => { retrieve_on_insert => 1 },
24   qw( email password firstname lastname active admin ),
25 );
26
27 __PACKAGE__->set_primary_key('user_id');
28
29 sub inflate_result {
30     my $self = shift;
31     my $ret  = $self->next::method(@_);
32     if ( $ret->admin ) {    ### If this is an admin, rebless for extra functions
33         $self->ensure_class_loaded($admin_class);
34         bless $ret, $admin_class;
35     }
36     return $ret;
37 }
38
39 sub hello {
40     return "I am a regular user.";
41 }
42
43 package My::Schema::Result::User::Admin;
44
45 use strict;
46 use warnings;
47 use base qw/My::Schema::Result::User/;
48
49 # This line is important
50 __PACKAGE__->table('users');
51
52 sub hello {
53     return "I am an admin.";
54 }
55
56 sub do_admin_stuff {
57     return "I am doing admin stuff";
58 }
59
60 package My::Schema;
61
62 use base qw/DBICTest::BaseSchema/;
63
64 My::Schema->register_class( Admin => 'My::Schema::Result::User::Admin' );
65 My::Schema->register_class( User  => 'My::Schema::Result::User' );
66
67 1;
68
69 package main;
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->connect(DBICTest->_database) );
83
84 ok(
85     $schema->storage->dbh->do(
86 "create table users (user_id, email, password, firstname, lastname, active,  admin)"
87     )
88 );
89
90 {
91   my $user  = $schema->resultset('User')->create($user_data);
92   my $admin = $schema->resultset('User')->create($admin_data);
93
94   is( ref $user,  'My::Schema::Result::User' );
95
96   local $TODO = 'New objects should also be inflated';
97   is( ref $admin, 'My::Schema::Result::User::Admin' );
98 }
99
100 my $user  = $schema->resultset('User')->single($user_data);
101 my $admin = $schema->resultset('User')->single($admin_data);
102
103 is( ref $user,  'My::Schema::Result::User' );
104 is( ref $admin, 'My::Schema::Result::User::Admin' );
105
106 is( $user->password,  'pass1' );
107 is( $admin->password, 'pass2' );
108 is( $user->hello,     'I am a regular user.' );
109 is( $admin->hello,    'I am an admin.' );
110
111 ok( !$user->can('do_admin_stuff') );
112 ok( $admin->can('do_admin_stuff') );
113
114 done_testing;