import rt 3.8.7
[freeside.git] / rt / t / web / dashboards-groups.t
1 #!/usr/bin/perl -w
2 use strict;
3
4 use RT::Test tests => 40;
5 my ($baseurl, $m) = RT::Test->started_ok;
6
7 my $url = $m->rt_base_url;
8
9 # create user and queue {{{
10 my $user_obj = RT::User->new($RT::SystemUser);
11 my ($ok, $msg) = $user_obj->LoadOrCreateByEmail('customer@example.com');
12 ok($ok, 'ACL test user creation');
13 $user_obj->SetName('customer');
14 $user_obj->SetPrivileged(1);
15 ($ok, $msg) = $user_obj->SetPassword('customer');
16 $user_obj->PrincipalObj->GrantRight(Right => 'ModifySelf');
17 my $currentuser = RT::CurrentUser->new($user_obj);
18
19 my $queue = RT::Queue->new($RT::SystemUser);
20 $queue->Create(Name => 'SearchQueue'.$$);
21
22 $user_obj->PrincipalObj->GrantRight(Right => $_, Object => $queue)
23     for qw/SeeQueue ShowTicket OwnTicket/;
24
25 # grant the user all these rights so we can make sure that the group rights
26 # are checked and not these as well
27 $user_obj->PrincipalObj->GrantRight(Right => $_, Object => $RT::System)
28     for qw/SubscribeDashboard CreateOwnDashboard SeeOwnDashboard ModifyOwnDashboard DeleteOwnDashboard/;
29 # }}}
30 # create and test groups (outer < inner < user) {{{
31 my $inner_group = RT::Group->new($RT::SystemUser);
32 ($ok, $msg) = $inner_group->CreateUserDefinedGroup(Name => "inner", Description => "inner group");
33 ok($ok, "created inner group: $msg");
34
35 my $outer_group = RT::Group->new($RT::SystemUser);
36 ($ok, $msg) = $outer_group->CreateUserDefinedGroup(Name => "outer", Description => "outer group");
37 ok($ok, "created outer group: $msg");
38
39 ($ok, $msg) = $outer_group->AddMember($inner_group->PrincipalId);
40 ok($ok, "added inner as a member of outer: $msg");
41
42 ($ok, $msg) = $inner_group->AddMember($user_obj->PrincipalId);
43 ok($ok, "added user as a member of member: $msg");
44
45 ok($outer_group->HasMember($inner_group->PrincipalId), "outer has inner");
46 ok(!$outer_group->HasMember($user_obj->PrincipalId), "outer doesn't have user directly");
47 ok($outer_group->HasMemberRecursively($inner_group->PrincipalId), "outer has inner recursively");
48 ok($outer_group->HasMemberRecursively($user_obj->PrincipalId), "outer has user recursively");
49
50 ok(!$inner_group->HasMember($outer_group->PrincipalId), "inner doesn't have outer");
51 ok($inner_group->HasMember($user_obj->PrincipalId), "inner has user");
52 ok(!$inner_group->HasMemberRecursively($outer_group->PrincipalId), "inner doesn't have outer, even recursively");
53 ok($inner_group->HasMemberRecursively($user_obj->PrincipalId), "inner has user recursively");
54 # }}}
55
56 ok $m->login(customer => 'customer'), "logged in";
57
58 $m->get_ok("$url/Dashboards");
59
60 $m->follow_link_ok({text => "New"});
61 $m->form_name('ModifyDashboard');
62 is_deeply([$m->current_form->find_input('Privacy')->possible_values], ["RT::User-" . $user_obj->Id], "the only selectable privacy is user");
63 $m->content_lacks('Delete', "Delete button hidden because we are creating");
64
65 $user_obj->PrincipalObj->GrantRight(Right => 'CreateGroupDashboard', Object => $inner_group);
66
67 $m->follow_link_ok({text => "New"});
68 $m->form_name('ModifyDashboard');
69 is_deeply([$m->current_form->find_input('Privacy')->possible_values], ["RT::User-" . $user_obj->Id, "RT::Group-" . $inner_group->Id], "the only selectable privacies are user and inner group (not outer group)");
70 $m->field("Name" => 'inner dashboard');
71 $m->field("Privacy" => "RT::Group-" . $inner_group->Id);
72 $m->content_lacks('Delete', "Delete button hidden because we are creating");
73
74 $m->click_button(value => 'Create');
75 $m->content_lacks("No permission to create dashboards");
76 $m->content_contains("Saved dashboard inner dashboard");
77 $m->content_lacks('Delete', "Delete button hidden because we lack DeleteDashboard");
78
79 my $dashboard = RT::Dashboard->new($currentuser);
80 my ($id) = $m->content =~ /name="id" value="(\d+)"/;
81 ok($id, "got an ID, $id");
82 $dashboard->LoadById($id);
83 is($dashboard->Name, "inner dashboard");
84
85 is($dashboard->Privacy, 'RT::Group-' . $inner_group->Id, "correct privacy");
86 is($dashboard->PossibleHiddenSearches, 0, "all searches are visible");
87
88 $m->no_warnings_ok;
89
90 $m->get_ok("/Dashboards/Modify.html?id=$id");
91 $m->content_lacks("inner dashboard", "no SeeGroupDashboard right");
92 $m->content_contains("Permission denied");
93
94 $m->warning_like(qr/Permission denied/, "got a permission denied warning");
95
96 $user_obj->PrincipalObj->GrantRight(Right => 'SeeGroupDashboard', Object => $inner_group);
97 $m->get_ok("/Dashboards/Modify.html?id=$id");
98 $m->content_contains("inner dashboard", "we now have SeeGroupDashboard right");
99 $m->content_lacks("Permission denied");
100
101 $m->content_contains('Subscription', "Subscription link not hidden because we have SubscribeDashboard");
102