.\" Automatically generated by Pod::Man 4.10 (Pod::Simple 3.35) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "TAP::Parser::SourceHandler::pgTAP 3pm" .TH TAP::Parser::SourceHandler::pgTAP 3pm "2019-03-04" "perl v5.28.1" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "Name" .IX Header "Name" TAP::Parser::SourceHandler::pgTAP \- Stream \s-1TAP\s0 from pgTAP test scripts .SH "Synopsis" .IX Header "Synopsis" In \fIBuild.PL\fR for your application with pgTAP tests in \fIt/*.pg\fR: .PP .Vb 10 \& Module::Build\->new( \& module_name => \*(AqMyApp\*(Aq, \& test_file_exts => [qw(.t .pg)], \& use_tap_harness => 1, \& tap_harness_args => { \& sources => { \& Perl => undef, \& pgTAP => { \& dbname => \*(Aqtry\*(Aq, \& username => \*(Aqpostgres\*(Aq, \& suffix => \*(Aq.pg\*(Aq, \& }, \& } \& }, \& build_requires => { \& \*(AqModule::Build\*(Aq => \*(Aq0.30\*(Aq, \& \*(AqTAP::Parser::SourceHandler::pgTAP\*(Aq => \*(Aq3.19\*(Aq, \& }, \& )\->create_build_script; .Ve .PP If you're using \f(CW\*(C`prove\*(C'\fR: .PP .Vb 5 \& prove \-\-source Perl \e \& \-\-ext .t \-\-ext .pg \e \& \-\-source pgTAP \-\-pgtap\-option dbname=try \e \& \-\-pgtap\-option username=postgres \e \& \-\-pgtap\-option suffix=.pg .Ve .PP If you have only pgTAP tests, just use \f(CW\*(C`pg_prove\*(C'\fR: .PP .Vb 1 \& pg_prove \-\-dbname try \-\-username postgres .Ve .PP Direct use: .PP .Vb 2 \& use TAP::Parser::Source; \& use TAP::Parser::SourceHandler::pgTAP; \& \& my $source = TAP::Parser::Source\->new\->raw(\e\*(Aqmytest.pg\*(Aq); \& $source\->config({ pgTAP => { \& dbname => \*(Aqtesting\*(Aq, \& username => \*(Aqpostgres\*(Aq, \& suffix => \*(Aq.pg\*(Aq, \& }}); \& $source\->assemble_meta; \& \& my $class = \*(AqTAP::Parser::SourceHandler::pgTAP\*(Aq; \& my $vote = $class\->can_handle( $source ); \& my $iter = $class\->make_iterator( $source ); .Ve .SH "Description" .IX Header "Description" This source handler executes pgTAP tests. It does two things: .IP "1." 4 Looks at the TAP::Parser::Source passed to it to determine whether or not the source in question is in fact a pgTAP test (\*(L"can_handle\*(R"). .IP "2." 4 Creates an iterator that will call \f(CW\*(C`psql\*(C'\fR to run the pgTAP tests (\*(L"make_iterator\*(R"). .PP Unless you're writing a plugin or subclassing TAP::Parser, you probably won't need to use this module directly. .SS "Testing with pgTAP" .IX Subsection "Testing with pgTAP" If you just want to write tests with pgTAP , here's how: .IP "\(bu" 4 Build your test database, including pgTAP. It's best to install it in its own schema. To build it and install it in the schema \*(L"tap\*(R", do this (assuming your database is named \*(L"try\*(R"): .Sp .Vb 3 \& make TAPSCHEMA=tap \& make install \& psql \-U postgres \-d try \-f pgtap.sql .Ve .IP "\(bu" 4 Write your tests in files ending in \fI.pg\fR in the \fIt\fR directory, right alongside your normal Perl \fI.t\fR tests. Here's a simple pgTAP test to get you started: .Sp .Vb 1 \& BEGIN; \& \& SET search_path = public,tap,pg_catalog; \& \& SELECT plan(1); \& \& SELECT pass(\*(AqThis should pass!\*(Aq); \& \& SELECT * FROM finish(); \& ROLLBACK; .Ve .Sp Note how \f(CW\*(C`search_path\*(C'\fR has been set so that the pgTAP functions can be found in the \*(L"tap\*(R" schema. Consult the extensive pgTAP documentation for a comprehensive list of test functions. .IP "\(bu" 4 Run your tests with \f(CW\*(C`prove\*(C'\fR like so: .Sp .Vb 5 \& prove \-\-source Perl \e \& \-\-ext .t \-\-ext .pg \e \& \-\-source pgTAP \-\-pgtap\-option dbname=try \e \& \-\-pgtap\-option username=postgres \e \& \-\-pgtap\-option suffix=.pg .Ve .Sp This will run both your Perl \fI.t\fR tests and your pgTAP \fI.pg\fR tests all together. You can also use pg_prove to run just the pgTAP tests like so: .Sp .Vb 1 \& pg_prove \-d try \-U postgres t/ .Ve .IP "\(bu" 4 Once you're sure that you've got the pgTAP tests working, modify your \&\fIBuild.PL\fR script to allow \fI./Build test\fR to run both the Perl and the pgTAP tests, like so: .Sp .Vb 10 \& Module::Build\->new( \& module_name => \*(AqMyApp\*(Aq, \& test_file_exts => [qw(.t .pg)], \& use_tap_harness => 1, \& configure_requires => { \*(AqModule::Build\*(Aq => \*(Aq0.30\*(Aq, }, \& tap_harness_args => { \& sources => { \& Perl => undef, \& pgTAP => { \& dbname => \*(Aqtry\*(Aq, \& username => \*(Aqpostgres\*(Aq, \& suffix => \*(Aq.pg\*(Aq, \& }, \& } \& }, \& build_requires => { \& \*(AqModule::Build\*(Aq => \*(Aq0.30\*(Aq, \& \*(AqTAP::Parser::SourceHandler::pgTAP\*(Aq => \*(Aq3.19\*(Aq, \& }, \& )\->create_build_script; .Ve .Sp The \f(CW\*(C`use_tap_harness\*(C'\fR parameter is optional, since it's implicitly set by the use of the \f(CW\*(C`tap_harness_args\*(C'\fR parameter. All the other parameters are required as you see here. See the documentation for \f(CW\*(C`make_iterator()\*(C'\fR for a complete list of options to the \f(CW\*(C`pgTAP\*(C'\fR key under \f(CW\*(C`sources\*(C'\fR. .Sp And that's it. Now get testing! .SH "METHODS" .IX Header "METHODS" .SS "Class Methods" .IX Subsection "Class Methods" \fI\f(CI\*(C`can_handle\*(C'\fI\fR .IX Subsection "can_handle" .PP .Vb 1 \& my $vote = $class\->can_handle( $source ); .Ve .PP Looks at the source to determine whether or not it's a pgTAP test and returns a score for how likely it is in fact a pgTAP test file. The scores are as follows: .PP .Vb 5 \& 1 if it\*(Aqs not a file and starts with "pgsql:". \& 1 if it has a suffix equal to that in a "suffix" config \& 1 if its suffix is ".pg" \& 0.8 if its suffix is ".sql" \& 0.75 if its suffix is ".s" .Ve .PP The latter two scores are subject to change, so try to name your pgTAP tests ending in \*(L".pg\*(R" or specify a suffix in the configuration to be sure. .PP \fI\f(CI\*(C`make_iterator\*(C'\fI\fR .IX Subsection "make_iterator" .PP .Vb 1 \& my $iterator = $class\->make_iterator( $source ); .Ve .PP Returns a new TAP::Parser::Iterator::Process for the source. \&\f(CW\*(C`$source\->raw\*(C'\fR must be either a file name or a scalar reference to the file name \*(-- or a string starting with \*(L"pgsql:\*(R", in which case the remainder of the string is assumed to be \s-1SQL\s0 to be executed inside the database. .PP The pgTAP tests are run by executing \f(CW\*(C`psql\*(C'\fR, the PostgreSQL command-line utility. A number of arguments are passed to it, many of which you can affect by setting up the source source configuration. The configuration must be a hash reference, and supports the following keys: .ie n .IP """psql""" 4 .el .IP "\f(CWpsql\fR" 4 .IX Item "psql" The path to the \f(CW\*(C`psql\*(C'\fR command. Defaults to simply \*(L"psql\*(R", which should work well enough if it's in your path. .ie n .IP """dbname""" 4 .el .IP "\f(CWdbname\fR" 4 .IX Item "dbname" The database to which to connect to run the tests. Defaults to the value of the \f(CW$PGDATABASE\fR environment variable or, if not set, to the system username. .ie n .IP """username""" 4 .el .IP "\f(CWusername\fR" 4 .IX Item "username" The PostgreSQL username to use to connect to PostgreSQL. If not specified, no username will be used, in which case \f(CW\*(C`psql\*(C'\fR will fall back on either the \&\f(CW$PGUSER\fR environment variable or, if not set, the system username. .ie n .IP """host""" 4 .el .IP "\f(CWhost\fR" 4 .IX Item "host" Specifies the host name of the machine to which to connect to the PostgreSQL server. If the value begins with a slash, it is used as the directory for the Unix-domain socket. Defaults to the value of the \f(CW$PGDATABASE\fR environment variable or, if not set, the local host. .ie n .IP """port""" 4 .el .IP "\f(CWport\fR" 4 .IX Item "port" Specifies the \s-1TCP\s0 port or the local Unix-domain socket file extension on which the server is listening for connections. Defaults to the value of the \&\f(CW$PGPORT\fR environment variable or, if not set, to the port specified at the time \f(CW\*(C`psql\*(C'\fR was compiled, usually 5432. .ie n .IP """pset""" 4 .el .IP "\f(CWpset\fR" 4 .IX Item "pset" Specifies a hash of printing options in the style of \f(CW\*(C`\epset\*(C'\fR in the \f(CW\*(C`psql\*(C'\fR program. See the psql documentation for details on the supported options. .SH "See Also" .IX Header "See Also" .IP "\(bu" 4 TAP::Object .IP "\(bu" 4 TAP::Parser .IP "\(bu" 4 TAP::Parser::IteratorFactory .IP "\(bu" 4 TAP::Parser::SourceHandler .IP "\(bu" 4 TAP::Parser::SourceHandler::Executable .IP "\(bu" 4 TAP::Parser::SourceHandler::Perl .IP "\(bu" 4 TAP::Parser::SourceHandler::File .IP "\(bu" 4 TAP::Parser::SourceHandler::Handle .IP "\(bu" 4 TAP::Parser::SourceHandler::RawTAP .IP "\(bu" 4 pgTAP .SH "Support" .IX Header "Support" This module is managed in an open GitHub repository . Feel free to fork and contribute, or to clone \&\f(CW\*(C`git://github.com/theory/tap\-parser\-sourcehandler\-pgtap.git\*(C'\fR and send patches! .PP Found a bug? Please post or email a report! .SH "Author" .IX Header "Author" David E. Wheeler .SH "Copyright and License" .IX Header "Copyright and License" Copyright (c) 2010\-2018 David E. Wheeler. Some Rights Reserved. .PP This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.