diff options
author | Dave Arter <davea@mysociety.org> | 2016-10-19 13:51:19 +0100 |
---|---|---|
committer | Matthew Somerville <matthew-github@dracos.co.uk> | 2016-10-26 16:22:14 +0100 |
commit | 428466512607541a1d82de6e721439a0d0e7446c (patch) | |
tree | 97d4c9ba85670cbd4482ca16c2badb38398cb9b4 | |
parent | e1636f3c8cb837c3debe28da7532778493ebad54 (diff) |
Redirect to correct cobrand when category changed.
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin.pm | 12 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Report.pm | 12 | ||||
-rw-r--r-- | t/app/controller/report_inspect.t | 36 |
3 files changed, 46 insertions, 14 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm index 748842df5..f0a1fa95b 100644 --- a/perllib/FixMyStreet/App/Controller/Admin.pm +++ b/perllib/FixMyStreet/App/Controller/Admin.pm @@ -837,18 +837,6 @@ Handles changing a problem's category and the complexity that comes with it. sub report_edit_category : Private { my ($self, $c, $problem) = @_; - # TODO: It's possible to assign a category belonging to a district - # council, meaning a 404 when the page is reloaded because the - # problem is no longer included in the current cobrand's - # problem_restriction. - # See mysociety/fixmystreetforcouncils#44 - # We could - # a) only allow the current body's categories to be chosen, - # b) show a warning about the impending change of body - # c) bounce the user to the report page on fms.com - # Not too worried about this right now, as it forms part of a bigger - # concern outlined in the above ticket and - # mysociety/fixmystreetforcouncils#17 if ((my $category = $c->get_param('category')) ne $problem->category) { $problem->category($category); my @contacts = grep { $_->category eq $problem->category } @{$c->stash->{contacts}}; diff --git a/perllib/FixMyStreet/App/Controller/Report.pm b/perllib/FixMyStreet/App/Controller/Report.pm index f69bdc8c0..73479c584 100644 --- a/perllib/FixMyStreet/App/Controller/Report.pm +++ b/perllib/FixMyStreet/App/Controller/Report.pm @@ -390,7 +390,17 @@ sub inspect : Private { anonymous => 0, } ); } - $c->res->redirect( $c->uri_for( '/report', $problem->id ) ); + # This problem might no longer be visible on the current cobrand, + # if its body has changed (e.g. by virtue of the category changing) + # so redirect to a cobrand where it can be seen if necessary + my $redirect_uri; + if ( $c->cobrand->is_council && !$c->cobrand->owns_problem($problem) ) { + $redirect_uri = $c->cobrand->base_url_for_report( $problem ) . $problem->url; + } else { + $redirect_uri = $c->uri_for( $problem->url ); + } + $c->log->debug( "Redirecting to: " . $redirect_uri ); + $c->res->redirect( $redirect_uri ); } } }; diff --git a/t/app/controller/report_inspect.t b/t/app/controller/report_inspect.t index f2047b8e5..efb32d116 100644 --- a/t/app/controller/report_inspect.t +++ b/t/app/controller/report_inspect.t @@ -17,9 +17,15 @@ FixMyStreet::DB->resultset("ContactResponsePriority")->create({ contact => $contact, response_priority => $rp, }); +my $wodc = $mech->create_body_ok(2420, 'West Oxfordshire District Council', id => 2420); +$mech->create_contact_ok( body_id => $wodc->id, category => 'Horses', email => 'horses@example.net' ); + my ($report) = $mech->create_problems_for_body(1, $oxon->id, 'Test', { - category => 'Cows', cobrand => 'fixmystreet', areas => ',2237,' }); + category => 'Cows', cobrand => 'fixmystreet', areas => ',2237,2420', + whensent => \'current_timestamp', + latitude => 51.847693, longitude => -1.355908, +}); my $report_id = $report->id; my $user = $mech->log_in_ok('test@example.com'); @@ -127,6 +133,34 @@ FixMyStreet::override_config { }; }; +FixMyStreet::override_config { + MAPIT_URL => 'http://mapit.mysociety.org/', + ALLOWED_COBRANDS => [ 'oxfordshire', 'fixmystreet' ], + BASE_URL => 'http://fixmystreet.site', +}, sub { + subtest "test category/body changes" => sub { + $mech->host('oxfordshire.fixmystreet.site'); + $report->update({ state => 'confirmed' }); + $mech->get_ok("/report/$report_id"); + # Then change the category to the other council in this location, + # which should cause it to be resent. We clear the host because + # otherwise testing stays on host() above. + $mech->clear_host; + $mech->submit_form(button => 'save', with_fields => { category => 'Horses' }); + + $report->discard_changes; + is $report->category, "Horses", "Report in correct category"; + is $report->whensent, undef, "Report marked as unsent"; + is $report->bodies_str, $wodc->id, "Reported to WODC"; + + is $mech->uri->path, "/report/$report_id", "redirected to correct page"; + is $mech->res->code, 200, "got 200 for final destination"; + is $mech->res->previous->code, 302, "got 302 for redirect"; + # Extra check given host weirdness + is $mech->res->previous->header('Location'), "http://fixmystreet.site/report/$report_id"; + }; +}; + END { $mech->delete_body($oxon); |