=head1 Name

rtmails


=head1 Ziel

Testen der korrekten Zustellung von Mails an das RT via "rtmail"


=cut


package Test::rtmail;
use utf8;
use warnings;
use strict; use warnings;
use utf8;
BEGIN { unshift(@INC,($ENV{'POPHOME'}||'@POPHOME@').'/lib')
			unless $ENV{'KUNDE_NO_PERLPATH'};
      }

my @tests;
BEGIN {
	my $num=0;
	if($ENV{'TEST'}) {
		@tests = split(/\s+/,$ENV{'TEST'});
	} else {
		open(F,"git ls-files test/mails/rt |");
		while(<F>) {
			chomp;
			next if m#^\.#;
			push(@tests,$_);
		}
		close(F);
	}

}
use Test::More tests => 3*@tests+3; $|=1;
use Dbase::Test;

use Data::Dumper;
use Dbase::Help qw(DoFn Do qquote DoTrans);
use Dbase::Globals qw(find_descr);
use Fehler qw(ffehler fehler);
use Cf qw($MAILDOM $WDESCR $RT_MAIL_OK);
use Dbase::MailTest qw(useHash %stdhash rep);
use Loader qw(ticket_delete);
use RT;
use RT::database;
use RT::database::manipulate qw(add_new_request);
use UTFkram qw(decode_anything);
use RT::ui::mail;

RT::initialize;

my $ticketid;
my $tsubj = "TEST: Mails an das RT";
{
	{
		my $tid = DoFn("select id from ticket where subject=${\qquote $tsubj}");
		if($tid) {
			okS "lösche Altlast-Ticket",sub{ticket_delete($tid)};
		} else {
			pass("kein Altlast-Ticket");
		}
	}

	okS "Neues Ticket",sub{
			my($trans,$res);
			($ticketid,$trans,$res)=add_new_request(CGI->new({
				queue=>"test",
				subject=>$tsubj,
				kunde=>"tickettest",
				requestors=>"bla\@unbekannt.$MAILDOM, $ENV{'USER'}",
				auth_user=>$ENV{'USER'}}),<<END);
Content-Type: text/plain
Content-Transfer-Encoding: 8bit

Dies ist ein Test-Ticket für Mails an das RT.

Bitte geflissentlich zu ignorieren. ;-)

END
			fehler "Create:$res" unless $ticketid;
			};
}


ok($ticketid>0,"Ticket-ID für $tsubj");

my %t = ( 
	_TICKET_NR_ => $ticketid,
	%stdhash
);
useHash(%t);

my $tmp = "/tmp/test.$$";
my $seq = 0;

sub one($) {
	my($m)=@_;
	$t{'_SOME_ID_'} = sprintf("xid.%x.%x.%s.%x",time,$$,$WDESCR,$seq++),
	print "#####\n# $m\n";
	my $oseq = DoFn("select maxseq from ticket where id = $ticketid");

	ffehler {
		open(I,$m) or fehler($!);
		binmode(I,":raw");
		open(O,">",$tmp);
		binmode(O,":raw");
		while(<I>) {
    		s/\@([_A-Z][_A-Z0-9]+)\@/defined $t{$1} ? $t{$1} : fehler "Unbekannt: $1"/eg;
    		$_ = rep($_);
			print O $_;
		}
		close(I);
		close(O);
	
		open(STDIN,"<",$tmp);
		@ARGV = ($ticketid,"comment");
		my $rc;
		my @res = RT::ui::mail::read_mail_from_stdin(0);
		DoTrans { $rc = RT::ui::mail::_activate(@res); };
		is($rc,$RT_MAIL_OK,"Mail akzeptiert");
	} sub {
		fail "$m: @_";
	};
	unlink($tmp);

	my $seq = DoFn("select maxseq from ticket where id = $ticketid");
	while($seq > $oseq) {
		my($typ,$data) = DoFn("select typ,inhalt from ticketid where ticket=$ticketid and seq=$seq");
		if($typ == find_descr("tickett","comments")) {
			pass("neuer Tickettext \@$seq");
			like(decode_anything($data),qr/äöüß/,"Ticketdaten mit sauberen Umlauten");
			return;
		}
	} continue {
		--$seq;
	}
	fail("kein neuer Tickettext nach $ticketid/$oseq");
	fail("... und natuerlich kein Umlaut");
}

foreach my $test(sort @tests) {
	one($test);
}
