Commit | Line | Data |
c0329273 |
1 | BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) } |
2 | |
4bea1fe7 |
3 | use warnings; |
4 | use strict; |
5 | |
6 | use Test::More; |
7 | |
c0329273 |
8 | |
4bea1fe7 |
9 | use DBICTest; |
10 | |
db4e9221 |
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/DBIx::Class::Schema/; |
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; |
db4e9221 |
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 | |
8d6b1478 |
83 | ok( my $schema = My::Schema->connect(DBICTest->_database) ); |
db4e9221 |
84 | |
85 | ok( |
86 | $schema->storage->dbh->do( |
87 | "create table users (user_id, email, password, firstname, lastname, active, admin)" |
88 | ) |
89 | ); |
90 | |
4ca1fd6f |
91 | { |
92 | my $user = $schema->resultset('User')->create($user_data); |
93 | my $admin = $schema->resultset('User')->create($admin_data); |
db4e9221 |
94 | |
4ca1fd6f |
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' ); |
db4e9221 |
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; |