=head1 Name

dbtest


=head1 Ziel

Testen des nextid-Interface


=head1 Testfälle

Es wird getestet:


=head2 okQ / okF / okS

Die Routinen, mit denen das Testsystem die Datenbankzugriffe steuert


=head2 Do, DoFn, DoSeq

Grundlegende Datenbankroutinen

=head2 DoReadOnly

Blocken von Schreibzugriffen

=head2 %SEQ%foo%

Die String-Replace-Funktion des Testsystems, exemplarisch


=head2

Grundlegende Fehlerbehandlung


=head1 nicht-Testfälle

Folgende Dinge sind noch nicht im Test:

=over 4

=item *

alle anderen Datenbankzugriffsroutinen

=item *

der übrige Kram aus Dbase::Help

=item *

=back


=head1 Grenzen

Die anderen String-Replace-Funktionen des Testsystems können hier
mangels Datenbankinhalt noch nicht ausprobiert werden. Probleme damit
werden aber mit Sicherheit in den Tests zu Tage treten, in denen sie
verwendet werden.

=back


=cut


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


use Test::More tests => 18; $|=1;
use Dbase::Test;
use Dbase::Help qw(Do DoFn DoReadOnly DoSel DoSeq);
use Fehler qw(ffehler);


okF "delete from nextid where name like 'id_test%'";

okQ "select id from nextid where name='id_test'"; # leer!
okS "insert test2", sub{ Do "insert into nextid set id=".DoSeq("id_test").", name='id_test2'"; };
okF "insert into nextid set id=%SEQ%id_test%, name='id_test3'";

okQ "select id from nextid where name='id_test'",2;
okQ "select id,name from nextid where name='id_test2'",1,'id_test2';
okS "test id3",sub{is(DoFn("select id from nextid where name='id_test3'"),2,"Check test3");};

okQ "select count(*) from nextid where name like 'id_test%'",3;


# Nun prüfen wir, ob SQL-Fehler dazu führen, dass vernünftige
# Fehlermeldungen generiert werden.

ffehler {
	my $x=DoFn("select id from nextid where name like 'id_test%'");
	fail("DoFn with multiple values");
	fail("dummy");
} sub {
	like("@_",qr/select id from nextid/i,"returned statement");
	like("@_",qr/returned \d+ rows/i,"returned foo rows");
};

ffehler {
	DoReadOnly {
		DoSeq("id_test");
		fail("R/O ging nicht");
		fail("dummy");
		fail("dummy");
	};
} sub {
	ok("R/O ging");
	okQ "select id from nextid where name='id_test'",2;
	DoSeq("id_test");
	okQ "select id from nextid where name='id_test'",3;
};

ffehler {
	my $y=DoFn("select this_causes_an_error");
	fail("no error in bad_select");
	fail("dummy");
} sub {
	like("@_",qr/select this_causes/i,"returned statement");
	like("@_",qr/select id from nextid/i,"returned old statement");
};

ffehler {
	my $z=DoFn("this_causes_an_error_too");
	fail("no error in bad_statement");
} sub {
	pass("error in bad_statement");
};

my $rows_wanted = 2;
is( DoSel("SELECT * FROM nextid LIMIT $rows_wanted")->rows,
	$rows_wanted, '->rows funktioniert' );
