1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
\unset ECHO
\i test/setup.sql
SET client_min_messages = warning;
CREATE SCHEMA whatever;
CREATE TABLE whatever.foo ( id serial primary key );
/*
Expected output:
runtests.out: 9.6 and up
runtests_1.out: 9.5
runtests_2.out: 9.3 - 9.4
runtests_3.out: 9.2
runtests_4.out: 9.1
*/
-- Make sure we get test function names.
SET client_min_messages = notice;
CREATE OR REPLACE FUNCTION whatever.startup() RETURNS SETOF TEXT AS $$
SELECT pass('starting up');
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION whatever.startupmore() RETURNS SETOF TEXT AS $$
SELECT pass('starting up some more');
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION whatever.setup() RETURNS SETOF TEXT AS $$
SELECT collect_tap(ARRAY[
pass('setup'),
(SELECT is( MAX(id), NULL, 'Should be nothing in the test table') FROM whatever.foo)
]);
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION whatever.setupmore() RETURNS SETOF TEXT AS $$
SELECT pass('setup more');
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION whatever.teardown() RETURNS SETOF TEXT AS $$
SELECT pass('teardown');
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION whatever.teardownmore() RETURNS SETOF TEXT AS $$
SELECT pass('teardown more');
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION whatever.shutdown() RETURNS SETOF TEXT AS $$
SELECT pass('shutting down');
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION whatever.shutdownmore() RETURNS SETOF TEXT AS $$
SELECT pass('shutting down more');
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION whatever.testthis() RETURNS SETOF TEXT AS $$
SELECT collect_tap(ARRAY[
pass('simple pass'),
pass('another simple pass')
]);
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION whatever.testplpgsql() RETURNS SETOF TEXT AS $$
BEGIN
RETURN NEXT pass( 'plpgsql simple' );
RETURN NEXT pass( 'plpgsql simple 2' );
INSERT INTO whatever.foo VALUES(1);
RETURN NEXT is( MAX(id), 1, 'Should be a 1 in the test table') FROM whatever.foo;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION whatever.testplpgsqldie() RETURNS SETOF TEXT AS $$
BEGIN
RETURN NEXT pass( 'plpgsql simple' ); -- Won't appear in results.
RETURN NEXT pass( 'plpgsql simple 2' ); -- Won't appear in results.
INSERT INTO whatever.foo VALUES(1);
RETURN NEXT is( MAX(id), 1, 'Should be a 1 in the test table') FROM whatever.foo;
IF pg_version_num() >= 90300 THEN
EXECUTE $E$
CREATE OR REPLACE FUNCTION __die() RETURNS VOID LANGUAGE plpgsql AS $F$
BEGIN
RAISE EXCEPTION 'This test should die, but not halt execution.
Note that in some cases we get what appears to be a duplicate context message, but that is due to Postgres itself.'
USING
DETAIL = 'DETAIL',
COLUMN = 'COLUMN',
CONSTRAINT = 'CONSTRAINT',
DATATYPE = 'TYPE',
TABLE = 'TABLE',
SCHEMA = 'SCHEMA';
END;
$F$;
$E$;
EXECUTE 'SELECT __die();';
ELSIF pg_version_num() >= 80400 THEN
EXECUTE $E$
CREATE OR REPLACE FUNCTION __die() RETURNS VOID LANGUAGE plpgsql AS $F$
BEGIN
RAISE EXCEPTION 'This test should die, but not halt execution.
Note that in some cases we get what appears to be a duplicate context message, but that is due to Postgres itself.'
USING DETAIL = 'DETAIL';
END;
$F$;
$E$;
EXECUTE 'SELECT __die();';
ELSE
RAISE EXCEPTION 'This test should die, but not halt execution';
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION whatever.testdividebyzero() RETURNS SETOF TEXT AS $$
select cast(1/0 as text)
$$ LANGUAGE sql;
CREATE OR REPLACE FUNCTION whatever.testy() RETURNS SETOF TEXT AS $$
SELECT fail('this test intentionally fails');
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION whatever.testz() RETURNS SETOF TEXT AS $$
SELECT is( MAX(id), NULL, 'Late test should find nothing in the test table') FROM whatever.foo;
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION whatever."test ident"() RETURNS SETOF TEXT AS $$
BEGIN
RETURN NEXT pass( 'ident' );
RETURN NEXT pass( 'ident 2' );
END;
$$ LANGUAGE plpgsql;
-- Run the actual tests. Yes, it's a one-liner!
SELECT * FROM runtests('whatever'::name);
-- Verify that startup, shutdown, etc aren't run as normal tests
SELECT * FROM runtests('whatever'::name, '.*') WHERE pg_version_num() >= 80300;
ROLLBACK;
|