| 1 | #!/usr/bin/perl |
|---|
| 2 | |
|---|
| 3 | use strict; |
|---|
| 4 | use Test::More; |
|---|
| 5 | |
|---|
| 6 | BEGIN { |
|---|
| 7 | $ENV{MT_CONFIG} = 'mysql-test.cfg'; |
|---|
| 8 | } |
|---|
| 9 | use lib 't/lib', 'extlib', 'lib', '../lib', '../extlib'; |
|---|
| 10 | use MT::Test; |
|---|
| 11 | use MT; |
|---|
| 12 | my $mt; |
|---|
| 13 | BEGIN { |
|---|
| 14 | $mt = new MT; |
|---|
| 15 | my $grp_class = MT->model('group'); |
|---|
| 16 | if (! $grp_class ) { |
|---|
| 17 | plan skip_all => "Groups are unavailable for testing."; |
|---|
| 18 | } else { |
|---|
| 19 | plan tests => 16; |
|---|
| 20 | } |
|---|
| 21 | } |
|---|
| 22 | |
|---|
| 23 | MT::Test->import( qw( :db ) ); |
|---|
| 24 | |
|---|
| 25 | use MT::Blog; |
|---|
| 26 | use MT::Author; |
|---|
| 27 | use MT::Role; |
|---|
| 28 | use MT::Association; |
|---|
| 29 | use MT::Group; |
|---|
| 30 | use MT::Request; |
|---|
| 31 | |
|---|
| 32 | my $r = MT::Request->instance; |
|---|
| 33 | |
|---|
| 34 | # Users: |
|---|
| 35 | |
|---|
| 36 | my $user_brad = new MT::Author(); |
|---|
| 37 | $user_brad->name('Brad'); |
|---|
| 38 | $user_brad->set_password('(none)'); |
|---|
| 39 | $user_brad->save or die $user_brad->errstr; |
|---|
| 40 | |
|---|
| 41 | my $user_chris = new MT::Author(); |
|---|
| 42 | $user_chris->name('Chris'); |
|---|
| 43 | $user_chris->set_password('(none)'); |
|---|
| 44 | $user_chris->save; |
|---|
| 45 | |
|---|
| 46 | my $user_garth = new MT::Author(); |
|---|
| 47 | $user_garth->name('Garth'); |
|---|
| 48 | $user_garth->set_password('(none)'); |
|---|
| 49 | $user_garth->save; |
|---|
| 50 | |
|---|
| 51 | my $user_gene = new MT::Author(); |
|---|
| 52 | $user_gene->name('Gene'); |
|---|
| 53 | $user_gene->set_password('(none)'); |
|---|
| 54 | $user_gene->save; |
|---|
| 55 | |
|---|
| 56 | my $user_jason = new MT::Author; |
|---|
| 57 | $user_jason->set_password('(none)'); |
|---|
| 58 | $user_jason->name('Jason'); |
|---|
| 59 | $user_jason->is_superuser(1); |
|---|
| 60 | $user_jason->save; |
|---|
| 61 | |
|---|
| 62 | my $user_lilia = new MT::Author(); |
|---|
| 63 | $user_lilia->name('Lilia'); |
|---|
| 64 | $user_lilia->set_password('(none)'); |
|---|
| 65 | $user_lilia->save; |
|---|
| 66 | |
|---|
| 67 | my $user_luke = new MT::Author(); |
|---|
| 68 | $user_luke->name('Luke'); |
|---|
| 69 | $user_luke->set_password('(none)'); |
|---|
| 70 | $user_luke->save; |
|---|
| 71 | |
|---|
| 72 | my $user_mark = new MT::Author(); |
|---|
| 73 | $user_mark->name('Mark'); |
|---|
| 74 | $user_mark->set_password('(none)'); |
|---|
| 75 | $user_mark->save; |
|---|
| 76 | |
|---|
| 77 | my $user_melody = new MT::Author(); |
|---|
| 78 | $user_melody->name('Melody'); |
|---|
| 79 | $user_melody->set_password('(none)'); |
|---|
| 80 | $user_melody->save; |
|---|
| 81 | |
|---|
| 82 | my $user_randy = new MT::Author(); |
|---|
| 83 | $user_randy->name('Randy'); |
|---|
| 84 | $user_randy->set_password('(none)'); |
|---|
| 85 | $user_randy->save; |
|---|
| 86 | |
|---|
| 87 | my $user_walt = new MT::Author; |
|---|
| 88 | $user_walt->name('Walt'); |
|---|
| 89 | $user_walt->set_password('(none)'); |
|---|
| 90 | $user_walt->save; |
|---|
| 91 | |
|---|
| 92 | # Groups |
|---|
| 93 | |
|---|
| 94 | my $group_designers = new MT::Group; |
|---|
| 95 | $group_designers->name('Designers'); |
|---|
| 96 | $group_designers->save; |
|---|
| 97 | $group_designers->add_user($user_lilia); |
|---|
| 98 | $group_designers->add_user($user_walt); |
|---|
| 99 | $group_designers->add_user($user_luke); |
|---|
| 100 | |
|---|
| 101 | my $group_engineers = new MT::Group; |
|---|
| 102 | $group_engineers->name('Engineers'); |
|---|
| 103 | $group_engineers->save; |
|---|
| 104 | $group_engineers->add_user($user_brad); |
|---|
| 105 | $group_engineers->add_user($user_gene); |
|---|
| 106 | $group_engineers->add_user($user_randy); |
|---|
| 107 | $group_engineers->add_user($user_mark); |
|---|
| 108 | $group_engineers->add_user($user_garth); |
|---|
| 109 | |
|---|
| 110 | my $group_it = new MT::Group; |
|---|
| 111 | $group_it->name('IT'); |
|---|
| 112 | $group_it->add_user($user_jason); |
|---|
| 113 | |
|---|
| 114 | my $group_managers = new MT::Group; |
|---|
| 115 | $group_managers->name('Managers'); |
|---|
| 116 | $group_managers->save; |
|---|
| 117 | $group_managers->add_user($user_brad); |
|---|
| 118 | $group_managers->add_user($user_garth); |
|---|
| 119 | $group_managers->add_user($user_randy); |
|---|
| 120 | |
|---|
| 121 | my $group_mt = new MT::Group; |
|---|
| 122 | $group_mt->name('Movable Type'); |
|---|
| 123 | $group_mt->save; |
|---|
| 124 | $group_mt->add_user($user_brad); |
|---|
| 125 | $group_mt->add_user($user_gene); |
|---|
| 126 | $group_mt->add_user($user_luke); |
|---|
| 127 | $group_mt->add_user($user_chris); |
|---|
| 128 | |
|---|
| 129 | my $group_qa = new MT::Group; |
|---|
| 130 | $group_qa->name('QA'); |
|---|
| 131 | $group_qa->save; |
|---|
| 132 | $group_qa->add_user($user_chris); |
|---|
| 133 | |
|---|
| 134 | my $group_typepad = new MT::Group; |
|---|
| 135 | $group_typepad->name('TypePad'); |
|---|
| 136 | $group_typepad->save; |
|---|
| 137 | $group_typepad->add_user($user_garth); |
|---|
| 138 | $group_typepad->add_user($user_mark); |
|---|
| 139 | $group_typepad->add_user($user_walt); |
|---|
| 140 | |
|---|
| 141 | my $group_vox = new MT::Group; |
|---|
| 142 | $group_vox->name('Vox'); |
|---|
| 143 | $group_vox->save; |
|---|
| 144 | $group_vox->add_user($user_lilia); |
|---|
| 145 | $group_vox->add_user($user_randy); |
|---|
| 146 | |
|---|
| 147 | my $role_design = new MT::Role; |
|---|
| 148 | $role_design->name('Custom Designer'); |
|---|
| 149 | $role_design->set_these_permissions('edit_templates'); |
|---|
| 150 | $role_design->save; |
|---|
| 151 | |
|---|
| 152 | my $role_admin = new MT::Role; |
|---|
| 153 | $role_admin->name('Custom Administrator'); |
|---|
| 154 | $role_admin->set_these_permissions('administer_blog'); |
|---|
| 155 | $role_admin->save; |
|---|
| 156 | |
|---|
| 157 | my $role_writer = new MT::Role; |
|---|
| 158 | $role_writer->name('Custom Writer'); |
|---|
| 159 | $role_writer->set_these_permissions('create_post'); |
|---|
| 160 | $role_writer->save; |
|---|
| 161 | |
|---|
| 162 | # Blogs |
|---|
| 163 | |
|---|
| 164 | my $blog_mt = new MT::Blog; |
|---|
| 165 | $blog_mt->name('Movable Type'); |
|---|
| 166 | $blog_mt->save; |
|---|
| 167 | |
|---|
| 168 | my $blog_vox = new MT::Blog; |
|---|
| 169 | $blog_vox->name('Vox Themes'); |
|---|
| 170 | $blog_vox->save; |
|---|
| 171 | |
|---|
| 172 | my $blog_qa = new MT::Blog; |
|---|
| 173 | $blog_qa->name('QA Central'); |
|---|
| 174 | $blog_qa->save; |
|---|
| 175 | |
|---|
| 176 | my $blog_db = new MT::Blog; |
|---|
| 177 | $blog_db->name('Daily Build'); |
|---|
| 178 | $blog_db->save; |
|---|
| 179 | |
|---|
| 180 | my $blog_mgt = new MT::Blog; |
|---|
| 181 | $blog_mgt->name('Management'); |
|---|
| 182 | $blog_mgt->save; |
|---|
| 183 | |
|---|
| 184 | my $blog_tp = new MT::Blog; |
|---|
| 185 | $blog_tp->name('TypePadding'); |
|---|
| 186 | $blog_tp->save; |
|---|
| 187 | |
|---|
| 188 | # Associations |
|---|
| 189 | |
|---|
| 190 | MT::Association->link($blog_mt => $group_mt => $role_writer); |
|---|
| 191 | MT::Association->link($blog_mt => $user_brad => $role_design); |
|---|
| 192 | MT::Association->link($blog_vox => $group_vox => $role_writer); |
|---|
| 193 | MT::Association->link($blog_qa => $group_qa => $role_writer); |
|---|
| 194 | MT::Association->link($blog_db => $group_engineers => $role_writer); |
|---|
| 195 | MT::Association->link($blog_mgt => $group_managers => $role_writer); |
|---|
| 196 | MT::Association->link($blog_tp => $group_typepad => $role_writer); |
|---|
| 197 | |
|---|
| 198 | MT::Association->link($blog_mt => $group_designers => $role_design); |
|---|
| 199 | MT::Association->link($blog_vox => $group_designers => $role_design); |
|---|
| 200 | MT::Association->link($blog_qa => $group_designers => $role_design); |
|---|
| 201 | MT::Association->link($blog_db => $group_designers => $role_design); |
|---|
| 202 | MT::Association->link($blog_mgt => $group_designers => $role_design); |
|---|
| 203 | MT::Association->link($blog_tp => $group_designers => $role_design); |
|---|
| 204 | |
|---|
| 205 | # Test 1 -- All blogs that designers have access to |
|---|
| 206 | |
|---|
| 207 | my @blogs; |
|---|
| 208 | if (my $blog_iter = $group_designers->blog_iter()) { |
|---|
| 209 | while (my $blog = $blog_iter->()) { |
|---|
| 210 | push @blogs, $blog; |
|---|
| 211 | } |
|---|
| 212 | } |
|---|
| 213 | is(@blogs, 6); |
|---|
| 214 | |
|---|
| 215 | # Blogs Walt has access to (all, through design group) |
|---|
| 216 | |
|---|
| 217 | @blogs = (); |
|---|
| 218 | if (my $blog_iter = $user_walt->blog_iter()) { |
|---|
| 219 | while (my $blog = $blog_iter->()) { |
|---|
| 220 | push @blogs, $blog; |
|---|
| 221 | } |
|---|
| 222 | } |
|---|
| 223 | is(@blogs, 6); |
|---|
| 224 | |
|---|
| 225 | # Blogs Brad has access to (MT, Daily Build, Managers) |
|---|
| 226 | |
|---|
| 227 | @blogs = (); |
|---|
| 228 | if (my $blog_iter = $user_brad->blog_iter()) { |
|---|
| 229 | while (my $blog = $blog_iter->()) { |
|---|
| 230 | push @blogs, $blog; |
|---|
| 231 | } |
|---|
| 232 | } |
|---|
| 233 | is(@blogs, 3); |
|---|
| 234 | |
|---|
| 235 | # Blog count for Melody |
|---|
| 236 | |
|---|
| 237 | @blogs = (); |
|---|
| 238 | if (my $blog_iter = $user_melody->blog_iter()) { |
|---|
| 239 | while (my $blog = $blog_iter->()) { |
|---|
| 240 | push @blogs, $blog; |
|---|
| 241 | } |
|---|
| 242 | } |
|---|
| 243 | is(@blogs, 0); |
|---|
| 244 | |
|---|
| 245 | # Can Brad edit templates the Daily Build blog? |
|---|
| 246 | |
|---|
| 247 | ok(!$user_brad->permissions($blog_db)->can_edit_templates); |
|---|
| 248 | |
|---|
| 249 | # Can Walt edit MT templates? Yes |
|---|
| 250 | |
|---|
| 251 | ok($user_walt->permissions($blog_mt)->can_edit_templates); |
|---|
| 252 | |
|---|
| 253 | MT::Association->link($user_walt => $role_writer => $blog_mt); |
|---|
| 254 | |
|---|
| 255 | $r->reset(); |
|---|
| 256 | |
|---|
| 257 | # Can Walt write to MT? Yes |
|---|
| 258 | |
|---|
| 259 | ok($user_walt->permissions($blog_mt)->can_create_post); |
|---|
| 260 | |
|---|
| 261 | MT::Association->unlink($user_walt => $role_writer => $blog_mt); |
|---|
| 262 | |
|---|
| 263 | $r->reset(); |
|---|
| 264 | |
|---|
| 265 | # Can Walt write to MT? No |
|---|
| 266 | |
|---|
| 267 | ok(!$user_walt->permissions($blog_mt)->can_create_post); |
|---|
| 268 | |
|---|
| 269 | $group_designers->remove_user($user_walt); |
|---|
| 270 | |
|---|
| 271 | $r->reset(); |
|---|
| 272 | |
|---|
| 273 | # Can Walt edit MT templates? No |
|---|
| 274 | |
|---|
| 275 | ok(!$user_walt->permissions($blog_mt)->can_edit_templates); |
|---|
| 276 | |
|---|
| 277 | $group_designers->add_user($user_walt); |
|---|
| 278 | |
|---|
| 279 | $r->reset(); |
|---|
| 280 | |
|---|
| 281 | # Can Walt edit MT templates? Yes |
|---|
| 282 | |
|---|
| 283 | ok($user_walt->permissions($blog_mt)->can_edit_templates); |
|---|
| 284 | |
|---|
| 285 | # Disable designer group |
|---|
| 286 | |
|---|
| 287 | $group_designers->status(MT::Group::INACTIVE()); |
|---|
| 288 | $group_designers->save; |
|---|
| 289 | |
|---|
| 290 | $r->reset(); |
|---|
| 291 | |
|---|
| 292 | # Can Walt edit MT templates? No |
|---|
| 293 | |
|---|
| 294 | ok(!$user_walt->permissions($blog_mt)->can_edit_templates); |
|---|
| 295 | ok(!$user_luke->permissions($blog_vox)->can_edit_templates); |
|---|
| 296 | ok(!$user_lilia->permissions($blog_tp)->can_edit_templates); |
|---|
| 297 | |
|---|
| 298 | # Enable designer group |
|---|
| 299 | |
|---|
| 300 | $group_designers->status(MT::Group::ACTIVE()); |
|---|
| 301 | $group_designers->save; |
|---|
| 302 | |
|---|
| 303 | $r->reset(); |
|---|
| 304 | |
|---|
| 305 | # Can Walt edit MT templates? Yes |
|---|
| 306 | |
|---|
| 307 | ok($user_walt->permissions($blog_mt)->can_edit_templates); |
|---|
| 308 | ok($user_luke->permissions($blog_vox)->can_edit_templates); |
|---|
| 309 | ok($user_lilia->permissions($blog_tp)->can_edit_templates); |
|---|