use FixMyStreet::TestMech; use Web::Scraper; use Path::Class; use LWP::Protocol::PSGI; use t::Mock::MapItZurich; LWP::Protocol::PSGI->register(t::Mock::MapItZurich->to_psgi_app, host => 'mapit.zurich'); my $mech = FixMyStreet::TestMech->new; $mech->get_ok('/import'); my $sample_file = file(__FILE__)->parent->file("sample.jpg")->stringify; ok -e $sample_file, "sample file $sample_file exists"; # disable info logs for this test run FixMyStreet::App->log->disable('info'); END { FixMyStreet::App->log->enable('info'); } my $body = $mech->create_body_ok(2608, 'Borsetshire Council'); $mech->create_contact_ok( body_id => $body->id, category => 'Street lighting', email => 'streetlighting@example.com', ); $mech->create_contact_ok( body_id => $body->id, category => 'Potholes', email => 'highways@example.com', ); # submit an empty report to import - check we get all errors subtest "Test creating bad partial entries" => sub { foreach my $test ( { fields => { email => 'bob', }, errors => [ 'You must supply a service', 'Please enter a subject', 'Please enter your name', 'Please enter a valid email', 'Either a location or a photo must be provided.', ], }, { fields => { email => 'bob@example.com' }, errors => [ 'You must supply a service', 'Please enter a subject', 'Please enter your name', 'Either a location or a photo must be provided.', ], }, { fields => { lat => 1, lon => 1, }, errors => [ 'You must supply a service', 'Please enter a subject', 'Please enter your name', 'Please enter your email', 'We had a problem with the supplied co-ordinates - outside the UK?', ], }, { fields => { photo => $sample_file, }, errors => [ 'You must supply a service', 'Please enter a subject', 'Please enter your name', 'Please enter your email', ], }, ) { $mech->get_ok('/import'); FixMyStreet::override_config { ALLOWED_COBRANDS => [ { 'fixmystreet' => '.' } ], }, sub { $mech->submit_form_ok( # { with_fields => $test->{fields} }, "fill in form" ); }; is_deeply( $mech->import_errors, $test->{errors}, "expected errors" ); } }; for my $test ( { desc => 'Submit a correct entry', }, { desc => 'Submit a correct web entry', web => 1, } ) { subtest "Submit a correct entry" => sub { $mech->get_ok('/import'); $mech->submit_form_ok( # { with_fields => { service => 'test-script', name => 'Test User', email => 'Test@example.com', subject => 'Test report', detail => 'This is a test report', photo => $sample_file, web => $test->{web}, } }, "fill in form" ); is_deeply( $mech->import_errors, [], "got no errors" ); if ( $test->{web} ) { $mech->content_contains('Nearly done! Now check', "Got email confirmation page"); } else { is $mech->content, 'SUCCESS', "Got success response"; } # check that we have received the email my $token_url = $mech->get_link_from_email; $mech->clear_emails_ok; ok $token_url, "Found a token url $token_url"; # go to the token url FixMyStreet::override_config { MAPIT_URL => 'http://mapit.uk/', }, sub { $mech->get_ok($token_url); }; # check that we are on '/around' is $mech->uri->path, '/around', "sent to /around"; # check that we are not shown anything as we don't have a location yet is_deeply $mech->visible_form_values, { pc => '' }, "check only pc field is shown"; FixMyStreet::override_config { ALLOWED_COBRANDS => [ 'fixmystreet' ], MAPIT_URL => 'http://mapit.uk/', }, sub { $mech->submit_form_ok( { with_fields => { pc => 'SN15 5NG' } }, "fill in postcode" ); }; is $mech->uri->path, '/report/new', "sent to report page"; # check that fields are prefilled for us is_deeply $mech->visible_form_values, { name => 'Test User', title => 'Test report', detail => 'This is a test report', photo1 => '', photo2 => '', photo3 => '', phone => '', may_show_name => '1', category => '-- Pick a category --', }, "check imported fields are shown"; # Check photo present, and still there after map submission (testing bug #18) $mech->content_contains( 'content_contains('longitude" value="-2.1"', 'Check longitude'); FixMyStreet::override_config { ALLOWED_COBRANDS => [ { 'fixmystreet' => '.' } ], MAPIT_URL => 'http://mapit.uk/', }, sub { $mech->submit_form_ok( { button => 'tile_16192.10896', x => 10, y => 10, }, "New map location" ); }; $mech->content_contains( 'content_contains('longitude" value="-2.108946"', 'Check longitude'); # check that fields haven't changed at all is_deeply $mech->visible_form_values, { name => 'Test User', title => 'Test report', detail => 'This is a test report', photo1 => '', photo2 => '', photo3 => '', phone => '', may_show_name => '1', category => '-- Pick a category --', }, "check imported fields are shown"; # change the details FixMyStreet::override_config { ALLOWED_COBRANDS => [ { 'fixmystreet' => '.' } ], MAPIT_URL => 'http://mapit.uk/', }, sub { $mech->submit_form_ok( { with_fields => { name => 'New Test User', title => 'New Test report', detail => 'This is a test report', phone => '01234 567 890', may_show_name => '1', category => 'Street lighting', } }, "Update details and save" ); }; # check that report has been created my $user = FixMyStreet::DB->resultset('User') ->find( { email => 'test@example.com' } ); ok $user, "Found a user"; my $report = $user->problems->first; is $report->state, 'confirmed', 'is confirmed'; is $report->title, 'New Test report', 'title is correct'; $mech->delete_user($user); }; } subtest "Submit a correct entry (with location)" => sub { $mech->get_ok('/import'); $mech->submit_form_ok( # { with_fields => { service => 'test-script', lat => '51.5', lon => '-2.1', name => 'Test User ll', email => 'test-ll@example.com', subject => 'Test report ll', detail => 'This is a test report ll', photo => $sample_file, } }, "fill in form" ); is_deeply( $mech->import_errors, [], "got no errors" ); is $mech->content, 'SUCCESS', "Got success response"; # check that we have received the email my $token_url = $mech->get_link_from_email; $mech->clear_emails_ok; ok $token_url, "Found a token url $token_url"; # go to the token url FixMyStreet::override_config { ALLOWED_COBRANDS => [ { 'fixmystreet' => '.' } ], MAPIT_URL => 'http://mapit.uk/', }, sub { $mech->get_ok($token_url); }; # check that we are on '/report/new' is $mech->uri->path, '/report/new', "sent to /report/new"; # check that fields are prefilled for us is_deeply $mech->visible_form_values, { name => 'Test User ll', title => 'Test report ll', detail => 'This is a test report ll', photo1 => '', photo2 => '', photo3 => '', phone => '', may_show_name => '1', category => '-- Pick a category --', }, "check imported fields are shown"; # change the details FixMyStreet::override_config { ALLOWED_COBRANDS => [ { 'fixmystreet' => '.' } ], MAPIT_URL => 'http://mapit.uk/', }, sub { $mech->submit_form_ok( # { with_fields => { name => 'New Test User ll', title => 'New Test report ll', detail => 'This is a test report ll', phone => '01234 567 890', may_show_name => '1', category => 'Street lighting', } }, "Update details and save" ); }; # check that report has been created my $user = FixMyStreet::DB->resultset('User') ->find( { email => 'test-ll@example.com' } ); ok $user, "Found a user"; my $report = $user->problems->first; is $report->state, 'confirmed', 'is confirmed'; is $report->title, 'New Test report ll', 'title is correct'; $mech->delete_user($user); }; subtest "Submit a correct entry (with location) to cobrand" => sub { FixMyStreet::override_config { ALLOWED_COBRANDS => [ 'zurich' ], MAPIT_URL => 'http://mapit.zurich/', MAPIT_TYPES => [ 'O08' ], MAPIT_ID_WHITELIST => [], MAP_TYPE => 'Zurich,OSM', }, sub { ok $mech->host("zurich.example.org"), 'change host to zurich'; $mech->get_ok('/import'); $mech->submit_form_ok( # { with_fields => { service => 'test-script', lat => '47.4', lon => '8.5', name => 'Test User ll', email => 'test-ll@example.com', subject => 'Test report ll', detail => 'This is a test report ll', photo => $sample_file, } }, "fill in form" ); is_deeply( $mech->import_errors, [], "got no errors" ); is $mech->content, 'SUCCESS', "Got success response"; # check that we have received the email my $token_url = $mech->get_link_from_email; $mech->clear_emails_ok; ok $token_url, "Found a token url $token_url"; # go to the token url $mech->get_ok($token_url); # check that we are on '/report/new' is $mech->uri->path, '/report/new', "sent to /report/new"; # check that fields are prefilled for us is_deeply $mech->visible_form_values, { name => 'Test User ll', detail => 'This is a test report ll', photo1 => '', photo2 => '', photo3 => '', phone => '', username => 'test-ll@example.com', }, "check imported fields are shown" or diag Dumper( $mech->visible_form_values ); use Data::Dumper; my $user = FixMyStreet::DB->resultset('User')->find( { email => 'test-ll@example.com' } ); ok $user, "Found a user"; my $report = $user->problems->first; is $report->state, 'partial', 'is still partial'; is $report->title, 'Test report ll', 'title is correct'; is $report->lang, 'de-ch', 'language is correct'; $mech->delete_user($user); }; }; done_testing();