diff options
Diffstat (limited to 't/app/controller/questionnaire.t')
-rw-r--r-- | t/app/controller/questionnaire.t | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/t/app/controller/questionnaire.t b/t/app/controller/questionnaire.t new file mode 100644 index 000000000..af14332d4 --- /dev/null +++ b/t/app/controller/questionnaire.t @@ -0,0 +1,278 @@ +use strict; +use warnings; +use Test::More; + +use FixMyStreet::TestMech; +use FixMyStreet::App::Controller::Questionnaire; + +ok( my $mech = FixMyStreet::TestMech->new, 'Created mech object' ); + +# create a test user and report +$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 $report_time = '2011-03-01 12:00:00'; + +my $report = FixMyStreet::App->model('DB::Problem')->find_or_create( + { + postcode => 'EH1 1BB', + council => '2651', + areas => ',11808,135007,14419,134935,2651,20728,', + category => 'Street lighting', + title => 'Testing', + detail => 'Testing Detail', + used_map => 1, + name => $user->name, + anonymous => 0, + state => 'confirmed', + confirmed => $report_time, + lastupdate => $report_time, + whensent => '2011-03-01 12:05:00', + lang => 'en-gb', + service => '', + cobrand => 'default', + cobrand_data => '', + send_questionnaire => 1, + latitude => '55.951963', + longitude => '-3.189944', + user_id => $user->id, + } +); +my $report_id = $report->id; +ok $report, "created test report - $report_id"; + +# FIXME Should call send-questionnaires here to test that is working okay. +# For now, just generate the questionnaire etc. manually. +# Call send-questionnaires (for normal non-EHA site) +# my $email = $mech->get_email; +# ok $email, "got an email"; +# like $email->body, qr/fill in our short questionnaire/i, "got questionnaire email"; +# my ($url) = $email->body =~ m{(http://\S+)}; +# ok $url, "extracted questionnaire url '$url'"; + +$report->send_questionnaire( 0 ); +$report->update; + +my $questionnaire = FixMyStreet::App->model('DB::Questionnaire')->find_or_create( + { + problem_id => $report->id, + whensent => '2011-04-01 12:00:00', + } +); +ok $questionnaire, 'added questionnaire'; +my $token = FixMyStreet::App->model("DB::Token")->create( + { scope => 'questionnaire', data => $questionnaire->id } +); +ok $token, 'added token for questionnaire'; + +foreach my $test ( + { + desc => 'User goes to questionnaire URL with a bad token', + token_extra => 'BAD', + content => "we couldn't validate that token", + }, + { + desc => 'User goes to questionnaire URL for a now-hidden problem', + state => 'hidden', + content => "we couldn't locate your problem", + }, + { + desc => 'User goes to questionnaire URL for an already answered questionnaire', + answered => \'ms_current_timestamp()', + content => 'already answered this questionnaire', + }, +) { + subtest $test->{desc} => sub { + $report->state( $test->{state} || 'confirmed' ); + $report->update; + $questionnaire->whenanswered( $test->{answered} ); + $questionnaire->update; + (my $token = $token->token); + $token .= $test->{token_extra} if $test->{token_extra}; + $mech->get_ok("/Q/$token"); + $mech->content_contains( $test->{content} ); + # Reset, no matter what test did + $report->state( 'confirmed' ); + $report->update; + $questionnaire->whenanswered( undef ); + $questionnaire->update; + }; +} + +$mech->get_ok("/Q/" . $token->token); +$mech->title_like( qr/Questionnaire/ ); +$mech->submit_form_ok( ); +my @errors = @{ $mech->page_errors }; +ok scalar @errors, 'displayed error messages'; +is $errors[0], "Please state whether or not the problem has been fixed", 'error message'; + +foreach my $test ( + { + desc => 'Open report, has been fixed, first time reporter, no update left', + problem_state => 'confirmed', + fields => { + been_fixed => 'Yes', + reported => 'No', + }, + comment => 'Questionnaire filled in by problem reporter', + }, + { + desc => 'Open report, has been fixed, reported before, leaves an update', + problem_state => 'confirmed', + fields => { + been_fixed => 'Yes', + reported => 'Yes', + update => 'The council fixed this really quickly, thanks!', + }, + }, + { + desc => 'Open report, has not been fixed, not reported before, no update, asks for another questionnaire', + problem_state => 'confirmed', + fields => { + been_fixed => 'No', + reported => 'No', + another => 'Yes', + }, + }, + { + desc => 'Open report, unknown fixed, reported before, update, no further questionnaire', + problem_state => 'confirmed', + fields => { + been_fixed => 'Unknown', + reported => 'Yes', + update => 'This is still going on.', + # another => 'No', Error for not setting this tested below + }, + }, + { + desc => 'Fixed report, confirmed fixed, not reported before, no update', + problem_state => 'fixed', + fields => { + been_fixed => 'Yes', + reported => 'No', + }, + lastupdate_static => 1, + }, + { + desc => 'Fixed report, unknown fixed, not reported before, no update, asks for another', + problem_state => 'fixed', + fields => { + been_fixed => 'Unknown', + reported => 'No', + another => 'Yes', + }, + }, + { + desc => 'Fixed report, reopened, reported before, no update, no further questionnaire', + problem_state => 'fixed', + fields => { + been_fixed => 'No', + reported => 'Yes', + another => 'No', + # update => 'Dummy', Error for not setting this tested below + }, + }, +) { + subtest $test->{desc} => sub { + $report->state ( $test->{problem_state} ); + $report->update; + + $mech->get_ok("/Q/" . $token->token); + $mech->title_like( qr/Questionnaire/ ); + $mech->submit_form_ok( { with_fields => $test->{fields} } ); + + # If reopening, we've just submitted without an update. Should cause an error. + if ($test->{problem_state} eq 'fixed' && $test->{fields}{been_fixed} eq 'No') { + my @errors = @{ $mech->page_errors }; + ok scalar @errors, 'displayed error messages'; + is $errors[0], "Please provide some explanation as to why you're reopening this report", 'error message'; + $test->{fields}{update} = 'This has not been fixed.'; + $mech->submit_form_ok( { with_fields => $test->{fields} } ); + } + + # We forgot to say we wanted another questionnaire or not with this test + if ($test->{problem_state} eq 'confirmed' && $test->{fields}{been_fixed} eq 'Unknown') { + my @errors = @{ $mech->page_errors }; + ok scalar @errors, 'displayed error messages'; + is $errors[0], "Please indicate whether you'd like to receive another questionnaire", 'error message'; + $test->{fields}{another} = 'No'; + $mech->submit_form_ok( { with_fields => $test->{fields} } ); + } + + my $result; + $result = 'fixed' if $test->{fields}{been_fixed} eq 'Yes'; + $result = 'confirmed' if $test->{fields}{been_fixed} eq 'No'; + $result = 'unknown' if $test->{fields}{been_fixed} eq 'Unknown'; + + my $another = 0; + $another = 1 if $test->{fields}{another} && $test->{fields}{another} eq 'Yes'; + + # Check the right HTML page has been returned + $mech->content_contains( 'glad to hear it’s been fixed' ) + if $result eq 'fixed'; + $mech->content_contains( 'get some more information about the status of your problem' ) + if $result eq 'unknown'; + $mech->content_contains( "sorry to hear that" ) + if $result eq 'confirmed'; + + # Check the database has the right information + $report->discard_changes; + $questionnaire->discard_changes; + is $report->state, $result eq 'unknown' ? $test->{problem_state} : $result; + is $report->send_questionnaire, $another; + ok DateTime::Format::Pg->format_datetime( $report->lastupdate) gt $report_time, 'lastupdate changed' + unless $test->{fields}{been_fixed} eq 'Unknown' || $test->{lastupdate_static}; + is $questionnaire->old_state, $test->{problem_state}; + is $questionnaire->new_state, $result; + is $questionnaire->ever_reported, $test->{fields}{reported} eq 'Yes' ? 1 : 0; + if ($test->{fields}{update} || $test->{comment}) { + my $c = FixMyStreet::App->model("DB::Comment")->find( + { problem_id => $report->id } + ); + is $c->text, $test->{fields}{update} || $test->{comment}; + } + + # Reset questionnaire for next test + $questionnaire->old_state( undef ); + $questionnaire->new_state( undef ); + $questionnaire->ever_reported( undef ); + $questionnaire->whenanswered( undef ); + $questionnaire->update; + $report->send_questionnaire( 0 ); + $report->lastupdate( $report_time ); + $report->comments->delete; + $report->update; + }; +} + +# EHA extra checking +ok $mech->host("reportemptyhomes.com"), 'change host to reportemptyhomes'; +$mech->get_ok("/Q/" . $token->token); +$mech->content_contains( 'should have reported what they have done' ); + +# Test already answered the ever reported question, so not shown again +my $questionnaire2 = FixMyStreet::App->model('DB::Questionnaire')->find_or_create( + { + problem_id => $report->id, + whensent => '2011-03-28 12:00:00', + ever_reported => 1, + } +); +ok $questionnaire, 'added another questionnaire'; +ok $mech->host("fixmystreet.com"), 'change host to fixmystreet'; +$mech->get_ok("/Q/" . $token->token); +$mech->title_like( qr/Questionnaire/ ); +$mech->content_contains( 'Has this problem been fixed?' ); +$mech->content_lacks( 'ever reported' ); + +# EHA extra checking +ok $mech->host("reportemptyhomes.com"), 'change host to reportemptyhomes'; +$mech->get_ok("/Q/" . $token->token); +$mech->content_contains( 'made a lot of progress' ); + +$mech->delete_user('test@example.com'); +done_testing(); |