aboutsummaryrefslogtreecommitdiffstats
path: root/t/cobrand
diff options
context:
space:
mode:
Diffstat (limited to 't/cobrand')
-rw-r--r--t/cobrand/bromley.t42
-rw-r--r--t/cobrand/councils.t10
-rw-r--r--t/cobrand/fixmybarangay.t21
-rw-r--r--t/cobrand/get_body_sender.t13
-rw-r--r--t/cobrand/hart.t16
-rw-r--r--t/cobrand/loading.t103
-rw-r--r--t/cobrand/zurich.t643
7 files changed, 691 insertions, 157 deletions
diff --git a/t/cobrand/bromley.t b/t/cobrand/bromley.t
new file mode 100644
index 000000000..91a7038ec
--- /dev/null
+++ b/t/cobrand/bromley.t
@@ -0,0 +1,42 @@
+use strict;
+use warnings;
+use Test::More;
+
+use FixMyStreet::TestMech;
+my $mech = FixMyStreet::TestMech->new;
+
+# Create test data
+my $user = $mech->create_user_ok( 'bromley@example.com' );
+my $body = $mech->create_body_ok( 2482, 'Bromley' );
+
+my @reports = $mech->create_problems_for_body( 1, 2482, 'Test', {
+ cobrand => 'bromley',
+ user => $user,
+});
+my $report = $reports[0];
+
+for my $update ('in progress', 'unable to fix') {
+ FixMyStreet::App->model('DB::Comment')->find_or_create( {
+ problem_state => $update,
+ problem_id => $report->id,
+ user_id => $user->id,
+ name => 'User',
+ mark_fixed => 'f',
+ text => "This update marks it as $update",
+ state => 'confirmed',
+ confirmed => 'now()',
+ anonymous => 'f',
+ } );
+}
+
+# Test Bromley special casing of 'unable to fix'
+$mech->get_ok( '/report/' . $report->id );
+$mech->content_contains( 'marks it as in progress' );
+$mech->content_contains( 'marked as in progress' );
+$mech->content_contains( 'marks it as unable to fix' );
+$mech->content_contains( 'marked as no further action' );
+
+# Clean up
+$mech->delete_user($user);
+$mech->delete_problems_for_body( 2482 );
+done_testing();
diff --git a/t/cobrand/councils.t b/t/cobrand/councils.t
index 8fb10cfbe..0cf25ebdf 100644
--- a/t/cobrand/councils.t
+++ b/t/cobrand/councils.t
@@ -6,13 +6,13 @@ use FixMyStreet::TestMech;
my $mech = FixMyStreet::TestMech->new;
foreach my $council (qw/southampton reading bromley/) {
- SKIP: {
- skip( "Need '$council' in ALLOWED_COBRANDS config", 3 )
- unless FixMyStreet::Cobrand->exists($council);
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ $council ],
+ }, sub {
ok $mech->host("$council.fixmystreet.com"), "change host to $council";
$mech->get_ok('/');
- $mech->content_like( qr/$council/i );
- }
+ $mech->content_like( qr/\u$council/ );
+ };
}
done_testing();
diff --git a/t/cobrand/fixmybarangay.t b/t/cobrand/fixmybarangay.t
index c0823eac4..b996fa0a6 100644
--- a/t/cobrand/fixmybarangay.t
+++ b/t/cobrand/fixmybarangay.t
@@ -2,9 +2,6 @@ use strict;
use warnings;
use Test::More;
-plan skip_all => 'Skipping FixMyBarangay test without FixMyBarangay cobrand'
- unless FixMyStreet::Cobrand->exists('fixmybarangay');
-
BEGIN {
use FixMyStreet;
FixMyStreet->test_mode(1);
@@ -16,7 +13,11 @@ my $mech = FixMyStreet::TestMech->new;
# Front page test
ok $mech->host("www.fixmybarangay.com"), "change host to FixMyBarangay";
-$mech->get_ok('/');
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'fixmybarangay' ],
+}, sub {
+ $mech->get_ok('/');
+};
$mech->content_like( qr/FixMyBarangay/ );
# Set up bodies
@@ -80,7 +81,11 @@ $mech->get_ok( '/report/' . $dps_report->id );
$mech->email_count_is(0);
-FixMyStreet::App->model('DB::Problem')->send_reports('fixmybarangay');
+FixMyStreet::override_config {
+ SEND_REPORTS_ON_STAGING => 1,
+}, sub {
+ FixMyStreet::App->model('DB::Problem')->send_reports('fixmybarangay');
+};
# Check BGY one sent by email
my $email = $mech->get_email;
@@ -111,7 +116,11 @@ is $luz_report->state, 'confirmed', 'should be confirmed';
$user = $mech->log_in_ok($fmb_test_email);
-$mech->get_ok( '/report/' . $luz_report->id );
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'fixmybarangay' ],
+}, sub {
+ $mech->get_ok( '/report/' . $luz_report->id );
+};
$mech->content_contains( "Remove from site" );
$mech->content_lacks( "Report abuse" );
diff --git a/t/cobrand/get_body_sender.t b/t/cobrand/get_body_sender.t
index 245cb1a13..964f5c0e4 100644
--- a/t/cobrand/get_body_sender.t
+++ b/t/cobrand/get_body_sender.t
@@ -21,10 +21,15 @@ my $body = FixMyStreet::App->model('DB::Body')->find_or_create({
});
my $body_area = $body->body_areas->find_or_create({ area_id => 1000 });
-is_deeply $c->get_body_sender( $body ), { method => 'Email' }, 'defaults to email';
-
-$body_area->update({ area_id => 2481 }); # Croydon LBO
-is_deeply $c->get_body_sender( $body ), { method => 'London' }, 'returns london report it if London borough';
+FixMyStreet::override_config {
+ MAPIT_TYPES => [ 'LBO' ],
+ MAPIT_URL => 'http://mapit.mysociety.org/',
+}, sub {
+ is_deeply $c->get_body_sender( $body ), { method => 'Email' }, 'defaults to email';
+
+ $body_area->update({ area_id => 2481 }); # Croydon LBO
+ is_deeply $c->get_body_sender( $body ), { method => 'London' }, 'returns london report it if London borough';
+};
$body->send_method( 'TestMethod' );
is $c->get_body_sender( $body )->{ method }, 'TestMethod', 'uses send_method in preference to London';
diff --git a/t/cobrand/hart.t b/t/cobrand/hart.t
new file mode 100644
index 000000000..f4a2473eb
--- /dev/null
+++ b/t/cobrand/hart.t
@@ -0,0 +1,16 @@
+use strict;
+use warnings;
+use Test::More;
+
+use FixMyStreet::TestMech;
+my $mech = FixMyStreet::TestMech->new;
+
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'hart' ],
+}, sub {
+ ok $mech->host("hart.fixmystreet.com"), "change host to hart";
+ $mech->get_ok('/');
+ $mech->content_like( qr/Hart\b/ );
+};
+
+done_testing();
diff --git a/t/cobrand/loading.t b/t/cobrand/loading.t
index bd83da07f..48a10293e 100644
--- a/t/cobrand/loading.t
+++ b/t/cobrand/loading.t
@@ -9,51 +9,92 @@ use FixMyStreet;
use_ok 'FixMyStreet::Cobrand';
# check that the allowed cobrands is correctly loaded from config
-{
+sub check_allowed_cobrands {
+ my $should = shift;
+ $should = [ map { { moniker => $_, host => $_ } } @$should ];
my $allowed = FixMyStreet::Cobrand->get_allowed_cobrands;
- ok $allowed, "got the allowed_cobrands";
+ ok $allowed, "got the allowed_cobrands";
isa_ok $allowed, "ARRAY";
- cmp_ok scalar @$allowed, '>', 1, "got more than one";
+ is_deeply $allowed, $should, "allowed_cobrands matched";
}
-# fake the allowed cobrands for testing
-my $override = Sub::Override->new( #
- 'FixMyStreet::Cobrand::_get_allowed_cobrands' =>
- sub { return ['emptyhomes'] }
-);
-is_deeply FixMyStreet::Cobrand->get_allowed_cobrands, [ { moniker => 'emptyhomes', host => 'emptyhomes' } ],
- 'overidden get_allowed_cobrands';
+FixMyStreet::override_config { ALLOWED_COBRANDS => 'fixmyhouse' },
+ sub { check_allowed_cobrands([ 'fixmyhouse' ]); };
+FixMyStreet::override_config { ALLOWED_COBRANDS => [ 'fixmyhouse' ] },
+ sub { check_allowed_cobrands([ 'fixmyhouse' ]); };
+FixMyStreet::override_config { ALLOWED_COBRANDS => [ 'fixmyhouse', 'fixmyshed' ] },
+ sub { check_allowed_cobrands([ 'fixmyhouse', 'fixmyshed' ]); };
sub run_host_tests {
my %host_tests = @_;
for my $host ( sort keys %host_tests ) {
- is FixMyStreet::Cobrand->get_class_for_host($host),
- "FixMyStreet::Cobrand::$host_tests{$host}",
- "does $host -> F::C::$host_tests{$host}";
+ # get the cobrand class by host
+ my $cobrand = FixMyStreet::Cobrand->get_class_for_host($host);
+ my $test_class = $host_tests{$host};
+ my $test_moniker = lc $test_class;
+ is $cobrand, "FixMyStreet::Cobrand::$test_class", "does $host -> F::C::$test_class";
+ my $c = $cobrand->new();
+ is $c->moniker, $test_moniker;
}
}
-# get the cobrand class by host
-run_host_tests(
- 'www.fixmystreet.com' => 'Default',
- 'reportemptyhomes.com' => 'EmptyHomes',
- 'barnet.fixmystreet.com' => 'Default', # not in the allowed_cobrands list
- 'some.odd.site.com' => 'Default',
-);
+# Only one cobrand, always use it
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'fixmystreet' ],
+}, sub {
+ run_host_tests(
+ 'www.fixmystreet.com' => 'FixMyStreet',
+ 'reportemptyhomes.com' => 'FixMyStreet',
+ 'barnet.fixmystreet.com' => 'FixMyStreet',
+ 'some.odd.site.com' => 'FixMyStreet',
+ );
+};
+
+# Only one cobrand, no .pm file, should still work
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'nopmfile' ],
+}, sub {
+ run_host_tests(
+ 'www.fixmystreet.com' => 'nopmfile',
+ 'some.odd.site.com' => 'nopmfile',
+ );
+};
+
+# Couple of cobrands, hostname checking and default fallback
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'emptyhomes', 'fixmystreet' ],
+}, sub {
+ run_host_tests(
+ 'www.fixmystreet.com' => 'FixMyStreet',
+ 'reportemptyhomes.com' => 'EmptyHomes',
+ 'barnet.fixmystreet.com' => 'FixMyStreet', # not in the allowed_cobrands list
+ 'some.odd.site.com' => 'Default',
+ );
+};
# now enable barnet too and check that it works
-$override->replace( #
- 'FixMyStreet::Cobrand::_get_allowed_cobrands' =>
- sub { return [ 'emptyhomes', 'barnet' ] }
-);
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'emptyhomes', 'barnet', 'fixmystreet' ],
+}, sub {
+ run_host_tests(
+ 'www.fixmystreet.com' => 'FixMyStreet',
+ 'reportemptyhomes.com' => 'EmptyHomes',
+ 'barnet.fixmystreet.com' => 'Barnet', # found now it is in allowed_cobrands
+ 'some.odd.site.com' => 'Default',
+ );
+};
-# get the cobrand class by host
-run_host_tests(
- 'www.fixmystreet.com' => 'Default',
- 'reportemptyhomes.com' => 'EmptyHomes',
- 'barnet.fixmystreet.com' => 'Barnet', # found now it is in allowed_cobrands
- 'some.odd.site.com' => 'Default',
-);
+# And a check with some regex matching
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ { 'fixmystreet' => 'empty' }, 'barnet', { 'testing' => 'fixmystreet' } ],
+}, sub {
+ run_host_tests(
+ 'www.fixmystreet.com' => 'testing',
+ 'reportemptyhomes.com' => 'FixMyStreet',
+ 'barnet.fixmystreet.com' => 'Barnet',
+ 'some.odd.site.com' => 'Default',
+ );
+};
# check that the moniker works as expected both on class and object.
is FixMyStreet::Cobrand::EmptyHomes->moniker, 'emptyhomes',
diff --git a/t/cobrand/zurich.t b/t/cobrand/zurich.t
index 721e6517a..73007ff59 100644
--- a/t/cobrand/zurich.t
+++ b/t/cobrand/zurich.t
@@ -1,20 +1,55 @@
# TODO
-# Overdue alerts
+# Overdue alerts
use strict;
use warnings;
use DateTime;
use Test::More;
-
-plan skip_all => 'Skipping Zurich test without Zurich cobrand'
- unless FixMyStreet::Cobrand->exists('zurich');
+use JSON;
+
+# Check that you have the required locale installed - the following
+# should return a line with de_CH.utf8 in. If not install that locale.
+#
+# locale -a | grep de_CH
+#
+# To generate the translations use:
+#
+# commonlib/bin/gettext-makemo FixMyStreet
+
+use FixMyStreet;
+
+# This is a helper method that will send the reports but with the config
+# correctly set - notably SEND_REPORTS_ON_STAGING needs to be true.
+sub send_reports_for_zurich {
+ FixMyStreet::override_config { SEND_REPORTS_ON_STAGING => 1 }, sub {
+ # Actually send the report
+ FixMyStreet::App->model('DB::Problem')->send_reports('zurich');
+ };
+}
+sub reset_report_state {
+ my ($report, $created) = @_;
+ $report->discard_changes;
+ my $extra = $report->extra;
+ delete $extra->{moderated_overdue};
+ delete $extra->{subdiv_overdue};
+ delete $extra->{closed_overdue};
+ $report->update({
+ extra => { %$extra },
+ state => 'unconfirmed',
+ $created ? ( created => $created ) : (),
+ });
+}
use FixMyStreet::TestMech;
my $mech = FixMyStreet::TestMech->new;
# Front page test
-ok $mech->host("zurich.fixmystreet.com"), "change host to Zurich";
-$mech->get_ok('/');
+ok $mech->host("zurich.example.com"), "change host to Zurich";
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ $mech->get_ok('/');
+};
$mech->content_like( qr/zurich/i );
# Set up bodies
@@ -36,6 +71,40 @@ $external_body->send_method( 'Zurich' );
$external_body->endpoint( 'external_body@example.org' );
$external_body->update;
+sub cleanup {
+ $mech->delete_problems_for_body( $division->id );
+ $mech->delete_problems_for_body( $subdivision->id );
+ $mech->delete_user( 'dm1@example.org' );
+ $mech->delete_user( 'sdm1@example.org' );
+}
+
+sub get_export_rows_count {
+ my $mech = shift;
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get_ok( '/admin/stats?export=1' );
+ };
+ is $mech->res->code, 200, 'csv retrieved ok';
+ is $mech->content_type, 'text/csv', 'content_type correct' and do {
+ my @lines = split /\n/, $mech->content;
+ return @lines - 1;
+ };
+ return;
+}
+
+cleanup();
+
+my $EXISTING_REPORT_COUNT = 0;
+
+subtest "set up superuser" => sub {
+ my $superuser = $mech->log_in_ok( 'super@example.org' );
+ # a user from body $zurich is a superuser, as $zurich has no parent id!
+ $superuser->update({ from_body => $zurich->id });
+ $EXISTING_REPORT_COUNT = get_export_rows_count($mech);
+ $mech->log_out_ok;
+};
+
my @reports = $mech->create_problems_for_body( 1, 2, 'Test', {
state => 'unconfirmed',
confirmed => undef,
@@ -43,61 +112,230 @@ my @reports = $mech->create_problems_for_body( 1, 2, 'Test', {
});
my $report = $reports[0];
-$mech->get_ok( '/report/' . $report->id );
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ $mech->get_ok( '/report/' . $report->id );
+};
$mech->content_contains('Überprüfung ausstehend');
# Check logging in to deal with this report
-$mech->get_ok( '/admin' );
-is $mech->uri->path, '/auth', "got sent to the sign in page";
-
-my $user = $mech->log_in_ok( 'dm1@example.org') ;
-$user->from_body( undef );
-$user->update;
-$mech->get_ok( '/admin' );
-is $mech->uri->path, '/my', "got sent to /my";
-$user->from_body( 2 );
-$user->update;
-
-$mech->get_ok( '/admin' );
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ $mech->get_ok( '/admin' );
+ is $mech->uri->path, '/auth', "got sent to the sign in page";
+
+ my $user = $mech->log_in_ok( 'dm1@example.org') ;
+ $user->from_body( undef );
+ $user->update;
+ $mech->get_ok( '/admin' );
+ is $mech->uri->path, '/my', "got sent to /my";
+ $user->from_body( 2 );
+ $user->update;
+
+ $mech->get_ok( '/admin' );
+};
is $mech->uri->path, '/admin', "am logged in";
$mech->content_contains( 'report_edit/' . $report->id );
$mech->content_contains( DateTime->now->strftime("%d.%m.%Y") );
$mech->content_contains( 'Erfasst' );
-$mech->get_ok( '/admin/report_edit/' . $report->id );
-$mech->content_contains( 'Unbestätigt' ); # Unconfirmed email
-$mech->submit_form_ok( { with_fields => { state => 'confirmed' } } );
-$mech->get_ok( '/report/' . $report->id );
-$mech->content_contains('Aufgenommen');
-$mech->content_contains('Test Test');
-$mech->content_lacks('photo/' . $report->id . '.jpeg');
-$mech->email_count_is(0);
-
-# Photo publishing
-$mech->get_ok( '/admin/report_edit/' . $report->id );
-$mech->submit_form_ok( { with_fields => { publish_photo => 1 } } );
-$mech->get_ok( '/report/' . $report->id );
-$mech->content_contains('photo/' . $report->id . '.jpeg');
-
-# Internal notes
-$mech->get_ok( '/admin/report_edit/' . $report->id );
-$mech->submit_form_ok( { with_fields => { internal_notes => 'Some internal notes.' } } );
-$mech->content_contains( 'Some internal notes' );
-
-# Original description
-$mech->submit_form_ok( { with_fields => { detail => 'Edited details text.' } } );
-$mech->content_contains( 'Edited details text.' );
-$mech->content_contains( 'Originaltext: “Test Test 1 for 2 Detail”' );
-
-$mech->get_ok( '/admin/report_edit/' . $report->id );
-$mech->submit_form_ok( { with_fields => { body_subdivision => 3 } } );
-
-$mech->get_ok( '/report/' . $report->id );
-$mech->content_contains('In Bearbeitung');
-$mech->content_contains('Test Test');
-FixMyStreet::App->model('DB::Problem')->send_reports('zurich');
+subtest "changing of categories" => sub {
+ # create a few categories (which are actually contacts)
+ foreach my $name ( qw/Cat1 Cat2/ ) {
+ FixMyStreet::App->model('DB::Contact')->find_or_create({
+ body => $division,
+ category => $name,
+ email => "$name\@example.org",
+ confirmed => 1,
+ deleted => 0,
+ editor => "editor",
+ whenedited => DateTime->now(),
+ note => "note for $name",
+ });
+ }
+
+ # put report into known category
+ my $original_category = $report->category;
+ $report->update({ category => 'Cat1' });
+ is( $report->category, "Cat1", "Category set to Cat1" );
+
+ # get the latest comment
+ my $comments_rs = $report->comments->search({},{ order_by => { -desc => "created" } });
+ ok ( !$comments_rs->first, "There are no comments yet" );
+
+ # change the category via the web interface
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { category => 'Cat2' } } );
+ };
+
+ # check changes correctly saved
+ $report->discard_changes();
+ is( $report->category, "Cat2", "Category changed to Cat2 as expected" );
+
+ # Check that a new comment has been created.
+ my $new_comment = $comments_rs->first();
+ is( $new_comment->text, "Weitergeleitet von Cat1 an Cat2", "category change comment created" );
+
+ # restore report to original category.
+ $report->update({category => $original_category });
+};
+
+sub get_moderated_count {
+ # my %date_params = ( );
+ # my $moderated = FixMyStreet::App->model('DB::Problem')->search({
+ # extra => { like => '%moderated_overdue,I1:0%' }, %date_params } )->count;
+ # return $moderated;
+
+ # use a separate mech to avoid stomping on test state
+ my $mech = FixMyStreet::TestMech->new;
+ my $user = $mech->log_in_ok( 'super@example.org' );
+
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get( '/admin/stats' );
+ };
+ if ($mech->content =~/Innerhalb eines Arbeitstages moderiert: (\d+)/) {
+ return $1;
+ }
+ else {
+ fail sprintf "Could not get moderation results (%d)", $mech->status;
+ return undef;
+ }
+}
+
+subtest "report_edit" => sub {
+
+ ok ( ! exists ${$report->extra}{moderated_overdue}, 'Report currently unmoderated' );
+
+ is get_moderated_count(), 0;
+
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->content_contains( 'Unbestätigt' ); # Unconfirmed email
+ $mech->submit_form_ok( { with_fields => { state => 'confirmed' } } );
+ $mech->get_ok( '/report/' . $report->id );
+ };
+
+ $mech->content_contains('Aufgenommen');
+ $mech->content_contains('Test Test');
+ $mech->content_lacks('photo/' . $report->id . '.jpeg');
+ $mech->email_count_is(0);
+
+ $report->discard_changes;
+
+ is ( $report->extra->{moderated_overdue}, 0, 'Report now marked moderated' );
+ is get_moderated_count(), 1;
+
+
+ # Set state back to 10 days ago so that report is overdue
+ my $created = $report->created;
+ reset_report_state($report, $created->clone->subtract(days => 10));
+
+ is get_moderated_count(), 0;
+
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { state => 'confirmed' } } );
+ $mech->get_ok( '/report/' . $report->id );
+ };
+ $report->discard_changes;
+ is ( $report->extra->{moderated_overdue}, 1, 'moderated_overdue set correctly when overdue' );
+ is get_moderated_count(), 0, 'Moderated count not increased when overdue';
+
+ reset_report_state($report, $created);
+
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { state => 'confirmed' } } );
+ $mech->get_ok( '/report/' . $report->id );
+ };
+ $report->discard_changes;
+ is ( $report->extra->{moderated_overdue}, 0, 'Marking confirmed sets moderated_overdue' );
+ is ( $report->extra->{closed_overdue}, undef, 'Marking confirmed does NOT set closed_overdue' );
+ is get_moderated_count(), 1;
+
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { state => 'hidden' } } );
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ };
+ $report->discard_changes;
+ is ( $report->extra->{moderated_overdue}, 0, 'Still marked moderated_overdue' );
+ is ( $report->extra->{closed_overdue}, 0, 'Marking hidden also set closed_overdue' );
+ is get_moderated_count(), 1, 'Check still counted moderated'
+ or diag $report->get_column('extra');
+
+ reset_report_state($report);
+
+ is ( $report->extra->{moderated_overdue}, undef, 'Sanity check' );
+ is get_moderated_count(), 0;
+
+ # Check that setting to 'hidden' also triggers moderation
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { state => 'hidden' } } );
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ };
+ $report->discard_changes;
+ is ( $report->extra->{moderated_overdue}, 0, 'Marking hidden from scratch sets moderated_overdue' );
+ is ( $report->extra->{closed_overdue}, 0, 'Marking hidden from scratch also set closed_overdue' );
+ is get_moderated_count(), 1;
+
+ is (FixMyStreet::Cobrand::Zurich->new->get_or_check_overdue($report), 0, 'sanity check');
+ $report->update({ created => $created->clone->subtract(days => 10) });
+ is (FixMyStreet::Cobrand::Zurich->new->get_or_check_overdue($report), 0, 'overdue call not increased');
+
+ reset_report_state($report, $created);
+};
+
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ # Photo publishing
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { state => 'confirmed', publish_photo => 1 } } );
+ $mech->get_ok( '/report/' . $report->id );
+ $mech->content_contains('photo/' . $report->id . '.jpeg');
+
+ # Internal notes
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { new_internal_note => 'Initial internal note.' } } );
+ $mech->submit_form_ok( { with_fields => { new_internal_note => 'Another internal note.' } } );
+ $mech->content_contains( 'Initial internal note.' );
+ $mech->content_contains( 'Another internal note.' );
+
+ # Original description
+ $mech->submit_form_ok( { with_fields => { detail => 'Edited details text.' } } );
+ $mech->content_contains( 'Edited details text.' );
+ $mech->content_contains( 'Originaltext: “Test Test 1 for 2 Detail”' );
+
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { body_subdivision => 3, send_rejected_email => 1 } } );
+
+ $mech->get_ok( '/report/' . $report->id );
+ $mech->content_contains('In Bearbeitung');
+ $mech->content_contains('Test Test');
+};
+
+send_reports_for_zurich();
my $email = $mech->get_email;
like $email->header('Subject'), qr/Neue Meldung/, 'subject looks okay';
like $email->header('To'), qr/subdivision\@example.org/, 'to line looks correct';
@@ -105,34 +343,47 @@ $mech->clear_emails_ok;
$mech->log_out_ok;
-$user = $mech->log_in_ok( 'sdm1@example.org') ;
-$mech->get_ok( '/admin' );
+my $user = $mech->log_in_ok( 'sdm1@example.org') ;
+$user->update({ from_body => undef });
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ $mech->get_ok( '/admin' );
+};
is $mech->uri->path, '/my', "got sent to /my";
$user->from_body( 3 );
$user->update;
-$mech->get_ok( '/admin' );
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ $mech->get_ok( '/admin' );
+};
is $mech->uri->path, '/admin', "am logged in";
$mech->content_contains( 'report_edit/' . $report->id );
$mech->content_contains( DateTime->now->strftime("%d.%m.%Y") );
$mech->content_contains( 'In Bearbeitung' );
-$mech->get_ok( '/admin/report_edit/' . $report->id );
-$mech->content_contains( 'Some internal notes' );
-
-$mech->submit_form_ok( { with_fields => { status_update => 'This is an update.' } } );
-is $mech->uri->path, '/admin/report_edit/' . $report->id, "still on edit page";
-$mech->content_contains('This is an update');
-ok $mech->form_with_fields( 'status_update' );
-$mech->submit_form_ok( { button => 'no_more_updates' } );
-is $mech->uri->path, '/admin/summary', "redirected now finished with report.";
-
-$mech->get_ok( '/report/' . $report->id );
-$mech->content_contains('In Bearbeitung');
-$mech->content_contains('Test Test');
-
-FixMyStreet::App->model('DB::Problem')->send_reports('zurich');
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->content_contains( 'Initial internal note' );
+
+ $mech->submit_form_ok( { with_fields => { status_update => 'This is an update.' } } );
+ is $mech->uri->path, '/admin/report_edit/' . $report->id, "still on edit page";
+ $mech->content_contains('This is an update');
+ ok $mech->form_with_fields( 'status_update' );
+ $mech->submit_form_ok( { button => 'no_more_updates' } );
+ is $mech->uri->path, '/admin/summary', "redirected now finished with report.";
+
+ $mech->get_ok( '/report/' . $report->id );
+ $mech->content_contains('In Bearbeitung');
+ $mech->content_contains('Test Test');
+};
+
+send_reports_for_zurich();
$email = $mech->get_email;
like $email->header('Subject'), qr/Feedback/, 'subject looks okay';
like $email->header('To'), qr/division\@example.org/, 'to line looks correct';
@@ -143,7 +394,11 @@ is $report->state, 'planned', 'Report now in planned state';
$mech->log_out_ok;
$user = $mech->log_in_ok( 'dm1@example.org') ;
-$mech->get_ok( '/admin' );
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ $mech->get_ok( '/admin' );
+};
$mech->content_contains( 'report_edit/' . $report->id );
$mech->content_contains( DateTime->now->strftime("%d.%m.%Y") );
@@ -154,13 +409,17 @@ $extra->{email_confirmed} = 1;
$report->extra ( { %$extra } );
$report->update;
-$mech->get_ok( '/admin/report_edit/' . $report->id );
-$mech->content_lacks( 'Unbestätigt' ); # Confirmed email
-$mech->submit_form_ok( { with_fields => { status_update => 'FINAL UPDATE' } } );
-$mech->form_with_fields( 'status_update' );
-$mech->submit_form_ok( { button => 'publish_response' } );
-
-$mech->get_ok( '/report/' . $report->id );
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->content_lacks( 'Unbestätigt' ); # Confirmed email
+ $mech->submit_form_ok( { with_fields => { status_update => 'FINAL UPDATE' } } );
+ $mech->form_with_fields( 'status_update' );
+ $mech->submit_form_ok( { button => 'publish_response' } );
+
+ $mech->get_ok( '/report/' . $report->id );
+};
$mech->content_contains('Beantwortet');
$mech->content_contains('Test Test');
$mech->content_contains('FINAL UPDATE');
@@ -179,17 +438,25 @@ $mech->clear_emails_ok;
});
$report = $reports[0];
-$mech->get_ok( '/admin/report_edit/' . $report->id );
-$mech->submit_form_ok( { with_fields => { state => 'planned' } } );
-$mech->get_ok( '/report/' . $report->id );
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { state => 'planned' } } );
+ $mech->get_ok( '/report/' . $report->id );
+};
$mech->content_contains('In Bearbeitung');
$mech->content_contains('Second Test');
-$mech->get_ok( '/admin/report_edit/' . $report->id );
-$mech->content_contains( 'Unbestätigt' );
-$mech->submit_form_ok( { button => 'publish_response', with_fields => { status_update => 'FINAL UPDATE' } } );
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->content_contains( 'Unbestätigt' );
+ $mech->submit_form_ok( { button => 'publish_response', with_fields => { status_update => 'FINAL UPDATE' } } );
-$mech->get_ok( '/report/' . $report->id );
+ $mech->get_ok( '/report/' . $report->id );
+};
$mech->content_contains('Beantwortet');
$mech->content_contains('Second Test');
$mech->content_contains('FINAL UPDATE');
@@ -205,13 +472,17 @@ $mech->email_count_is(0);
});
$report = $reports[0];
-$mech->get_ok( '/admin/report_edit/' . $report->id );
-$mech->submit_form_ok( { with_fields => { body_external => 4 } } );
-$mech->get_ok( '/report/' . $report->id );
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { body_external => 4 } } );
+ $mech->get_ok( '/report/' . $report->id );
+};
$mech->content_contains('Beantwortet');
$mech->content_contains('Third Test');
$mech->content_contains('Wir haben Ihr Anliegen an External Body weitergeleitet');
-FixMyStreet::App->model('DB::Problem')->send_reports('zurich');
+send_reports_for_zurich();
$email = $mech->get_email;
like $email->header('Subject'), qr/Weitergeleitete Meldung/, 'subject looks okay';
like $email->header('To'), qr/external_body\@example.org/, 'to line looks correct';
@@ -220,17 +491,21 @@ unlike $email->body, qr/test\@example.com/, 'body does not contain email address
$mech->clear_emails_ok;
# Test calling back, and third_personal boolean setting
-$mech->get_ok( '/admin' );
-is $mech->uri->path, '/admin', "am logged in";
-$mech->content_contains( 'report_edit/' . $report->id );
-$mech->get_ok( '/admin/report_edit/' . $report->id );
-$mech->submit_form_ok( { with_fields => { state => 'unconfirmed' } } );
-$mech->submit_form_ok( { with_fields => { body_external => 4, third_personal => 1 } } );
-$mech->get_ok( '/report/' . $report->id );
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+}, sub {
+ $mech->get_ok( '/admin' );
+ is $mech->uri->path, '/admin', "am logged in";
+ $mech->content_contains( 'report_edit/' . $report->id );
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { state => 'unconfirmed' } } );
+ $mech->submit_form_ok( { with_fields => { body_external => 4, third_personal => 1 } } );
+ $mech->get_ok( '/report/' . $report->id );
+};
$mech->content_contains('Beantwortet');
$mech->content_contains('Third Test');
$mech->content_contains('Wir haben Ihr Anliegen an External Body weitergeleitet');
-FixMyStreet::App->model('DB::Problem')->send_reports('zurich');
+send_reports_for_zurich();
$email = $mech->get_email;
like $email->header('Subject'), qr/Weitergeleitete Meldung/, 'subject looks okay';
like $email->header('To'), qr/external_body\@example.org/, 'to line looks correct';
@@ -239,21 +514,167 @@ like $email->body, qr/test\@example.com/, 'body does contain email address';
$mech->clear_emails_ok;
$mech->log_out_ok;
-# Test only superuser can edit bodies
-$user = $mech->log_in_ok( 'dm1@example.org') ;
-$mech->get( '/admin/body/' . $zurich->id );
-is $mech->res->code, 404, "only superuser should be able to edit bodies";
-$mech->log_out_ok;
-
-# Test only superuser can see "Add body" form
-$user = $mech->log_in_ok( 'dm1@example.org') ;
-$mech->get_ok( '/admin/bodies' );
-$mech->content_lacks( '<form method="post" action="bodies"' );
-$mech->log_out_ok;
-
-$mech->delete_problems_for_body( 2 );
-$mech->delete_user( 'dm1@example.org' );
-$mech->delete_user( 'sdm1@example.org' );
+subtest "only superuser can see stats" => sub {
+ $user = $mech->log_in_ok( 'super@example.org' );
+
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get( '/admin/stats' );
+ };
+ is $mech->res->code, 200, "superuser should be able to see stats page";
+ $mech->log_out_ok;
+
+ $user = $mech->log_in_ok( 'dm1@example.org' );
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get( '/admin/stats' );
+ };
+ is $mech->res->code, 404, "only superuser should be able to see stats page";
+ $mech->log_out_ok;
+};
+
+subtest "only superuser can edit bodies" => sub {
+ $user = $mech->log_in_ok( 'dm1@example.org' );
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get( '/admin/body/' . $zurich->id );
+ };
+ is $mech->res->code, 404, "only superuser should be able to edit bodies";
+ $mech->log_out_ok;
+};
+
+subtest "only superuser can see 'Add body' form" => sub {
+ $user = $mech->log_in_ok( 'dm1@example.org' );
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAPIT_URL => 'http://global.mapit.mysociety.org/',
+ MAPIT_TYPES => [ 'O08' ],
+ MAPIT_ID_WHITELIST => [ 423017 ],
+ }, sub {
+ $mech->get_ok( '/admin/bodies' );
+ };
+ $mech->content_lacks( '<form method="post" action="bodies"' );
+ $mech->log_out_ok;
+};
+
+subtest "phone number is mandatory" => sub {
+ FixMyStreet::override_config {
+ MAPIT_TYPES => [ 'O08' ],
+ MAPIT_URL => 'http://global.mapit.mysociety.org/',
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $user = $mech->log_in_ok( 'dm1@example.org' );
+ $mech->get_ok( '/report/new?lat=47.381817&lon=8.529156' );
+ $mech->submit_form( with_fields => { phone => "" } );
+ $mech->content_contains( 'Diese Information wird ben&ouml;tigt' );
+ $mech->log_out_ok;
+ };
+};
+
+subtest "phone number is not mandatory for reports from mobile apps" => sub {
+ FixMyStreet::override_config {
+ MAPIT_TYPES => [ 'O08' ],
+ MAPIT_URL => 'http://global.mapit.mysociety.org/',
+ }, sub {
+ $mech->post_ok( '/report/new/mobile?lat=47.381817&lon=8.529156' , {
+ service => 'iPhone',
+ detail => 'Problem-Bericht',
+ lat => 47.381817,
+ lon => 8.529156,
+ email => 'user@example.org',
+ pc => '',
+ name => '',
+ });
+ my $res = $mech->response;
+ ok $res->header('Content-Type') =~ m{^application/json\b}, 'response should be json';
+ unlike $res->content, qr/Diese Information wird ben&ouml;tigt/, 'response should not contain phone error';
+ # Clear out the mailq
+ $mech->clear_emails_ok;
+ };
+};
+
+subtest "problems can't be assigned to deleted bodies" => sub {
+ $user = $mech->log_in_ok( 'dm1@example.org' );
+ $user->from_body( 1 );
+ $user->update;
+ $report->state( 'confirmed' );
+ $report->update;
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAPIT_URL => 'http://global.mapit.mysociety.org/',
+ MAPIT_TYPES => [ 'O08' ],
+ MAPIT_ID_WHITELIST => [ 423017 ],
+ }, sub {
+ $mech->get_ok( '/admin/body/' . $external_body->id );
+ $mech->submit_form_ok( { with_fields => { deleted => 1 } } );
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->content_lacks( $external_body->name );
+ };
+ $user->from_body( 2 );
+ $user->update;
+ $mech->log_out_ok;
+};
+
+subtest "hidden report email are only sent when requested" => sub {
+ $user = $mech->log_in_ok( 'dm1@example.org') ;
+ $extra = $report->extra;
+ $extra->{email_confirmed} = 1;
+ $report->extra ( { %$extra } );
+ $report->update;
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { state => 'hidden', send_rejected_email => 1 } } );
+ $mech->email_count_is(1);
+ $mech->clear_emails_ok;
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { state => 'hidden', send_rejected_email => undef } } );
+ $mech->email_count_is(0);
+ $mech->clear_emails_ok;
+ $mech->log_out_ok;
+ };
+};
+
+subtest "test stats" => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $user = $mech->log_in_ok( 'super@example.org' );
+
+ $mech->get_ok( '/admin/stats' );
+ is $mech->res->code, 200, "superuser should be able to see stats page";
+
+ $mech->content_contains('Innerhalb eines Arbeitstages moderiert: 2'); # now including hidden
+ $mech->content_contains('Innerhalb von f&uuml;nf Arbeitstagen abgeschlossen: 3');
+ # my @data = $mech->content =~ /(?:moderiert|abgeschlossen): \d+/g;
+ # diag Dumper(\@data); use Data::Dumper;
+
+ my $export_count = get_export_rows_count($mech);
+ if (defined $export_count) {
+ is $export_count - $EXISTING_REPORT_COUNT, 3, 'Correct number of reports';
+ $mech->content_contains(',fixed - council,');
+ $mech->content_contains(',hidden,');
+ }
+
+ $mech->log_out_ok;
+ };
+};
+
+subtest "test admin_log" => sub {
+ diag $report->id;
+ my @entries = FixMyStreet::App->model('DB::AdminLog')->search({
+ object_type => 'problem',
+ object_id => $report->id,
+ });
+ is scalar @entries, 4, 'State changes logged';
+ is $entries[-1]->action, 'state change to hidden', 'State change logged as expected';
+};
+
+cleanup();
ok $mech->host("www.fixmystreet.com"), "change host back";