aboutsummaryrefslogtreecommitdiffstats
path: root/t/app/controller/report_updates.t
diff options
context:
space:
mode:
Diffstat (limited to 't/app/controller/report_updates.t')
-rw-r--r--t/app/controller/report_updates.t841
1 files changed, 711 insertions, 130 deletions
diff --git a/t/app/controller/report_updates.t b/t/app/controller/report_updates.t
index 2c7294222..de153978b 100644
--- a/t/app/controller/report_updates.t
+++ b/t/app/controller/report_updates.t
@@ -13,15 +13,11 @@ my $mech = FixMyStreet::TestMech->new;
$mech->delete_user('commenter@example.com');
$mech->delete_user('test@example.com');
-my $user =
- FixMyStreet::App->model('DB::User')
- ->find_or_create( { email => 'test@example.com', name => 'Test User' } );
-ok $user, "created test user";
+my $user = $mech->create_user_ok('test@example.com', name => 'Test User');
-my $user2 =
- FixMyStreet::App->model('DB::User')
- ->find_or_create( { email => 'commenter@example.com', name => 'Commenter' } );
-ok $user2, "created comment user";
+my $user2 = $mech->create_user_ok('commenter@example.com', name => 'Commenter');
+
+my $body = $mech->create_body_ok(2504, 'Westminster City Council');
my $dt = DateTime->new(
year => 2011,
@@ -35,7 +31,7 @@ my $dt = DateTime->new(
my $report = FixMyStreet::App->model('DB::Problem')->find_or_create(
{
postcode => 'SW1A 1AA',
- council => '2504',
+ bodies_str => $body->id,
areas => ',105255,11806,11828,2247,2504,',
category => 'Other',
title => 'Test 2',
@@ -135,6 +131,19 @@ for my $test (
};
}
+subtest "updates displayed on report with empty bodies_str" => sub {
+ my $old_bodies_str = $report->bodies_str;
+ $report->update({ bodies_str => undef });
+ $comment->update({ problem_state => 'fixed' , mark_open => 'false', mark_fixed => 'false' });
+
+ $mech->get_ok("/report/$report_id");
+
+ my $meta = $mech->extract_update_metas;
+ is scalar @$meta, 1, 'update displayed';
+
+ $report->update({ bodies_str => $old_bodies_str });
+};
+
subtest "unconfirmed updates not displayed" => sub {
$comment->state( 'unconfirmed' );
$comment->update;
@@ -197,7 +206,9 @@ for my $test (
rznvy => '',
update => '',
name => '',
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
fixed => undef,
add_alert => 1,
may_show_name => undef,
@@ -214,7 +225,9 @@ for my $test (
rznvy => 'test',
update => '',
name => '',
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
fixed => undef,
add_alert => 1,
may_show_name => undef,
@@ -231,7 +244,9 @@ for my $test (
rznvy => 'test @ example. com',
update => '',
name => '',
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
fixed => undef,
add_alert => 1,
may_show_name => undef,
@@ -250,7 +265,9 @@ for my $test (
rznvy => 'test@EXAMPLE.COM',
update => '',
name => '',
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
fixed => undef,
add_alert => 1,
may_show_name => undef,
@@ -290,7 +307,9 @@ for my $test (
rznvy => '',
may_show_name => 1,
add_alert => 1,
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
update => '',
fixed => undef,
remember_me => undef,
@@ -314,7 +333,9 @@ for my $test (
rznvy => '',
may_show_name => 1,
add_alert => 1,
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
update => '',
fixed => undef,
remember_me => undef,
@@ -351,13 +372,14 @@ for my $test (
'submit update'
);
- $mech->content_contains('Nearly Done! Now check your email');
+ $mech->content_contains('Nearly done! Now check your email');
my $email = $mech->get_email;
- ok $email, "got an email";
- like $email->body, qr/confirm the update you/i, "Correct email text";
+ my $body = $mech->get_text_body_from_email($email);
+ like $body, qr/confirm your update on/i, "Correct email text";
- my ( $url, $url_token ) = $email->body =~ m{(http://\S+/C/)(\S+)};
+ my $url = $mech->get_link_from_email($email);
+ my ($url_token) = $url =~ m{/C/(\S+)};
ok $url, "extracted confirm url '$url'";
my $token = FixMyStreet::App->model('DB::Token')->find(
@@ -384,7 +406,7 @@ for my $test (
is $update->text, $details->{update}, 'update text';
is $add_alerts, $details->{add_alert} ? 1 : 0, 'do not sign up for alerts';
- $mech->get_ok( $url . $url_token );
+ $mech->get_ok( $url );
$mech->content_contains("/report/$report_id#update_$update_id");
my $unreg_user = FixMyStreet::App->model( 'DB::User' )->find( { email => $details->{rznvy} } );
@@ -407,24 +429,103 @@ for my $test (
$report->state('confirmed');
$report->update;
+for my $test (
+ {
+ desc => 'overriding email confirmation allows report confirmation with no email sent',
+ initial_values => {
+ name => '',
+ rznvy => '',
+ may_show_name => 1,
+ add_alert => 1,
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
+ update => '',
+ fixed => undef,
+ remember_me => undef,
+ password_register => '',
+ password_sign_in => '',
+ },
+ form_values => {
+ submit_update => 1,
+ rznvy => 'unregistered@example.com',
+ update => "update no email confirm",
+ add_alert => 1,
+ name => 'Unreg User',
+ may_show_name => undef,
+ },
+ changes => {
+ update => "Update no email confirm",
+ },
+ }
+) {
+ subtest $test->{desc} => sub {
+ my $send_confirmation_mail_override = Sub::Override->new(
+ "FixMyStreet::Cobrand::Default::never_confirm_updates",
+ sub { return 1; }
+ );
+ $mech->log_out_ok();
+ $mech->clear_emails_ok();
+
+ $mech->get_ok("/report/$report_id");
+
+ my $values = $mech->visible_form_values('updateForm');
+
+ is_deeply $values, $test->{initial_values}, 'initial form values';
+
+ $mech->submit_form_ok(
+ {
+ with_fields => $test->{form_values}
+ },
+ 'submit update'
+ );
+ $mech->content_contains("/report/$report_id");
+ $mech->get_ok("/report/$report_id");
+
+ $mech->content_contains('Test 2');
+ $mech->content_contains('Update no email confirm');
+
+ my $email = $mech->email_count_is(0);
+
+ my $update =
+ FixMyStreet::App->model('DB::Comment')->find( { problem_id => $report_id, text => 'Update no email confirm' } );
+ my $update_id = $update->id;
+
+ $mech->content_contains('name="update_' . $update_id . '"');
+
+ my $details = {
+ %{ $test->{form_values} },
+ %{ $test->{changes} }
+ };
+
+ ok $update, 'found update in database';
+ is $update->state, 'confirmed', 'update confirmed';
+ is $update->user->email, $details->{rznvy}, 'update email';
+ is $update->text, $details->{update}, 'update text';
+
+ my $unreg_user = FixMyStreet::App->model( 'DB::User' )->find( { email => $details->{rznvy} } );
+
+ ok $unreg_user, 'found user';
+
+ $mech->delete_user( $unreg_user );
+ $send_confirmation_mail_override->restore();
+ };
+}
+
subtest 'check non authority user cannot change set state' => sub {
$mech->log_in_ok( $user->email );
- $user->from_body( 0 );
+ $user->from_body( undef );
$user->update;
$mech->get_ok("/report/$report_id");
- $mech->post_ok( "/report/update", {
- submit_update => 1,
- id => $report_id,
- name => $user->name,
- may_show_name => 1,
- add_alert => undef,
- photo => '',
- update => 'this is a forbidden update',
- state => 'fixed - council',
+ $mech->submit_form_ok( {
+ form_id => 'form_update_form',
+ fields => {
+ may_show_name => 1,
+ update => 'this is a forbidden update',
+ state => 'fixed - council',
},
- 'submitted with state',
- );
+ }, 'submitted with state');
is $mech->uri->path, "/report/update", "at /report/update";
@@ -437,22 +538,18 @@ subtest 'check non authority user cannot change set state' => sub {
for my $state ( qw/unconfirmed hidden partial/ ) {
subtest "check that update cannot set state to $state" => sub {
$mech->log_in_ok( $user->email );
- $user->from_body( 2504 );
+ $user->from_body( $body->id );
$user->update;
$mech->get_ok("/report/$report_id");
- $mech->post_ok( "/report/update", {
- submit_update => 1,
- id => $report_id,
- name => $user->name,
- may_show_name => 1,
- add_alert => undef,
- photo => '',
- update => 'this is a forbidden update',
- state => $state,
+ $mech->submit_form_ok( {
+ form_id => 'form_update_form',
+ fields => {
+ may_show_name => 1,
+ update => 'this is a forbidden update',
+ state => $state,
},
- 'submitted with state',
- );
+ }, 'submitted with state');
is $mech->uri->path, "/report/update", "at /report/update";
@@ -469,96 +566,136 @@ for my $test (
fields => {
name => $user->name,
may_show_name => 1,
- add_alert => undef,
- photo => '',
update => 'Set state to investigating',
state => 'investigating',
},
state => 'investigating',
},
{
- desc => 'from authority user marks report as planned',
+ desc => 'from authority user marks report as in progress',
fields => {
name => $user->name,
may_show_name => 1,
- add_alert => undef,
- photo => '',
- update => 'Set state to planned',
- state => 'planned',
+ update => 'Set state to in progress',
+ state => 'in progress',
+ },
+ state => 'in progress',
+ },
+ {
+ desc => 'from authority user marks report as fixed',
+ fields => {
+ name => $user->name,
+ may_show_name => 1,
+ update => 'Set state to fixed',
+ state => 'fixed',
},
- state => 'planned',
+ state => 'fixed - council',
},
{
- desc => 'from authority user marks report as in progress',
+ desc => 'from authority user marks report as action scheduled',
fields => {
name => $user->name,
may_show_name => 1,
- add_alert => undef,
- photo => '',
- update => 'Set state to in progress',
- state => 'in progress',
+ update => 'Set state to action scheduled',
+ state => 'action scheduled',
},
- state => 'in progress',
+ state => 'action scheduled',
},
{
- desc => 'from authority user marks report as closed',
+ desc => 'from authority user marks report as unable to fix',
fields => {
name => $user->name,
may_show_name => 1,
- add_alert => undef,
- photo => '',
- update => 'Set state to closed',
- state => 'closed',
+ update => 'Set state to unable to fix',
+ state => 'no further action',
},
- state => 'closed',
+ state => 'unable to fix',
},
{
- desc => 'from authority user marks report as fixed',
+ desc => 'from authority user marks report as internal referral',
fields => {
name => $user->name,
may_show_name => 1,
- add_alert => undef,
- photo => '',
- update => 'Set state to fixed',
- state => 'fixed',
+ update => 'Set state to internal referral',
+ state => 'internal referral',
},
- state => 'fixed - council',
+ state => 'internal referral',
+ meta => "an internal referral",
},
{
- desc => 'from authority user marks report as confirmed',
+ desc => 'from authority user marks report as not responsible',
fields => {
name => $user->name,
may_show_name => 1,
- add_alert => undef,
- photo => '',
- update => 'Set state to confirmed',
- state => 'confirmed',
+ update => 'Set state to not responsible',
+ state => 'not responsible',
+ },
+ state => 'not responsible',
+ meta => "not the council's responsibility"
+ },
+ {
+ desc => 'from authority user marks report as duplicate',
+ fields => {
+ name => $user->name,
+ may_show_name => 1,
+ update => 'Set state to duplicate',
+ state => 'duplicate',
+ },
+ state => 'duplicate',
+ meta => 'a duplicate report',
+ },
+ {
+ desc => 'from authority user marks report as internal referral',
+ fields => {
+ name => $user->name,
+ may_show_name => 1,
+ update => 'Set state to internal referral',
+ state => 'internal referral',
},
- state => 'confirmed',
+ state => 'internal referral',
+ meta => 'an internal referral',
},
{
desc => 'from authority user marks report sent to two councils as fixed',
fields => {
name => $user->name,
may_show_name => 1,
- add_alert => undef,
- photo => '',
update => 'Set state to fixed',
state => 'fixed',
},
state => 'fixed - council',
- report_councils => '2504,2505',
+ report_bodies => $body->id . ',2505',
+ },
+ {
+ desc => 'from authority user show username for users with correct permissions',
+ fields => {
+ name => $user->name,
+ may_show_name => 1,
+ update => 'Set state to fixed',
+ state => 'fixed',
+ },
+ state => 'fixed - council',
+ report_bodies => $body->id . ',2505',
+ view_username => 1
},
) {
subtest $test->{desc} => sub {
$report->comments->delete;
- if ( $test->{ report_councils } ) {
- $report->council( $test->{ report_councils } );
+ if ( $test->{ report_bodies } ) {
+ $report->bodies_str( $test->{ report_bodies } );
$report->update;
}
$mech->log_in_ok( $user->email );
- $user->from_body( 2504 );
+
+ if ($test->{view_username}) {
+ ok $user->user_body_permissions->create({
+ body => $body,
+ permission_type => 'view_body_contribute_details'
+ }), 'Give user view_body_contribute_details permissions';
+ }
+
+ $user->from_body( $body->id );
$user->update;
$mech->get_ok("/report/$report_id");
@@ -569,6 +706,7 @@ for my $test (
},
'submit update'
);
+ $mech->get_ok("/report/$report_id");
$report->discard_changes;
my $update = $report->comments->first;
@@ -577,14 +715,22 @@ for my $test (
is $update->problem_state, $test->{state}, 'problem state set';
my $update_meta = $mech->extract_update_metas;
- # setting it to confirmed shouldn't say anything
- if ( $test->{fields}->{state} ne 'confirmed' ) {
- like $update_meta->[0], qr/marked as $test->{fields}->{state}$/, 'update meta includes state change';
+ my $meta_state = $test->{meta} || $test->{fields}->{state};
+ if ( $test->{reopened} ) {
+ like $update_meta->[0], qr/reopened$/, 'update meta says reopened';
+ } elsif ( $test->{state} eq 'duplicate' ) {
+ like $update_meta->[0], qr/closed as $meta_state$/, 'update meta includes state change';
} else {
- like $update_meta->[0], qr/reopened$/, 'update meta includes state change';
+ like $update_meta->[0], qr/marked as $meta_state$/, 'update meta includes state change';
+ }
+
+ if ($test->{view_username}) {
+ like $update_meta->[0], qr{Westminster City Council \(Test User\)}, 'update meta includes council and user name';
+ $user->user_body_permissions->delete_all;
+ } else {
+ like $update_meta->[0], qr{Westminster City Council}, 'update meta includes council name';
+ $mech->content_contains( '<strong>Westminster City Council</strong>', 'council name in bold');
}
- like $update_meta->[0], qr{Test User \(Westminster City Council\)}, 'update meta includes council name';
- $mech->content_contains( 'Test User (<strong>Westminster City Council</strong>)', 'council name in bold');
$report->discard_changes;
is $report->state, $test->{state}, 'state set';
@@ -598,7 +744,8 @@ subtest 'check meta correct for comments marked confirmed but not marked open' =
user => $user,
problem_id => $report->id,
text => 'update text',
- confirmed => DateTime->now,
+ # Subtract a day to deal with any code/db timezone difference
+ confirmed => DateTime->now( time_zone => 'local' ) - DateTime::Duration->new( days => 1 ),
problem_state => 'confirmed',
anonymous => 0,
mark_open => 0,
@@ -609,7 +756,7 @@ subtest 'check meta correct for comments marked confirmed but not marked open' =
$mech->get_ok( "/report/" . $report->id );
my $update_meta = $mech->extract_update_metas;
- like $update_meta->[0], qr/reopened$/,
+ unlike $update_meta->[0], qr/reopened$/,
'update meta does not say reopened';
$comment->update( { mark_open => 1, problem_state => undef } );
@@ -627,13 +774,170 @@ subtest 'check meta correct for comments marked confirmed but not marked open' =
unlike $update_meta->[0], qr/marked as open$/,
'update meta does not says marked as open';
unlike $update_meta->[0], qr/reopened$/, 'update meta does not say reopened';
- };
+};
+
+subtest "check first comment with no status change has no status in meta" => sub {
+ $mech->log_in_ok( $user->email );
+ $user->from_body( undef );
+ $user->update;
+
+ my $comment = $report->comments->first;
+ $comment->update( { mark_fixed => 0, problem_state => 'confirmed' } );
+
+ $mech->get_ok("/report/$report_id");
+
+ my $update_meta = $mech->extract_update_metas;
+ unlike $update_meta->[0], qr/marked as|reopened/, 'update meta does not include state change';
+};
+
+subtest "check comment with no status change has not status in meta" => sub {
+ $mech->log_in_ok( $user->email );
+ $user->from_body( undef );
+ $user->update;
+
+ my $comment = $report->comments->first;
+ $comment->update( { mark_fixed => 1, problem_state => 'fixed - council' } );
+
+ $mech->get_ok("/report/$report_id");
+
+ $mech->submit_form_ok(
+ {
+ with_fields => {
+ name => $user->name,
+ may_show_name => 1,
+ add_alert => undef,
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
+ update => 'Comment that does not change state',
+ },
+ },
+ 'submit update'
+ );
+ $mech->get_ok("/report/$report_id");
+
+ $report->discard_changes;
+ my @updates = $report->comments->all;
+ is scalar @updates, 2, 'correct number of updates';
+
+ my $update = pop @updates;
+
+ is $report->state, 'fixed - council', 'correct report state';
+ is $update->problem_state, 'fixed - council', 'correct update state';
+ my $update_meta = $mech->extract_update_metas;
+ unlike $update_meta->[1], qr/marked as/, 'update meta does not include state change';
+
+ $user->from_body( $body->id );
+ $user->update;
+
+ $mech->get_ok("/report/$report_id");
+
+ $mech->submit_form_ok(
+ {
+ with_fields => {
+ name => $user->name,
+ may_show_name => 1,
+ add_alert => undef,
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
+ update => 'Comment that sets state to investigating',
+ state => 'investigating',
+ },
+ },
+ 'submit update'
+ );
+ $mech->get_ok("/report/$report_id");
+
+ $report->discard_changes;
+ @updates = $report->comments->search(undef, { order_by => 'created' })->all;;
+
+ is scalar @updates, 3, 'correct number of updates';
+
+ $update = pop @updates;
+
+ is $report->state, 'investigating', 'correct report state';
+ is $update->problem_state, 'investigating', 'correct update state';
+ $update_meta = $mech->extract_update_metas;
+ like $update_meta->[0], qr/marked as fixed/, 'first update meta says fixed';
+ unlike $update_meta->[1], qr/marked as/, 'second update meta does not include state change';
+ like $update_meta->[2], qr/marked as investigating/, 'third update meta says investigating';
+
+ my $dt = DateTime->now( time_zone => "local" )->add( seconds => 1 );
+ $comment = FixMyStreet::App->model('DB::Comment')->find_or_create(
+ {
+ problem_id => $report_id,
+ user_id => $user->id,
+ name => 'Other User',
+ mark_fixed => 'false',
+ text => 'This is some update text',
+ state => 'confirmed',
+ confirmed => $dt->ymd . ' ' . $dt->hms,
+ anonymous => 'f',
+ }
+ );
+
+ $mech->get_ok("/report/$report_id");
+
+ $report->discard_changes;
+ @updates = $report->comments->search(undef, { order_by => 'created' })->all;;
+ is scalar @updates, 4, 'correct number of updates';
+
+ $update = pop @updates;
+
+ is $report->state, 'investigating', 'correct report state';
+ is $update->problem_state, undef, 'no update state';
+ $update_meta = $mech->extract_update_metas;
+ like $update_meta->[0], qr/marked as fixed/, 'first update meta says fixed';
+ unlike $update_meta->[1], qr/marked as/, 'second update meta does not include state change';
+ like $update_meta->[2], qr/marked as investigating/, 'third update meta says investigating';
+ unlike $update_meta->[3], qr/marked as/, 'fourth update meta has no state change';
+};
+
+subtest 'check meta correct for second comment marking as reopened' => sub {
+ $report->comments->delete;
+ my $comment = FixMyStreet::App->model('DB::Comment')->create(
+ {
+ user => $user,
+ problem_id => $report->id,
+ text => 'update text',
+ confirmed => DateTime->now( time_zone => 'local'),
+ problem_state => 'fixed - user',
+ anonymous => 0,
+ mark_open => 0,
+ mark_fixed => 1,
+ state => 'confirmed',
+ }
+ );
+
+ $mech->get_ok( "/report/" . $report->id );
+ my $update_meta = $mech->extract_update_metas;
+ like $update_meta->[0], qr/fixed$/, 'update meta says fixed';
-$user->from_body(0);
+ $comment = FixMyStreet::App->model('DB::Comment')->create(
+ {
+ user => $user,
+ problem_id => $report->id,
+ text => 'update text',
+ confirmed => DateTime->now( time_zone => 'local' ) + DateTime::Duration->new( minutes => 1 ),
+ problem_state => 'confirmed',
+ anonymous => 0,
+ mark_open => 0,
+ mark_fixed => 0,
+ state => 'confirmed',
+ }
+ );
+
+ $mech->get_ok( "/report/" . $report->id );
+ $update_meta = $mech->extract_update_metas;
+ like $update_meta->[1], qr/reopened$/, 'update meta says reopened';
+};
+
+$user->from_body(undef);
$user->update;
$report->state('confirmed');
-$report->council('2504');
+$report->bodies_str($body->id);
$report->update;
for my $test (
@@ -660,9 +964,7 @@ for my $test (
add_alert => undef,
password_sign_in => 'secret2',
},
- field_errors => [
- 'You have successfully signed in; please check and confirm your details are accurate:',
- ],
+ message => 'You have successfully signed in; please check and confirm your details are accurate:',
}
) {
subtest $test->{desc} => sub {
@@ -683,7 +985,10 @@ for my $test (
'submit update'
);
- is_deeply $mech->page_errors, $test->{field_errors}, 'check there were errors';
+ $mech->content_contains($test->{message}) if $test->{message};
+
+ is_deeply $mech->page_errors, $test->{field_errors}, 'check there were errors'
+ if $test->{field_errors};
SKIP: {
skip( "Incorrect password", 5 ) unless $test->{form_values}{password_sign_in} eq $pw;
@@ -698,7 +1003,7 @@ for my $test (
"submit good details"
);
- is $mech->uri->path, "/report/" . $report_id, "redirected to report page";
+ $mech->content_contains('Thank you for updating this issue');
$mech->email_count_is(0);
my $update = $report->comments->first;
@@ -729,7 +1034,7 @@ subtest 'submit an update for a registered user, creating update by email' => su
},
}, 'submit update' );
- $mech->content_contains('Nearly Done! Now check your email');
+ $mech->content_contains('Nearly done! Now check your email');
# No change to user yet.
$user->discard_changes;
@@ -737,10 +1042,11 @@ subtest 'submit an update for a registered user, creating update by email' => su
is $user->name, 'Mr Reg', 'name unchanged';
my $email = $mech->get_email;
- ok $email, "got an email";
- like $email->body, qr/confirm the update you/i, "Correct email text";
+ my $body = $mech->get_text_body_from_email($email);
+ like $body, qr/confirm your update on/i, "Correct email text";
- my ( $url, $url_token ) = $email->body =~ m{(http://\S+/C/)(\S+)};
+ my $url = $mech->get_link_from_email($email);
+ my ($url_token) = $url =~ m{/C/(\S+)};
ok $url, "extracted confirm url '$url'";
my $token = FixMyStreet::App->model('DB::Token')->find( {
@@ -758,7 +1064,7 @@ subtest 'submit an update for a registered user, creating update by email' => su
is $update->user->email, 'registered@example.com', 'update email';
is $update->text, 'Update from a user', 'update text';
- $mech->get_ok( $url . $url_token );
+ $mech->get_ok( $url );
$mech->content_contains("/report/$report_id#update_$update_id");
# User should have new name and password
@@ -771,6 +1077,9 @@ subtest 'submit an update for a registered user, creating update by email' => su
$mech->delete_user( $user );
};
+my $sample_file = file(__FILE__)->parent->file("sample.jpg")->stringify;
+ok -e $sample_file, "sample file $sample_file exists";
+
for my $test (
{
desc => 'submit update for registered user',
@@ -778,7 +1087,9 @@ for my $test (
name => 'Test User',
may_show_name => 1,
add_alert => 1,
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
update => '',
fixed => undef,
},
@@ -788,6 +1099,7 @@ for my $test (
update => 'update from a registered user',
add_alert => undef,
fixed => undef,
+ photo1 => [ [ $sample_file, undef, Content_Type => 'image/jpeg' ], 1 ],
},
changed => {
update => 'Update from a registered user'
@@ -803,7 +1115,9 @@ for my $test (
name => 'Test User',
may_show_name => 1,
add_alert => 1,
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
update => '',
fixed => undef,
},
@@ -829,7 +1143,9 @@ for my $test (
name => 'Test User',
may_show_name => 1,
add_alert => 1,
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
update => '',
fixed => undef,
},
@@ -854,7 +1170,9 @@ for my $test (
name => 'Commenter',
may_show_name => 1,
add_alert => 1,
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
update => '',
fixed => undef,
},
@@ -879,7 +1197,9 @@ for my $test (
name => 'Commenter',
may_show_name => 1,
add_alert => 1,
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
update => '',
},
email => 'commenter@example.com',
@@ -928,7 +1248,14 @@ for my $test (
'submit update'
);
- is $mech->uri->path, "/report/" . $report_id, "redirected to report page";
+ $mech->content_contains('Thank you for updating this issue');
+ $mech->content_contains("/report/" . $report_id);
+ $mech->get_ok("/report/" . $report_id);
+
+ my $update = $report->comments->first;
+ ok $update, 'found update';
+
+ $mech->content_contains("/photo/c/" . $update->id . ".0.jpeg") if $test->{fields}->{photo1};
if ( !defined( $test->{endstate_banner} ) ) {
is $mech->extract_problem_banner->{text}, undef, 'endstate banner';
@@ -943,8 +1270,6 @@ for my $test (
%{ $test->{changed} },
};
- my $update = $report->comments->first;
- ok $update, 'found update';
is $update->text, $results->{update}, 'update text';
is $update->user->email, $test->{email}, 'update user';
is $update->state, 'confirmed', 'update confirmed';
@@ -965,7 +1290,9 @@ foreach my $test (
name => 'Test User',
may_show_name => 1,
add_alert => 1,
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
update => '',
fixed => undef,
},
@@ -982,7 +1309,6 @@ foreach my $test (
alert => 1, # we signed up for alerts before, do not unsign us
anonymous => 0,
answered => 0,
- path => '/report/update',
content =>
"Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?",
},
@@ -992,7 +1318,9 @@ foreach my $test (
name => 'Test User',
may_show_name => 1,
add_alert => 1,
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
update => '',
fixed => undef,
},
@@ -1009,7 +1337,6 @@ foreach my $test (
alert => 1, # we signed up for alerts before, do not unsign us
anonymous => 0,
answered => 0,
- path => '/report/update',
content =>
"Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?",
},
@@ -1020,7 +1347,9 @@ foreach my $test (
name => 'Test User',
may_show_name => 1,
add_alert => 1,
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
update => '',
fixed => undef,
},
@@ -1037,7 +1366,6 @@ foreach my $test (
alert => 1, # we signed up for alerts before, do not unsign us
anonymous => 0,
answered => 1,
- path => '/report/' . $report->id,
content => $report->title,
},
)
@@ -1062,7 +1390,7 @@ foreach my $test (
{
problem_id => $report_id,
ever_reported => 'y',
- whensent => \'ms_current_timestamp()',
+ whensent => \'current_timestamp',
}
);
@@ -1090,7 +1418,7 @@ foreach my $test (
$mech->submit_form_ok( { with_fields => $test->{fields}, },
'submit update' );
- is $mech->uri->path, $test->{path}, "page after submission";
+ is $mech->uri->path, '/report/update', "page after submission";
$mech->content_contains( $test->{content} );
@@ -1120,7 +1448,8 @@ foreach my $test (
$mech->submit_form_ok( { with_fields => { reported => 'Yes' } } );
- $mech->content_contains( 'Thank you &mdash; you can' );
+ $mech->content_contains( $report->title );
+ $mech->content_contains( 'Thank you for updating this issue' );
$questionnaire = FixMyStreet::App->model( 'DB::Questionnaire' )->find(
{ problem_id => $report_id }
@@ -1179,7 +1508,7 @@ for my $test (
anonymous => 0,
answered => 1,
path => '/report/update',
- content => "You have successfully confirmed your update",
+ content => "Thank you for updating this issue",
},
)
{
@@ -1203,7 +1532,7 @@ for my $test (
{
problem_id => $report_id,
ever_reported => 'y',
- whensent => \'ms_current_timestamp()',
+ whensent => \'current_timestamp',
}
);
@@ -1228,8 +1557,6 @@ for my $test (
$mech->content_contains( 'Now check your email' );
- $mech->email_count_is(1);
-
my $results = { %{ $test->{fields} }, %{ $test->{changed} }, };
my $update = $report->comments->first;
@@ -1240,10 +1567,11 @@ for my $test (
is $update->anonymous, $test->{anonymous}, 'user anonymous';
my $email = $mech->get_email;
- ok $email, "got an email";
- like $email->body, qr/confirm the update you/i, "Correct email text";
+ my $body = $mech->get_text_body_from_email($email);
+ like $body, qr/confirm your update on/i, "Correct email text";
- my ( $url, $url_token ) = $email->body =~ m{(http://\S+/C/)(\S+)};
+ my $url = $mech->get_link_from_email($email);
+ my ($url_token) = $url =~ m{/C/(\S+)};
ok $url, "extracted confirm url '$url'";
my $token = FixMyStreet::App->model('DB::Token')->find(
@@ -1269,7 +1597,8 @@ for my $test (
$mech->submit_form_ok( { with_fields => { reported => 'Yes' } } );
- $mech->content_contains( 'Thank you &mdash; you can' );
+ $mech->content_contains( $report->title );
+ $mech->content_contains( 'Thank you for updating this issue' );
$questionnaire = FixMyStreet::App->model( 'DB::Questionnaire' )->find(
{ problem_id => $report_id }
@@ -1286,10 +1615,261 @@ for my $test (
};
}
+for my $test (
+ {
+ desc => 'update confirmed without marking as fixed leaves state unchanged',
+ initial_state => 'confirmed',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 0,
+ },
+ end_state => 'confirmed',
+ },
+ {
+ desc => 'update investigating without marking as fixed leaves state unchanged',
+ initial_state => 'investigating',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 0,
+ },
+ end_state => 'investigating',
+ },
+ {
+ desc => 'update in progress without marking as fixed leaves state unchanged',
+ initial_state => 'in progress',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 0,
+ },
+ end_state => 'in progress',
+ },
+ {
+ desc => 'update action scheduled without marking as fixed leaves state unchanged',
+ initial_state => 'action scheduled',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 0,
+ },
+ end_state => 'action scheduled',
+ },
+ {
+ desc => 'update fixed without marking as open leaves state unchanged',
+ initial_state => 'fixed',
+ expected_form_fields => {
+ reopen => undef,
+ },
+ submitted_form_fields => {
+ reopen => 0,
+ },
+ end_state => 'fixed',
+ },
+ {
+ desc => 'update unable to fix without marking as fixed leaves state unchanged',
+ initial_state => 'unable to fix',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 0,
+ },
+ end_state => 'unable to fix',
+ },
+ {
+ desc => 'update internal referral without marking as fixed leaves state unchanged',
+ initial_state => 'internal referral',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 0,
+ },
+ end_state => 'internal referral',
+ },
+ {
+ desc => 'update not responsible without marking as fixed leaves state unchanged',
+ initial_state => 'not responsible',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 0,
+ },
+ end_state => 'not responsible',
+ },
+ {
+ desc => 'update duplicate without marking as fixed leaves state unchanged',
+ initial_state => 'duplicate',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 0,
+ },
+ end_state => 'duplicate',
+ },
+ {
+ desc => 'can mark confirmed as fixed',
+ initial_state => 'confirmed',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 1,
+ },
+ end_state => 'fixed - user',
+ },
+ {
+ desc => 'can mark investigating as fixed',
+ initial_state => 'investigating',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 1,
+ },
+ end_state => 'fixed - user',
+ },
+ {
+ desc => 'can mark in progress as fixed',
+ initial_state => 'in progress',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 1,
+ },
+ end_state => 'fixed - user',
+ },
+ {
+ desc => 'can mark action scheduled as fixed',
+ initial_state => 'action scheduled',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 1,
+ },
+ end_state => 'fixed - user',
+ },
+ {
+ desc => 'cannot mark fixed as fixed, can mark as not fixed',
+ initial_state => 'fixed',
+ expected_form_fields => {
+ reopen => undef,
+ },
+ submitted_form_fields => {
+ reopen => 1,
+ },
+ end_state => 'confirmed',
+ },
+ {
+ desc => 'can mark unable to fix as fixed, cannot mark not closed',
+ initial_state => 'unable to fix',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 1,
+ },
+ end_state => 'fixed - user',
+ },
+ {
+ desc => 'can mark internal referral as fixed, cannot mark not closed',
+ initial_state => 'internal referral',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 1,
+ },
+ end_state => 'fixed - user',
+ },
+ {
+ desc => 'can mark not responsible as fixed, cannot mark not closed',
+ initial_state => 'not responsible',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 1,
+ },
+ end_state => 'fixed - user',
+ },
+ {
+ desc => 'can mark duplicate as fixed, cannot mark not closed',
+ initial_state => 'duplicate',
+ expected_form_fields => {
+ fixed => undef,
+ },
+ submitted_form_fields => {
+ fixed => 1,
+ },
+ end_state => 'fixed - user',
+ },
+) {
+ subtest $test->{desc} => sub {
+ $mech->log_in_ok( $report->user->email );
+
+ my %standard_fields = (
+ name => $report->user->name,
+ update => 'update text',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
+ may_show_name => 1,
+ add_alert => 1,
+ );
+
+ my %expected_fields = (
+ %standard_fields,
+ %{ $test->{expected_form_fields} },
+ update => '',
+ );
+
+ my %submitted_fields = (
+ %standard_fields,
+ %{ $test->{submitted_form_fields} },
+ );
+
+ # clear out comments for this problem to make
+ # checking details easier later
+ ok( $_->delete, 'deleted comment ' . $_->id ) for $report->comments;
+
+ $report->discard_changes;
+ $report->state($test->{initial_state});
+ $report->update;
+
+ $mech->get_ok("/report/$report_id");
+
+ my $values = $mech->visible_form_values('updateForm');
+ is_deeply $values, \%expected_fields, 'correct form fields present';
+
+ if ( $test->{submitted_form_fields} ) {
+ $mech->submit_form_ok( {
+ with_fields => \%submitted_fields
+ },
+ 'submit update'
+ );
+
+ $report->discard_changes;
+ is $report->state, $test->{end_state}, 'update sets correct report state';
+ }
+ };
+}
+
subtest 'check have to be logged in for creator fixed questionnaire' => sub {
$mech->log_out_ok();
- $mech->get_ok( "/questionnaire/submit?problem=$report_id&reported=Yes" );
+ $mech->get( "/questionnaire/submit?problem=$report_id&reported=Yes" );
+ is $mech->res->code, 400, "got 400";
$mech->content_contains( "I'm afraid we couldn't locate your problem in the database." )
};
@@ -1298,7 +1878,8 @@ subtest 'check cannot answer other user\'s creator fixed questionnaire' => sub {
$mech->log_out_ok();
$mech->log_in_ok( $user2->email );
- $mech->get_ok( "/questionnaire/submit?problem=$report_id&reported=Yes" );
+ $mech->get( "/questionnaire/submit?problem=$report_id&reported=Yes" );
+ is $mech->res->code, 400, "got 400";
$mech->content_contains( "I'm afraid we couldn't locate your problem in the database." )
};