=head1 Name

rt


=head1 Ziel

Testen grundlegender RT-Funktionen


=head1 Tests

Es wird getestet:

=over 4

=item *

RT-Initialisierung

=item *

Anlegen eines Tickets

=item *

Update von Kunde und Subject

=back

=head1 nicht-Testfälle

Folgende Dinge sind noch nicht im Test:

=over 4

=item *

Alle anderen Update-Funktionen

=item *

Sicherstellen, dass die Update-Records in der ticketid-Tabelle korrekt sind

=item *

Mailfunktionen

=item *

Seiteneffekte, z.B. Ticket-geht-auf (beim Einstellen eines neuen Kommentars 
oder beim Resolven eines verbundenen Tickets)

=back


=head1 Grenzen

Folgende Dinge können hier nicht getestet werden:

=over 

=item *

RT an sich, d.h. das gesamte HTTP-Frontend

=back


=cut


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

use Test::More tests => 59; $|=1;
use Dbase::Test;
use Dbase::MailTest qw(rep);

use Dbase::Help qw(DoFn Do);
use Cf qw($MAILDOM);
use Dbase::Globals qw(gen_descr get_kunde);
#use Fehler qw();
use Loader qw(add_dienst writer);

use RT;
use RT::database;
use RT::database::manipulate qw(add_new_request
	change_kunde change_subject);
use Loader qw(delete_kunde);
use CGI qw();
use Fehler qw(fehler);

ok(!$Db::RT_done,"RT ist noch nicht initialisiert");
okS "RT-init",sub {RT::initialize(); $Db::RT_done++};

# Putze Tickets etc.
okF "delete from ticketid";
okF "delete from ticketadr";
okF "delete from ticketlast";

okF "update ticket set ticket=NULL";
okF "delete from ticket";

okF "delete from nextid where name='ticketid'";
okF "delete from nextid where name='ticket'";


# kunde-Interface 
if(DoFn("select id from dienst where name='general'")) {
	pass "Dienst 'general' is schon";
} else {
	okF "insert into dienst set name='general', info='der ganze Rest'";
}


okS "mailart//unbekannt",sub {gen_descr("mailart",0,"unbekannt","sollte nicht vorkommen","hide")};
foreach my $i(qw(
		email fax sms telefon)) {
	okS "mailart//$i",sub {gen_descr("mailart",undef,$i)};
}
okS "tickets//im_otrs",sub {gen_descr("tickets",undef,"im_otrs")};

okF "delete from rt_template";

foreach my $i(qw(
		autoreply comment correspondence error give respond steal
		transaction web_create form_comment form_reply remail
		docushare)) {
	okS "rt_template//$i",sub {gen_descr("rt_template",undef,$i)};
	okF "insert into rt_template set name='$i', inhalt='Dies.ist die.Template fuer RT:.$i.'"
}


{
	my $tkid = DoFn("select id from kunde where name = 'tickettest'");
	if($tkid) {
		okS "Kunde löschen",sub {delete_kunde($tkid,3);};
	} else {
		pass("Tickettest-Kunde nicht vorhanden");
	}
}
okF "insert into kunde set name='tickettest'";

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

Dies ist ein Test-Test.
END
		fehler "Create:$res" unless $ticket;
		};
okQ "select count(*) from ticket",1;
okQ "select kunde from ticket where id=$ticket",1;

sub cht(&$$$) {
	my($proc,$inf,$name,$wert) = @_;
	my $max = DoFn("select maxseq from ticket where id = $ticket");
	&okS($inf,$proc);
	isnt(DoFn("select maxseq from ticket where id = $ticket"),$max,"keine Änderung?");
	okQ("select $name from ticket where id=$ticket",$wert);
}

my $new_kunde = 'tickettest';
cht { change_kunde( $ticket, get_kunde($new_kunde), $ENV{USER} );
     }"Ticket-Kunde","kunde","%KUNDE%tickettest%";

my $new_subject = 'TestFoo 123';
cht { change_subject( $ticket, $new_subject, $ENV{USER} ) } "Ticket-Subject",
  "subject", $new_subject;


my $log="/tmp/ttest.$$";
writer(rep(<<'_'),$log);
From: Tester@joe.test.example
Message-Id: <@_SOME_ID_@test.example>
Date:   Thu, 7 Dec 2000 23:29:36 +0100

Dies ist ein Test des rtmail-Programms.
_

$ENV{'RT_MAIL_OK'} = 0;
my $rtmail = (defined $DB::single)
	? $ENV{'REAL_TEST'}
		? "perl -d /usr/pop/rt/bin/rtmail"
		: "perl -d rt/bin/rtmail.pl"
	: $ENV{'REAL_TEST'}
		? "/usr/pop/rt/bin/rtmail"
		: "perl rt/bin/rtmail.pl";
sys("$rtmail $ticket comment < $log 2>&1");

my $max = DoFn("select maxseq from ticket where id = $ticket");
my $txt = DoFn("select inhalt from ticketid where ticket = $ticket and seq=$max");
like($txt,qr/^Dies ist ein Test/m, "der Inhalt");

unlink($log);

$ENV{TICKET_BACKENDS} = 'RT';
require noris::Ticket::API;
my $conn = noris::Ticket::API->get_pooled_connection;
ok( scalar $conn->get_ticket($ticket), 'Ticket-API: Ticket gefunden' );
my ( $title, $kunde ) = $conn->get_ticket( $ticket, [qw(title kunde)] );
is( $title, $new_subject, 'Ticket-API: Subject stimmt' );
is( $kunde, $new_kunde,   'Ticket-API: Kunde stimmt' );

exit 0;
