Files
lutim/t/test.t
2023-12-17 09:51:06 +01:00

167 lines
5.3 KiB
Perl

# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
use Mojo::Base -strict;
use Mojo::File;
use Mojo::JSON qw(true false);
use Mojolicious;
use Test::More;
use Test::Mojo;
use FindBin qw($Bin);
use Digest::file qw(digest_file_hex);
use IO::Uncompress::Unzip qw($UnzipError);
my ($m, $cfile);
BEGIN {
use lib 'lib';
$m = Mojolicious->new;
$cfile = Mojo::File->new($Bin, '..' , 'lutim.conf');
if (defined $ENV{MOJO_CONFIG}) {
$cfile = Mojo::File->new($ENV{MOJO_CONFIG});
unless (-e $cfile->to_abs) {
$cfile = Mojo::File->new($Bin, '..', $ENV{MOJO_CONFIG});
}
}
my $config = $m->plugin('Config' =>
{
file => $cfile->to_abs->to_string,
default => {
provisioning => 100,
provis_step => 5,
length => 8,
always_encrypt => 0,
anti_flood_delay => 5,
max_file_size => 10*1024*1024,
https => 0,
proposed_delays => '0,1,7,30,365',
default_delay => 0,
max_delay => 0,
token_length => 24,
crypto_key_length => 8,
thumbnail_size => 100,
theme => 'default',
dbtype => 'sqlite',
db_path => 'lutim.db',
max_files_in_zip => 15,
prefix => '/',
minion => {
enabled => 0,
dbtype => 'sqlite',
db_path => 'minion.db'
},
cache_max_size => 0,
memcached_servers => [],
quiet_logs => 0,
disable_img_stats => 0,
x_frame_options => 'DENY',
x_content_type_options => 'nosniff',
x_xss_protection => '1; mode=block',
}
}
);
$m->plugin('Lutim::Plugin::Helpers');
}
# Home page
my $t = Test::Mojo->new('Lutim');
$t->get_ok('/')
->status_is(200)
->content_like(qr/Let's Upload That IMage/i)
->header_is('Content-Security-Policy' => "base-uri 'self'; connect-src 'self'; default-src 'none'; font-src 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' data:; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'")
->header_is('X-Frame-Options' => 'DENY')
->header_is('X-XSS-Protection' => '1; mode=block')
->header_is('X-Content-Type-Options' => 'nosniff');
# Gzip static assets
$t->get_ok('/css/lutim.css')
->status_is(200)
->header_is(Vary => 'Accept-Encoding');
# Instance settings informations
$t->get_ok('/infos')
->status_is(200)
->json_has('/image_magick')
->json_is(
'/always_encrypt' => false,
'/broadcast_message' => 'test broadcast message',
'/contact' => 'John Doe, admin[at]example.com',
'/default_delay' => 30,
'/max_delay' => 200,
'/max_file_size' => 1048576,
'/upload_enabled' => true
);
# Post image
my $image = Mojo::File->new($Bin, '..', 'themes', 'default', 'public', 'img', 'Lutim.png')->to_string;
$t->post_ok('/' => form => { file => { file => $image }, format => 'json' })
->status_is(200)
->json_has('/msg', '/success')
->json_is('/success' => true, '/msg/filename' => 'Lutim.png')
->json_like('/msg/short' => qr#[-_a-zA-Z0-9]{8}#, '/msg/real_short' => qr#[-_a-zA-Z0-9]{8}#, '/msg/token' => qr#[-_a-zA-Z0-9]{24}#);
# Post delete-at-first-view image
my $raw = $t->ua->post('/' => form => { file => { file => $image }, 'first-view' => 1, format => 'json' })->res;
my $short = $raw->json('/msg/short');
$t->get_ok('/'.$short)
->status_is(200);
$t->get_ok('/'.$short)
->status_is(302);
# Get zip file and test it
$t->get_ok('/zip?i='.$short)
->status_is(200)
->header_is('Content-Disposition' => 'attachment;filename=images.zip');
my $zip = $t->ua->get('/zip?i='.$short)->res->body;
my $u = new IO::Uncompress::Unzip \$zip
or die "Cannot open zip file: $UnzipError";
my $status;
my @files = qw(hosted_with_lutim.png images/ images/Lutim.png.txt);
for ($status = 1; $status > 0; $status = $u->nextStream()) {
my $name = $u->getHeaderInfo()->{Name};
is($name, shift(@files));
my $buff;
while (($status = $u->read($buff)) > 0) {
}
last if $status < 0;
}
# Delete image with token
$raw = $t->ua->post('/' => form => { file => { file => $image }, format => 'json' })->res;
my $rshort = $raw->json('/msg/real_short');
my $token = $raw->json('/msg/token');
$t->get_ok('/'.$rshort)
->status_is(200);
$t->get_ok('/d/'.$rshort.'/'.$token, form => { _format => 'json' })
->status_is('200')
->json_is(
{
success => true,
msg => 'The image Lutim.png has been successfully deleted'
}
);
$t->get_ok('/'.$rshort)
->status_is(302);
$t->app->minion->perform_jobs if $t->app->config('minion')->{enabled};
# Get image counter
$t->post_ok('/c', form => { short => $rshort, token => $token })
->status_is(200)
->json_is(
{
success => true,
counter => 1,
enabled => false
}
);
done_testing();