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( |
7305f6f9 |
23 | user_id => { retrieve_on_insert => 1 }, |
24 | qw( email password firstname lastname active admin ), |
db4e9221 |
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 | |
a0216b74 |
62 | use base qw/DBICTest::BaseSchema/; |
db4e9221 |
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; |
db4e9221 |
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 | |
8d6b1478 |
82 | ok( my $schema = My::Schema->connect(DBICTest->_database) ); |
db4e9221 |
83 | |
84 | ok( |
85 | $schema->storage->dbh->do( |
86 | "create table users (user_id, email, password, firstname, lastname, active, admin)" |
87 | ) |
88 | ); |
89 | |
4ca1fd6f |
90 | { |
91 | my $user = $schema->resultset('User')->create($user_data); |
92 | my $admin = $schema->resultset('User')->create($admin_data); |
db4e9221 |
93 | |
4ca1fd6f |
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' ); |
db4e9221 |
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; |