use Path::Tiny; use FixMyStreet::DB; use FixMyStreet::TestMech; my $mech = FixMyStreet::TestMech->new; my $superuser = $mech->create_user_ok('superuser@example.com', name => 'Super User', is_superuser => 1); $mech->log_in_ok( $superuser->email ); FixMyStreet::override_config { ALLOWED_COBRANDS => [ 'lincolnshire', 'tfl', 'fixmystreet' ], }, sub { ok $mech->host('lincolnshire.fixmystreet.com'); subtest "theme link on cobrand admin goes to create form if no theme exists" => sub { is( FixMyStreet::DB->resultset('ManifestTheme')->count, 0, "no themes yet" ); $mech->get_ok("/admin"); $mech->follow_link_ok({ text => "Manifest Theme" }); is $mech->res->previous->code, 302, "got 302 for redirect"; is $mech->res->previous->base->path, "/admin/manifesttheme", "redirected from index"; is $mech->uri->path, '/admin/manifesttheme/create', "redirected to create page"; }; subtest "name and short_name are required fields" => sub { is( FixMyStreet::DB->resultset('ManifestTheme')->count, 0, "no themes yet" ); $mech->get_ok("/admin/manifesttheme/create"); $mech->content_lacks("Delete theme"); $mech->submit_form_ok({}); is $mech->uri->path, '/admin/manifesttheme/create', "stayed on create page"; $mech->content_contains("field is required"); is( FixMyStreet::DB->resultset('ManifestTheme')->count, 0, "theme not created" ); $mech->get_ok("/admin/manifesttheme/create"); $mech->submit_form_ok({ with_fields => { short_name => "Lincs FMS" } }); is $mech->uri->path, '/admin/manifesttheme/create', "stayed on create page"; $mech->content_contains("field is required", "name is required"); is( FixMyStreet::DB->resultset('ManifestTheme')->count, 0, "theme not created" ); $mech->get_ok("/admin/manifesttheme/create"); $mech->submit_form_ok({ with_fields => { name => "Lincolnshire FixMyStreet" } }); is $mech->uri->path, '/admin/manifesttheme/create', "stayed on create page"; $mech->content_contains("field is required", "short_name is required"); is( FixMyStreet::DB->resultset('ManifestTheme')->count, 0, "theme not created" ); }; subtest "cobrand admin lets you create a new theme" => sub { is( FixMyStreet::DB->resultset('ManifestTheme')->count, 0, "no themes yet" ); $mech->get_ok("/admin/manifesttheme/create"); $mech->content_lacks("Delete theme"); my $fields = { name => "Lincolnshire FixMyStreet", short_name => "Lincs FMS", }; $mech->submit_form_ok( { with_fields => $fields } ); is $mech->uri->path, '/admin/manifesttheme/lincolnshire', "redirected to edit page"; is( FixMyStreet::DB->resultset('ManifestTheme')->count, 1, "theme was created" ); my $theme = FixMyStreet::DB->resultset('ManifestTheme')->find({ cobrand => 'lincolnshire' }); is $theme->name, "Lincolnshire FixMyStreet"; is $theme->short_name, "Lincs FMS"; is $theme->background_colour, undef; my $log = $superuser->admin_logs->search({}, { order_by => { -desc => 'id' } })->first; is $log->object_id, $theme->id; is $log->action, "add"; is $log->object_summary, "lincolnshire"; is $log->link, "/admin/manifesttheme/lincolnshire"; }; subtest "cobrand admin lets you update an existing theme" => sub { $mech->get_ok("/admin/manifesttheme/lincolnshire"); my $fields = { background_colour => "#663399", theme_colour => "rgb(102, 51, 153)", }; $mech->submit_form_ok( { with_fields => $fields } ); my $theme = FixMyStreet::DB->resultset('ManifestTheme')->find({ cobrand => 'lincolnshire' }); is $theme->background_colour, "#663399"; is $theme->theme_colour, "rgb(102, 51, 153)"; my $log = $superuser->admin_logs->search({}, { order_by => { -desc => 'id' } })->first; is $log->object_id, $theme->id; is $log->action, "edit"; }; subtest "cobrand admin lets you add an icon to an existing theme" => sub { $mech->get_ok("/admin/manifesttheme/lincolnshire"); my $sample_jpeg = path(__FILE__)->parent->parent->child("sample.jpg"); ok $sample_jpeg->exists, "sample image $sample_jpeg exists"; my $icon_filename = '74e3362283b6ef0c48686fb0e161da4043bbcc97.jpg'; $mech->post( '/admin/manifesttheme/lincolnshire', Content_Type => 'form-data', Content => { name => "Lincolnshire FixMyStreet", short_name => "Lincs FMS", background_colour => "#663399", theme_colour => "rgb(102, 51, 153)", cobrand => 'lincolnshire', icon => [ $sample_jpeg, undef, Content_Type => 'image/jpeg' ], }, ); ok $mech->success, 'Posted request successfully'; is $mech->uri->path, '/admin/manifesttheme/lincolnshire', "redirected back to edit page"; $mech->content_contains("content_contains("133x100"); my $icon_dest = path(FixMyStreet->path_to('web/theme/lincolnshire/', $icon_filename)); ok $icon_dest->exists, "Icon stored on disk"; }; subtest "cobrand admin lets you delete an icon from an existing theme" => sub { my $icon_filename = '74e3362283b6ef0c48686fb0e161da4043bbcc97.jpg'; my $icon_dest = path(FixMyStreet->path_to('web/theme/lincolnshire/', $icon_filename)); ok $icon_dest->exists, "Icon exists on disk"; $mech->get_ok("/admin/manifesttheme/lincolnshire"); my $fields = { delete_icon => "/theme/lincolnshire/$icon_filename", }; $mech->submit_form_ok( { with_fields => $fields } ); is $mech->uri->path, '/admin/manifesttheme/lincolnshire', "redirected back to edit page"; $mech->content_lacks("content_lacks("133x100"); ok !$icon_dest->exists, "Icon removed from disk"; }; subtest "cobrand admin rejects non-images" => sub { $mech->get_ok("/admin/manifesttheme/lincolnshire"); my $sample_pdf = path(__FILE__)->parent->parent->child("sample.pdf"); ok $sample_pdf->exists, "sample image $sample_pdf exists"; $mech->post( '/admin/manifesttheme/lincolnshire', Content_Type => 'form-data', Content => { name => "Lincolnshire FixMyStreet", short_name => "Lincs FMS", background_colour => "#663399", theme_colour => "rgb(102, 51, 153)", cobrand => 'lincolnshire', icon => [ $sample_pdf, undef, Content_Type => 'application/pdf' ], }, ); ok $mech->success, 'Posted request successfully'; is $mech->uri->path, '/admin/manifesttheme/lincolnshire', "redirected back to edit page"; $mech->content_lacks("90f7a64043fb458d58de1a0703a6355e2856b15e.pdf"); $mech->content_contains("File type not recognised. Please upload an image."); }; subtest "theme link on cobrand admin goes to edit form when theme exists" => sub { is( FixMyStreet::DB->resultset('ManifestTheme')->count, 1, "theme exists" ); $mech->get_ok("/admin"); $mech->follow_link_ok({ text => "Manifest Theme" }); is $mech->res->previous->code, 302, "got 302 for redirect"; is $mech->res->previous->base->path, "/admin/manifesttheme", "redirected from index"; is $mech->uri->path, '/admin/manifesttheme/lincolnshire', "redirected to edit page"; }; subtest "create page on cobrand admin redirects to edit form when theme exists" => sub { is( FixMyStreet::DB->resultset('ManifestTheme')->count, 1, "theme exists" ); $mech->get_ok("/admin/manifesttheme/create"); is $mech->res->previous->code, 302, "got 302 for redirect"; is $mech->uri->path, '/admin/manifesttheme/lincolnshire', "redirected to edit page"; }; subtest "can delete theme" => sub { is( FixMyStreet::DB->resultset('ManifestTheme')->count, 1, "theme exists" ); my $theme_id = FixMyStreet::DB->resultset('ManifestTheme')->find({ cobrand => 'lincolnshire' })->id; # Add an icon so we can test it gets deleted when the theme is deleted my $sample_jpeg = path(__FILE__)->parent->parent->child("sample.jpg"); ok $sample_jpeg->exists, "sample image $sample_jpeg exists"; my $icon_filename = '74e3362283b6ef0c48686fb0e161da4043bbcc97.jpg'; $mech->post( '/admin/manifesttheme/lincolnshire', Content_Type => 'form-data', Content => { name => "Lincolnshire FixMyStreet", short_name => "Lincs FMS", background_colour => "#663399", theme_colour => "rgb(102, 51, 153)", cobrand => "lincolnshire", icon => [ $sample_jpeg, undef, Content_Type => 'image/jpeg' ], }, ); ok $mech->success, 'Posted request successfully'; is $mech->uri->path, '/admin/manifesttheme/lincolnshire', "redirected back to edit page"; my $icon_dest = path(FixMyStreet->path_to('web/theme/lincolnshire/', $icon_filename)); ok $icon_dest->exists, "Icon stored on disk"; $mech->submit_form_ok({ button => 'delete_theme' }); is $mech->uri->path, '/admin/manifesttheme/create', "redirected to create page"; is( FixMyStreet::DB->resultset('ManifestTheme')->count, 0, "theme deleted" ); ok !$icon_dest->exists, "Icon removed from disk"; my $log = $superuser->admin_logs->search({}, { order_by => { -desc => 'id' } })->first; is $log->object_id, $theme_id; is $log->action, "delete"; }; subtest "can't edit another cobrand's theme" => sub { FixMyStreet::DB->resultset('ManifestTheme')->create({ cobrand => "tfl", name => "Transport for London Street Care", short_name => "TfL Street Care", }); $mech->get("/admin/manifesttheme/tfl"); ok !$mech->res->is_success(), "want a bad response"; is $mech->res->code, 404, "got 404"; }; ok $mech->host('www.fixmystreet.com'); subtest "fms cobrand lets you view all manifest themes" => sub { is( FixMyStreet::DB->resultset('ManifestTheme')->count, 1, "theme already exists" ); $mech->get_ok("/admin"); $mech->follow_link_ok({ text => "Manifest Theme" }); is $mech->uri->path, '/admin/manifesttheme', "taken to list page"; $mech->content_contains("Transport for London Street Care"); $mech->content_contains("TfL Street Care"); }; subtest "fms cobrand lets you edit a cobrand's manifest theme" => sub { $mech->get_ok("/admin/manifesttheme"); $mech->follow_link_ok({ url => "manifesttheme/tfl" }) or diag $mech->content; my $fields = { name => "Transport for London Report It", }; $mech->submit_form_ok( { with_fields => $fields } ); is $mech->uri->path, '/admin/manifesttheme', "redirected back to list page"; my $theme = FixMyStreet::DB->resultset('ManifestTheme')->find({ cobrand => 'tfl' }); is $theme->name, "Transport for London Report It"; }; subtest "fms cobrand lets you create a new manifest theme" => sub { $mech->get_ok("/admin/manifesttheme"); $mech->follow_link_ok({ text => "Create" }); my $fields = { name => "FixMyStreet Pro", short_name => "FMS Pro", cobrand => "fixmystreet", }; $mech->submit_form_ok( { with_fields => $fields } ); is $mech->uri->path, '/admin/manifesttheme', "redirected to list page"; is( FixMyStreet::DB->resultset('ManifestTheme')->count, 2, "theme added" ); my $theme = FixMyStreet::DB->resultset('ManifestTheme')->find({ cobrand => 'fixmystreet' }); is $theme->name, "FixMyStreet Pro"; }; subtest "fms cobrand prevents you creating a duplicate theme" => sub { $mech->get_ok("/admin/manifesttheme"); $mech->follow_link_ok({ text => "Create" }); my $fields = { name => "FixMyStreet Pro", short_name => "FMS Pro", cobrand => "fixmystreet", }; $mech->submit_form_ok( { with_fields => $fields } ); is $mech->uri->path, '/admin/manifesttheme/create', "stayed on create form"; is( FixMyStreet::DB->resultset('ManifestTheme')->count, 2, "theme not added" ); }; subtest "fms cobrand prevents creating a duplicate by editing" => sub { $mech->get_ok("/admin/manifesttheme"); $mech->follow_link_ok({ url => "manifesttheme/tfl" }); my $fields = { cobrand => "fixmystreet", }; $mech->submit_form_ok( { with_fields => $fields } ); is $mech->uri->path, '/admin/manifesttheme/tfl', "stayed on edit page"; }; }; FixMyStreet::override_config { ALLOWED_COBRANDS => [ 'fixamingata' ], }, sub { ok $mech->host("www.fixamingata.se"), "change host to FixaMinGata"; subtest "single cobrand behaves correctly" => sub { FixMyStreet::DB->resultset('ManifestTheme')->delete_all; is( FixMyStreet::DB->resultset('ManifestTheme')->count, 0, "themes all deleted" ); $mech->get_ok("/admin/manifesttheme"); is $mech->uri->path, '/admin/manifesttheme/create', "redirected to create page"; my $fields = { name => "FixaMinGata Theme Test", short_name => "FixaMinGata Short Name", cobrand => "fixamingata", }; $mech->submit_form_ok( { with_fields => $fields } ); is $mech->uri->path, '/admin/manifesttheme/fixamingata', "redirected to edit form page"; $mech->content_contains("FixaMinGata Theme Test"); $mech->content_contains("FixaMinGata Short Name"); is( FixMyStreet::DB->resultset('ManifestTheme')->count, 1, "theme added" ); my $theme = FixMyStreet::DB->resultset('ManifestTheme')->find({ cobrand => 'fixamingata' }); is $theme->name, "FixaMinGata Theme Test"; }; }; done_testing();