aboutsummaryrefslogtreecommitdiffstats
path: root/t/app/controller
diff options
context:
space:
mode:
authorMatthew Somerville <matthew-github@dracos.co.uk>2019-05-29 09:23:25 +0100
committerMatthew Somerville <matthew-github@dracos.co.uk>2019-05-29 09:23:25 +0100
commitf5b647053043afe0de18db327ea9ae4b6665daf2 (patch)
tree0a70171cd4975a4b1f45d42529922cb8f9b19b7b /t/app/controller
parent0ed870721f4d257a71d929f73b6f4be80a5afe01 (diff)
parent4b88125da243aba9ad9754619c53cd5c50512c6d (diff)
Merge branch 'roles'
Diffstat (limited to 't/app/controller')
-rw-r--r--t/app/controller/admin/roles.t132
-rw-r--r--t/app/controller/admin/users.t33
-rw-r--r--t/app/controller/admin/users_import.t34
3 files changed, 196 insertions, 3 deletions
diff --git a/t/app/controller/admin/roles.t b/t/app/controller/admin/roles.t
new file mode 100644
index 000000000..6dd40cbb6
--- /dev/null
+++ b/t/app/controller/admin/roles.t
@@ -0,0 +1,132 @@
+use FixMyStreet::TestMech;
+
+my $mech = FixMyStreet::TestMech->new;
+
+my $superuser = $mech->create_user_ok('superuser@example.com', name => 'Super User', is_superuser => 1);
+
+my $body = $mech->create_body_ok(2237, 'Oxfordshire County Council');
+my $body2 = $mech->create_body_ok(2482, 'Bromley Council');
+my $editor = $mech->create_user_ok('counciluser@example.com', name => 'Council User', from_body => $body);
+my $user = $mech->create_user_ok('staffuser@example.com', name => 'Other Council User', from_body => $body);
+
+$editor->user_body_permissions->create({
+ body => $body,
+ permission_type => 'user_edit',
+});
+$editor->user_body_permissions->create({
+ body => $body,
+ permission_type => 'user_manage_permissions',
+});
+$user->user_body_permissions->create({
+ body => $body,
+ permission_type => 'report_edit_priority',
+});
+
+FixMyStreet::DB->resultset("Role")->create({
+ body => $body,
+ name => 'Role A',
+ permissions => ['moderate', 'user_edit'],
+});
+FixMyStreet::DB->resultset("Role")->create({
+ body => $body2,
+ name => 'Role Z',
+ permissions => ['report_inspect', 'planned_reports'],
+});
+
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => 'oxfordshire',
+ MAPIT_URL => 'http://mapit.uk',
+}, sub {
+
+ $mech->log_in_ok( $editor->email );
+
+ subtest 'role index page' => sub {
+ $mech->get_ok("/admin/roles");
+ $mech->content_contains('Role A');
+ $mech->content_contains('Moderate report details');
+ $mech->content_lacks('Role Z');
+ $mech->content_lacks('Manage shortlist');
+ $mech->content_lacks('Add/edit response templates'); # About to be added
+ };
+
+ subtest 'create a role' => sub {
+ $mech->follow_link_ok({ text => 'Create' });
+ $mech->content_lacks('Body');
+ $mech->submit_form_ok({ with_fields => { name => 'Role A' }});
+ $mech->content_contains('Role names must be unique');
+ $mech->submit_form_ok({ with_fields => {
+ name => 'Role B',
+ permissions => [ ['template_edit', 'user_manage_permissions'] ],
+ }});
+
+ $mech->content_contains('Role B');
+ $mech->content_contains('Add/edit response templates');
+ };
+
+ subtest 'editing a role preselects correct options' => sub {
+ $mech->follow_link_ok({ text => 'Edit' });
+ $mech->content_like(qr/value="moderate"[^>]*checked/);
+ $mech->content_like(qr/value="user_edit"[^>]*checked/);
+ };
+
+ subtest 'editing a role to same name as another fails' => sub {
+ $mech->submit_form_ok({ with_fields => { name => 'Role B' }});
+ $mech->content_contains('Role names must be unique');
+ };
+
+ subtest 'delete a role' => sub {
+ $mech->submit_form_ok({ button => 'delete_role' });
+ $mech->content_lacks('Role A');
+ };
+
+ subtest 'assign a user to a role' => sub {
+ $mech->get_ok('/admin/users/' . $user->id);
+ $mech->content_contains('Role B');
+ $mech->content_lacks('Role Z');
+ $mech->submit_form_ok({ with_fields => {
+ roles => 'Role B',
+ }});
+ $mech->content_like(qr/<option[^>]*selected>Role B/);
+ $mech->content_like(qr/<input[^>]*checkbox[^>]*template_edit[^>]*checked/);
+ is $user->roles->count, 1, 'in one role';
+ is $user->user_body_permissions->count, 0, 'permissions removed';
+ };
+
+ subtest 'check user has the permissions of the role' => sub {
+ $mech->log_in_ok($user->email);
+ $mech->get_ok('/admin/templates');
+ };
+
+ subtest 'remove user from role' => sub {
+ $mech->log_in_ok( $editor->email );
+ $mech->get_ok('/admin/users/' . $user->id);
+ $mech->submit_form_ok({ with_fields => {
+ roles => undef,
+ }}, 'remove role');
+ };
+};
+
+subtest 'superuser can see all bodies' => sub {
+ $mech->log_in_ok( $superuser->email );
+
+ $mech->get_ok("/admin/roles");
+ $mech->content_contains('Oxfordshire');
+ $mech->content_contains('Bromley');
+ $mech->content_contains('Role B');
+ $mech->content_contains('Role Z');
+ $mech->follow_link_ok({ text => 'Create' });
+ $mech->content_contains('Body');
+ $mech->content_contains('Bromley');
+
+ $mech->submit_form_ok({ with_fields => { body => $body->id, name => 'Role B' }});
+ $mech->content_contains('Role names must be unique');
+
+ $mech->submit_form_ok({ with_fields => {
+ name => 'Role C',
+ body => $body2->id,
+ permissions => 'contribute_as_body',
+ }});
+ $mech->content_contains('Role C');
+};
+
+done_testing();
diff --git a/t/app/controller/admin/users.t b/t/app/controller/admin/users.t
index e2c922a23..ce29a5f7c 100644
--- a/t/app/controller/admin/users.t
+++ b/t/app/controller/admin/users.t
@@ -60,6 +60,7 @@ subtest 'show flagged entries' => sub {
$user->update;
};
+my $role;
subtest 'user search' => sub {
$mech->get_ok('/admin/users');
$mech->get_ok('/admin/users?search=' . $user->name);
@@ -74,8 +75,25 @@ subtest 'user search' => sub {
$user->from_body($haringey->id);
$user->update;
+ $role = $user->roles->create({
+ body => $haringey,
+ name => 'Role A',
+ permissions => ['moderate', 'user_edit'],
+ });
+ $user->add_to_roles($role);
$mech->get_ok('/admin/users?search=' . $haringey->id );
- $mech->content_contains('Haringey');
+ $mech->content_contains('test@example.com');
+ $mech->get_ok('/admin/users?role=' . $role->id);
+ $mech->content_contains('selected>Role A');
+ $mech->content_contains('test@example.com');
+};
+
+subtest 'user assign role' => sub {
+ $user->remove_from_roles($role);
+ is $user->roles->count, 0;
+ $mech->get_ok('/admin/users');
+ $mech->submit_form_ok({ with_fields => { uid => $user->id, roles => $role->id } });
+ is $user->roles->count, 1;
};
subtest 'search does not show user from another council' => sub {
@@ -157,6 +175,7 @@ for my $test (
subtest $test->{desc} => sub {
$mech->get_ok('/admin/users');
$mech->submit_form_ok( { with_fields => $test->{fields} } );
+ $mech->content_contains('Norman') if $test->{fields}{name};
if ($test->{error}) {
$mech->content_contains($_) for @{$test->{error}};
} else {
@@ -166,7 +185,7 @@ for my $test (
}
my %default_perms = (
- "permissions[moderate]" => undef,
+ "permissions[moderate]" => 'on',
"permissions[planned_reports]" => undef,
"permissions[report_mark_private]" => undef,
"permissions[report_edit]" => undef,
@@ -180,7 +199,7 @@ my %default_perms = (
"permissions[contribute_as_body]" => undef,
"permissions[default_to_body]" => undef,
"permissions[view_body_contribute_details]" => undef,
- "permissions[user_edit]" => undef,
+ "permissions[user_edit]" => 'on',
"permissions[user_manage_permissions]" => undef,
"permissions[user_assign_body]" => undef,
"permissions[user_assign_areas]" => undef,
@@ -211,6 +230,7 @@ FixMyStreet::override_config {
is_superuser => undef,
area_ids => undef,
%default_perms,
+ roles => $role->id,
},
changes => {
name => 'Changed User',
@@ -231,6 +251,7 @@ FixMyStreet::override_config {
is_superuser => undef,
area_ids => undef,
%default_perms,
+ roles => $role->id,
},
changes => {
email => 'changed@example.com',
@@ -251,10 +272,14 @@ FixMyStreet::override_config {
is_superuser => undef,
area_ids => undef,
%default_perms,
+ roles => $role->id,
},
changes => {
body => $southend->id,
},
+ removed => [
+ 'roles',
+ ],
log_count => 3,
log_entries => [qw/edit edit edit/],
},
@@ -339,6 +364,8 @@ FixMyStreet::override_config {
},
added => {
%default_perms,
+ 'permissions[moderate]' => undef,
+ 'permissions[user_edit]' => undef,
},
log_count => 5,
log_entries => [qw/edit edit edit edit edit/],
diff --git a/t/app/controller/admin/users_import.t b/t/app/controller/admin/users_import.t
new file mode 100644
index 000000000..df8884797
--- /dev/null
+++ b/t/app/controller/admin/users_import.t
@@ -0,0 +1,34 @@
+use FixMyStreet::TestMech;
+
+my $mech = FixMyStreet::TestMech->new;
+
+my $superuser = $mech->create_user_ok('superuser@example.com', name => 'Super User', is_superuser => 1);
+my $body = $mech->create_body_ok(2509, 'Haringey Borough Council');
+
+$mech->log_in_ok( $superuser->email );
+
+my $body_id = $body->id;
+my $csv = <<EOF;
+name,email,from_body,permissions,roles
+Adrian,adrian\@example.org,$body_id,moderate:user_edit,
+Belinda,belinda\@example.org,$body_id,,Customer Service
+EOF
+
+FixMyStreet::DB->resultset("Role")->create({
+ body => $body,
+ name => 'Customer Service',
+});
+
+subtest 'import CSV file' => sub {
+ $mech->get_ok('/admin/users/import');
+ $mech->submit_form_ok({ with_fields => {
+ csvfile => [ [ undef, 'foo.csv', Content => $csv ], 1],
+ }});
+ $mech->content_contains('Created 2 new users');
+ my $a = FixMyStreet::DB->resultset("User")->find({ email => 'adrian@example.org' });
+ is $a->user_body_permissions->count, 2;
+ my $b = FixMyStreet::DB->resultset("User")->find({ email => 'belinda@example.org' });
+ is $b->roles->count, 1;
+};
+
+done_testing();