diff options
-rw-r--r-- | perllib/FixMyStreet/Cobrand/Bromley.pm | 3 | ||||
-rw-r--r-- | perllib/FixMyStreet/Cobrand/TfL.pm | 28 | ||||
-rw-r--r-- | perllib/FixMyStreet/Cobrand/UK.pm | 9 | ||||
-rw-r--r-- | t/cobrand/tfl.t | 174 |
4 files changed, 214 insertions, 0 deletions
diff --git a/perllib/FixMyStreet/Cobrand/Bromley.pm b/perllib/FixMyStreet/Cobrand/Bromley.pm index 29ff4393f..854f6da89 100644 --- a/perllib/FixMyStreet/Cobrand/Bromley.pm +++ b/perllib/FixMyStreet/Cobrand/Bromley.pm @@ -30,6 +30,9 @@ sub report_validation { sub report_new_munge_before_insert { my ($self, $report) = @_; + # Make sure TfL reports are marked safety critical + $self->SUPER::report_new_munge_before_insert($report); + $report->subcategory($report->get_extra_field_value('service_sub_code')); } diff --git a/perllib/FixMyStreet/Cobrand/TfL.pm b/perllib/FixMyStreet/Cobrand/TfL.pm index ececa1184..846e1e776 100644 --- a/perllib/FixMyStreet/Cobrand/TfL.pm +++ b/perllib/FixMyStreet/Cobrand/TfL.pm @@ -160,4 +160,32 @@ sub update_email_shortlisted_user { } } +sub report_new_munge_before_insert { + my ($self, $report) = @_; + + # Sets the safety critical flag on this report according to category/extra + # fields selected. + + my $safety_critical = 0; + my $categories = $self->feature('safety_critical_categories'); + my $category = $categories->{$report->category}; + if ( ref $category eq 'HASH' ) { + # report is safety critical if any of its field values match + # the critical values from the config + for my $code (keys %$category) { + my $value = $report->get_extra_field_value($code); + my %critical_values = map { $_ => 1 } @{ $category->{$code} }; + $safety_critical ||= $critical_values{$value}; + } + } elsif ($category) { + # the entire category is safety critical + $safety_critical = 1; + } + + my $extra = $report->get_extra_fields; + @$extra = grep { $_->{name} ne 'safety_critical' } @$extra; + push @$extra, { name => 'safety_critical', value => $safety_critical ? 'yes' : 'no' }; + $report->set_extra_fields(@$extra); +} + 1; diff --git a/perllib/FixMyStreet/Cobrand/UK.pm b/perllib/FixMyStreet/Cobrand/UK.pm index 83df590db..2054b5df6 100644 --- a/perllib/FixMyStreet/Cobrand/UK.pm +++ b/perllib/FixMyStreet/Cobrand/UK.pm @@ -413,4 +413,13 @@ sub category_extra_hidden { return $self->SUPER::category_extra_hidden($meta); } +sub report_new_munge_before_insert { + my ($self, $report) = @_; + + if ($report->to_body_named('TfL')) { + my $tfl = FixMyStreet::Cobrand->get_class_for_moniker('tfl')->new(); + $tfl->report_new_munge_before_insert($report); + } +} + 1; diff --git a/t/cobrand/tfl.t b/t/cobrand/tfl.t index 1c3b7e25b..24305727b 100644 --- a/t/cobrand/tfl.t +++ b/t/cobrand/tfl.t @@ -35,6 +35,90 @@ my $contact2 = $mech->create_contact_ok( category => 'Traffic lights', email => 'trafficlights@example.com', ); +$contact2->set_extra_fields({ + code => "safety_critical", + description => "Safety critical", + automated => "hidden_field", + order => 1, + datatype => "singlevaluelist", + values => [ + { + name => "Yes", + key => "yes" + }, + { + name => "No", + key => "no" + } + ] +}); +$contact2->update; +my $contact3 = $mech->create_contact_ok( + body_id => $body->id, + category => 'Pothole', + email => 'pothole@example.com', +); +$contact3->set_extra_fields({ + code => "safety_critical", + description => "Safety critical", + automated => "hidden_field", + order => 1, + datatype => "singlevaluelist", + values => [ + { + name => "Yes", + key => "yes" + }, + { + name => "No", + key => "no" + } + ] +}); +$contact3->update; +my $contact4 = $mech->create_contact_ok( + body_id => $body->id, + category => 'Flooding', + email => 'flooding@example.com', +); +$contact4->set_extra_fields( + { + code => "safety_critical", + description => "Safety critical", + automated => "hidden_field", + order => 1, + datatype => "singlevaluelist", + values => [ + { + name => "Yes", + key => "yes" + }, + { + name => "No", + key => "no" + } + ] + }, + { + code => "location", + description => "Where is the flooding?", + variable => "true", + order => 1, + required => "true", + datatype => "singlevaluelist", + values => [ + { + name => "Carriageway", + key => "carriageway" + }, + { + name => "Footway", + key => "footway" + } + ] + } +); +$contact4->update; FixMyStreet::override_config { ALLOWED_COBRANDS => 'tfl', @@ -200,6 +284,96 @@ subtest 'Bromley staff cannot access TfL admin' => sub { }; FixMyStreet::override_config { + ALLOWED_COBRANDS => [ 'tfl', 'bromley', 'fixmystreet' ], + MAPIT_URL => 'http://mapit.uk/', + COBRAND_FEATURES => { + internal_ips => { tfl => [ '127.0.0.1' ] }, + safety_critical_categories => { tfl => { + Pothole => 1, + Flooding => { + location => [ "carriageway" ], + }, + } }, + }, +}, sub { + +for my $host ( 'tfl.fixmystreet.com', 'www.fixmystreet.com', 'bromley.fixmystreet.com' ) { + for my $test ( + { + name => "test non-safety critical category", + safety_critical => 'no', + category => "Traffic lights" + }, + { + name => "test safety critical category", + safety_critical => 'yes', + category => "Pothole" + }, + { + name => "test category extra field - safety critical", + safety_critical => 'yes', + category => "Flooding", + extra_fields => { + location => "carriageway", + } + }, + { + name => "test category extra field - non-safety critical", + safety_critical => 'no', + category => "Flooding", + extra_fields => { + location => "footway", + } + }, + ) { + subtest $test->{name} . ' on ' . $host => sub { + $mech->log_in_ok( $user->email ); + $mech->host($host); + $mech->get_ok('/around'); + $mech->submit_form_ok( { with_fields => { pc => 'BR1 3UH', } }, "submit location" ); + $mech->follow_link_ok( { text_regex => qr/skip this step/i, }, "follow 'skip this step' link" ); + $mech->submit_form_ok( + { + with_fields => { + category => $test->{category} + }, + button => 'submit_category_part_only', + } + ); + $mech->submit_form_ok( + { + with_fields => { + title => 'Test Report', + detail => 'Test report details.', + may_show_name => '1', + category => $test->{category}, + %{ $test->{extra_fields} || {} }, + $host eq 'bromley.fixmystreet.com' ? ( + fms_extra_title => 'DR', + first_name => "Joe", + last_name => "Bloggs", + ) : ( + name => 'Joe Bloggs', + ), + } + }, + "submit report form" + ); + + my $report = FixMyStreet::App->model('DB::Problem')->to_body( $body->id )->search(undef, { + order_by => { -desc => 'id' }, + })->first; + ok $report, "Found the report"; + + is $report->get_extra_field_value('safety_critical'), $test->{safety_critical}, "safety critical flag set to " . $test->{safety_critical}; + + $mech->log_out_ok; + }; + } +} +}; + +FixMyStreet::override_config { ALLOWED_COBRANDS => 'tfl', MAPIT_URL => 'http://mapit.uk/', COBRAND_FEATURES => { internal_ips => { tfl => [ '127.0.0.1' ] } }, |