#!/usr/bin/perl -T

use lib '.'; use lib 't';
use SATest; sa_t_init("decodeshorturl");

use Test::More;

use constant HAS_LWP_USERAGENT => eval { require LWP::UserAgent; require LWP::Protocol::https; };
use constant HAS_DBI => eval { require DBI; };
use constant HAS_DBD_SQLITE => eval { require DBD::SQLite; DBD::SQLite->VERSION(1.59_01); };

use constant SQLITE => (HAS_DBI && HAS_DBD_SQLITE);

plan skip_all => "Net tests disabled"                unless conf_bool('run_net_tests');
plan skip_all => "LWP::Protocol::https required to run this test" unless HAS_LWP_USERAGENT;
my $tests = 11;
$tests += 4 if (SQLITE);
plan tests => $tests;

tstpre ("
loadplugin Mail::SpamAssassin::Plugin::DecodeShortURLs
");

tstprefs(q{
dns_query_restriction allow bit.ly
dns_query_restriction allow tinyurl.com

clear_url_shortener
url_shortener tinyurl.com
url_shortener .page.link
url_shortener_get bit.ly

body HAS_SHORT_URL              eval:short_url()
body HAS_SHORT_REDIR            eval:short_url_redir()
body SHORT_URL_CHAINED          eval:short_url_chained()
body SHORT_URL_404		eval:short_url_404()
body SHORT_URL_C404		eval:short_url_code('404')
uri URI_BITLY_BLOCKED		m,^https://bitly\.com/a/blocked,
uri URI_PAGE_LINK		m,^https://spamassassin\.apache\.org/news\.html,
});

###
### Basic functions, no caching
###

%patterns = (
   q{ 1.0 HAS_SHORT_URL } => '',
   q{ 1.0 HAS_SHORT_REDIR } => '',
   q{ 1.0 SHORT_URL_404 } => '',
   q{ 1.0 SHORT_URL_C404 } => '',
   q{ 1.0 URI_BITLY_BLOCKED } => '',
   q{ 1.0 URI_PAGE_LINK } => '',
);
sarun ("-t < data/spam/decodeshorturl/base.eml", \&patterns_run_cb);
ok_all_patterns();

%patterns = (
   q{ 1.0 SHORT_URL_CHAINED } => '',
);
sarun ("-t < data/spam/decodeshorturl/chain.eml", \&patterns_run_cb);
ok_all_patterns();

sarun ("-t < data/spam/decodeshorturl/doubleslash.eml", \&patterns_run_cb);
ok_all_patterns();

###
### short_url() should hit even without network enabled
###

%patterns = (
   q{ 1.0 HAS_SHORT_URL } => '',
);
sarun ("-t -L < data/spam/decodeshorturl/base.eml", \&patterns_run_cb);
ok_all_patterns();

%patterns = (
   'https://tinyurl.com/jf8wv76t => https://spamassassin.apache.org/'
);

sarun ("-D DecodeShortURLs -t < data/spam/decodeshorturl/anchor.eml 2>&1", \&patterns_run_cb);
ok_all_patterns();

sarun ("-D DecodeShortURLs -t < data/spam/decodeshorturl/params.eml 2>&1", \&patterns_run_cb);
ok_all_patterns();

###
### With SQLITE caching
###

if (SQLITE) {

tstprefs("
dns_query_restriction allow bit.ly
dns_query_restriction allow tinyurl.com

url_shortener bit.ly
url_shortener tinyurl.com

url_shortener_cache_type dbi
url_shortener_cache_dsn dbi:SQLite:dbname=$workdir/DecodeShortURLs.db

body HAS_SHORT_URL              eval:short_url()
describe HAS_SHORT_URL          Message contains one or more shortened URLs
");

%patterns = (
   q{ 1.0 HAS_SHORT_URL } => '',
);
sarun ("-t < data/spam/decodeshorturl/base.eml", \&patterns_run_cb);
ok_all_patterns();

my $dbh = DBI->connect("dbi:SQLite:dbname=$workdir/DecodeShortURLs.db","","");
my @row = $dbh->selectrow_array("SELECT decoded_url FROM short_url_cache WHERE short_url = 'http://bit.ly/30yH6WK'");
is($row[0], 'http://spamassassin.apache.org/');

# Check another email to cleanup old entries from database
sarun ("-t < data/spam/decodeshorturl/base2.eml", \&patterns_run_cb);
ok_all_patterns();

$dbh = DBI->connect("dbi:SQLite:dbname=$workdir/DecodeShortURLs.db","","");
@row = $dbh->selectrow_array("SELECT decoded_url FROM short_url_cache WHERE short_url = 'http://bit.ly/30yH6WK'");
isnt($row[0], 'https://spamassassin.apache.org/');

}

