diff options
Diffstat (limited to 't/app/controller')
-rw-r--r-- | t/app/controller/area_stats.t | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/t/app/controller/area_stats.t b/t/app/controller/area_stats.t new file mode 100644 index 000000000..6ea03cabf --- /dev/null +++ b/t/app/controller/area_stats.t @@ -0,0 +1,211 @@ +use strict; +use warnings; +use Test::More; + +use FixMyStreet::TestMech; + +my $mech = FixMyStreet::TestMech->new; + +my $oxfordshire = $mech->create_body_ok(2237, 'Oxfordshire County Council'); +my $superuser = $mech->create_user_ok('superuser@example.com', name => 'Super User', is_superuser => 1); +my $oxfordshireuser = $mech->create_user_ok('counciluser@example.com', name => 'Council User', from_body => $oxfordshire); + +$mech->create_contact_ok( body_id => $oxfordshire->id, category => 'Potholes', email => 'potholes@example.com' ); +$mech->create_contact_ok( body_id => $oxfordshire->id, category => 'Traffic lights', email => 'lights@example.com' ); +$mech->create_contact_ok( body_id => $oxfordshire->id, category => 'Litter', email => 'litter@example.com' ); + +my $body_id = $oxfordshire->id; +my $area_id = '20720'; +my $alt_area_id = '20721'; + +$mech->create_problems_for_body(2, $oxfordshire->id, 'Title', { areas => ",$area_id,6753,2237,", created => \'current_timestamp', category => 'Potholes' }); +$mech->create_problems_for_body(3, $oxfordshire->id, 'Title', { areas => ",$area_id,6753,2237,", created => \'current_timestamp', category => 'Traffic lights' }); +$mech->create_problems_for_body(1, $oxfordshire->id, 'Title', { areas => ",$alt_area_id,6753,2237,", created => \'current_timestamp', category => 'Litter' }); + +my @scheduled_problems = $mech->create_problems_for_body(7, $oxfordshire->id, 'Title', { areas => ",$area_id,6753,2237,", created => \'current_timestamp', category => 'Traffic lights' }); +my @fixed_problems = $mech->create_problems_for_body(4, $oxfordshire->id, 'Title', { areas => ",$area_id,6753,2237,", created => \'current_timestamp', category => 'Potholes' }); +my @closed_problems = $mech->create_problems_for_body(3, $oxfordshire->id, 'Title', { areas => ",$area_id,6753,2237,", created => \'current_timestamp', category => 'Traffic lights' }); + +foreach my $problem (@scheduled_problems) { + $problem->update({ state => 'planned' }); + $mech->create_comment_for_problem($problem, $oxfordshireuser, 'Title', 'text', 0, 'confirmed', 'planned', { confirmed => \'current_timestamp' }); +} + +foreach my $problem (@fixed_problems) { + $problem->update({ state => 'fixed - council' }); + $mech->create_comment_for_problem($problem, $oxfordshireuser, 'Title', 'text', 0, 'confirmed', 'fixed', { confirmed => \'current_timestamp' }); +} + +foreach my $problem (@closed_problems) { + $problem->update({ state => 'closed' }); + $mech->create_comment_for_problem($problem, $oxfordshireuser, 'Title', 'text', 0, 'confirmed', 'closed', { confirmed => \'current_timestamp' }); +} + +$mech->log_in_ok( $superuser->email ); + +FixMyStreet::override_config { + MAPIT_URL => 'http://mapit.uk/', + ALLOWED_COBRANDS => [ 'oxfordshire' ], +}, sub { + subtest 'superuser gets areas listed' => sub { + $mech->create_body_ok(1234, 'Some Other Council'); + $mech->get_ok('/admin/areastats'); + $mech->content_contains('Oxfordshire County Council', 'Oxfordshire is shown on the page'); + $mech->content_contains('Some Other Council', 'Some other council is shown on the page'); + }; + + subtest 'body user sees whole body stats page' => sub { + $mech->log_in_ok( $oxfordshireuser->email ); + $mech->get_ok('/admin/areastats'); + $mech->content_contains("Area stats for Oxfordshire County Council"); + $mech->content_contains('Trowbridge'); + $mech->content_contains('Bradford-on-Avon'); + }; + + subtest 'area user can only see their area' => sub { + $oxfordshireuser->update({area_id => 20720}); + + $mech->get("/admin/areastats/$body_id"); + is $mech->status, 404, 'area user cannot see parent area'; + + $mech->get("/admin/areastats/$body_id?area=20721"); + is $mech->status, 404, 'area user cannot see another area'; + + $mech->get_ok('/admin/areastats'); + $mech->text_contains('Area 20720', 'index page displays their area to area user'); + + $oxfordshireuser->update({area_id => undef}); + }; + + subtest 'gets an area' => sub { + $mech->log_in_ok( $oxfordshireuser->email ); + $mech->get_ok("/admin/areastats/$body_id?area=20720"); + $mech->content_contains('Area 20720', 'Area name is shown on the page'); + + $mech->get('/admin/areastats/999'); + is $mech->status, 404, 'Getting a non-existent body returns 404'; + + $mech->get("/admin/areastats/$body_id/999"); + is $mech->status, 404, 'Getting a non-existent area returns 404'; + }; + + subtest 'shows correct stats for ward' => sub { + $mech->get_ok("/admin/areastats/$body_id?area=20720"); + $mech->content_contains('19 opened, 7 scheduled, 3 closed, 4 fixed'); + $mech->text_contains('Potholes2004'); + $mech->text_contains('Traffic lights3730'); + $mech->text_contains('Litter0000'); + + $mech->text_contains('Potholes6'); + $mech->text_contains('Traffic lights13'); + }; + + subtest 'shows correct stats to area user' => sub { + $oxfordshireuser->update({area_id => 20720}); + + $mech->get_ok("/admin/areastats"); + $mech->content_contains('19 opened, 7 scheduled, 3 closed, 4 fixed'); + $mech->text_contains('Potholes2004'); + $mech->text_contains('Traffic lights3730'); + $mech->text_contains('Litter0000'); + + $mech->text_contains('Potholes6'); + $mech->text_contains('Traffic lights13'); + + $oxfordshireuser->update({area_id => undef}); + }; + + subtest 'shows correct stats for ward using area param' => sub { + $mech->get_ok("/admin/areastats/$body_id?area=20720"); + $mech->content_contains('19 opened, 7 scheduled, 3 closed, 4 fixed'); + $mech->text_contains('Potholes2004'); + $mech->text_contains('Traffic lights3730'); + $mech->text_contains('Litter0000'); + + $mech->text_contains('Potholes6'); + $mech->text_contains('Traffic lights13'); + }; + + subtest 'shows correct stats for council' => sub { + $mech->get_ok("/admin/areastats/$body_id"); + $mech->content_contains('20 opened, 7 scheduled, 3 closed, 4 fixed'); + $mech->text_contains('Potholes2004'); + $mech->text_contains('Traffic lights3730'); + $mech->text_contains('Litter1000'); + + $mech->text_contains('Potholes6'); + $mech->text_contains('Traffic lights13'); + }; + + subtest 'shows average correctly' => sub { + $fixed_problems[0]->update({ confirmed => DateTime->now->subtract(days => 2) }); + $fixed_problems[1]->update({ confirmed => DateTime->now->subtract(days => 3) }); + $fixed_problems[2]->update({ confirmed => DateTime->now->subtract(days => 7) }); + $fixed_problems[3]->update({ confirmed => DateTime->now->subtract(days => 4) }); + $scheduled_problems[0]->update({ confirmed => DateTime->now->subtract(days => 2) }); + $scheduled_problems[1]->update({ confirmed => DateTime->now->subtract(days => 4) }); + $scheduled_problems[2]->update({ confirmed => DateTime->now->subtract(days => 6) }); + $scheduled_problems[3]->update({ confirmed => DateTime->now->subtract(days => 7) }); + $scheduled_problems[4]->update({ confirmed => DateTime->now->subtract(days => 1) }); + $scheduled_problems[6]->update({ confirmed => DateTime->now->subtract(days => 1) }); + $closed_problems[0]->update({ confirmed => DateTime->now->subtract(days => 6) }); + $closed_problems[1]->update({ confirmed => DateTime->now->subtract(days => 9) }); + $closed_problems[2]->update({ confirmed => DateTime->now->subtract(days => 12) }); + + $mech->get_ok("/admin/areastats/$body_id?area=20720"); + $mech->text_contains('average time between issue being opened and set to another status was 5 days'); + }; + + subtest 'shows this month stats correctly' => sub { + $fixed_problems[0]->update({ confirmed => DateTime->now->subtract(days => 50) }); + $fixed_problems[1]->update({ confirmed => DateTime->now->subtract(days => 50) }); + $scheduled_problems[1]->update({ confirmed => DateTime->now->subtract(days => 50) }); + $scheduled_problems[2]->update({ confirmed => DateTime->now->subtract(days => 50) }); + + $mech->get_ok("/admin/areastats/$body_id?area=20720"); + + $mech->content_contains('15 opened, 7 scheduled, 3 closed, 4 fixed'); + $mech->text_contains('Potholes2004'); + $mech->text_contains('Traffic lights3730'); + + $mech->text_contains('Potholes4'); + $mech->text_contains('Traffic lights11'); + + $mech->text_contains('average time between issue being opened and set to another status was 5 days'); + }; + + subtest 'ignores multiple comments with the same state' => sub { + $mech->create_comment_for_problem($scheduled_problems[0], $oxfordshireuser, 'Title', 'text', 0, 'confirmed', 'planned', { confirmed => \'current_timestamp' }); + $mech->get_ok("/admin/areastats/$body_id?area=20720"); + + $mech->content_contains('15 opened, 7 scheduled, 3 closed, 4 fixed'); + $mech->text_contains('Potholes2004'); + $mech->text_contains('Traffic lights3730'); + }; + + subtest 'average is only to first state change' => sub { + for my $i (0..4) { + $scheduled_problems[$i]->comments->first->update({ confirmed => $scheduled_problems[$i]->confirmed }); + $mech->create_comment_for_problem($scheduled_problems[$i], $oxfordshireuser, 'Title', 'text', 0, 'confirmed', 'fixed', { confirmed => \'current_timestamp' }); + } + + $mech->get_ok("/admin/areastats/$body_id?area=20720"); + $mech->text_contains('average time between issue being opened and set to another status was 4 days'); + }; + + subtest 'average only includes actual state changes' => sub { + my @probs = $mech->create_problems_for_body(2, $oxfordshire->id, 'Title', + { areas => ",$area_id,6753,2237,", created => DateTime->now->subtract(days => 12), confirmed => DateTime->now->subtract(days => 12), category => 'Potholes' }); + $mech->create_comment_for_problem($probs[0], $oxfordshireuser, 'Title', 'text', 0, 'confirmed', 'confirmed', { confirmed => \'current_timestamp' }); + + $mech->get_ok("/admin/areastats/$body_id?area=20720"); + $mech->text_contains('average time between issue being opened and set to another status was 4 days'); + }; +}; + +END { + FixMyStreet::DB->resultset('UserPlannedReport')->delete_all; + $mech->delete_user( $superuser ); + $mech->delete_user( $oxfordshireuser ); + done_testing(); +} |