packages feed

hssqlppp-0.2.0: Database/HsSqlPpp/Tests/ExtensionTests.lhs

Copyright 2009 Jake Wheat

Set of tests for the extensions

> {-# LANGUAGE RankNTypes,FlexibleContexts #-}

> module Database.HsSqlPpp.Tests.ExtensionTests (extensionTests) where

> import Test.HUnit
> import Test.Framework
> import Test.Framework.Providers.HUnit
> --import Debug.Trace

> import Database.HsSqlPpp.Parsing.Parser
> import Database.HsSqlPpp.Ast.Annotation
> import Database.HsSqlPpp.Extensions.ChaosExtensions
> import Database.HsSqlPpp.Ast.Ast
> --import Database.HsSqlPpp.PrettyPrinter.PrettyPrinter

> extensionTests :: Test.Framework.Test
> extensionTests =
>   testGroup "extensionTests" (mapCheckExtension [
>     t rewriteCreateVars
>       "select create_var('varname','vartype');"
>       "create table varname_table (\n\
>       \  varname vartype);\n\
>       \create function get_varname() returns vartype as $a$\n\
>       \  select * from varname_table;\n\
>       \$a$ language sql stable;\n\
>       \create function check_con_varname_table_varname_key() returns boolean as $a$\n\
>       \begin\n\
>       \  return true;\n\
>       \end;\n\
>       \$a$ language plpgsql stable;\n\
>       \/*drop function if exists varname_table_constraint_trigger_operator();\n\
>       \create function varname_table_constraint_trigger_operator() returns trigger as $a$\n\
>       \begin\n\
>       \  null;\n\
>       \end;\n\
>       \$a$ language plpgsql;*/\n\
>       \create function check_con_varname_table_01_tuple() returns boolean as $a$\n\
>       \begin\n\
>       \  return true;\n\
>       \end;\n\
>       \$a$ language plpgsql stable;\n\
>       \drop function if exists varname_table_constraint_trigger_operator();\n\
>       \create function varname_table_constraint_trigger_operator() returns trigger as $a$\n\
>       \begin\n\
>       \  null;\n\
>       \end;\n\
>       \$a$ language plpgsql;"

>    ,t addReadonlyTriggers
>       "select set_relvar_type('stuff','readonly');"
>       "create function check_stuff_d_readonly() returns trigger as $a$\n\
>       \begin\n\
>       \  if (not (false)) then\n\
>       \    raise exception 'delete on base_relvar_metadata violates transition constraint base_relvar_metadata_d_readonly';\n\
>       \  end if;\n\
>       \return null;\n\
>       \end;\n\
>       \$a$ language plpgsql volatile;\n\
>       \create function check_stuff_i_readonly() returns trigger as $a$\n\
>       \begin\n\
>       \  if (not (false)) then\n\
>       \       raise exception 'delete on base_relvar_metadata violates transition constraint base_relvar_metadata_d_readonly';\n\
>       \  end if;\n\
>       \  return null;\n\
>       \end;\n\
>       \$a$ language plpgsql volatile;\n\
>       \create function check_stuff_u_readonly() returns trigger as $a$\n\
>       \begin\n\
>       \  if (not (false)) then\n\
>       \       raise exception 'delete on base_relvar_metadata violates transition constraint base_relvar_metadata_d_readonly';\n\
>       \  end if;\n\
>       \  return null;\n\
>       \end;\n\
>       \$a$ language plpgsql volatile;"

>    ,t createClientActionWrapper
>       "select create_client_action_wrapper('actname', $$actcall()$$);"
>       "create function action_actname() returns void as $a$\n\
>       \begin\n\
>       \  perform action_actcall();\n\
>       \end;\n\
>       \$a$ language plpgsql;"
>    ,t createClientActionWrapper
>       "select create_client_action_wrapper('actname', $$actcall('test')$$);"
>       "create function action_actname() returns void as $a$\n\
>       \begin\n\
>       \  perform action_actcall('test');\n\
>       \end;\n\
>       \$a$ language plpgsql;"
>    ,t addNotifyTriggers
>       "select set_relvar_type('stuff','data');"
>       "create function stuff_changed() returns trigger as $a$\n\
>       \begin\n\
>       \  notify stuff;\n\
>       \  return null;\n\
>       \end;\n\
>       \$a$ language plpgsql;"
>    ,t addConstraint
>       "select add_constraint('name', 'true', array['t1', 't2']);"
>       "create function check_con_name() returns boolean as $a$\n\
>       \begin\n\
>       \  return true;\n\
>       \end;\n\
>       \$a$ language plpgsql stable;\n\
>       \drop function if exists t1_constraint_trigger_operator();\n\
>       \create function t1_constraint_trigger_operator() returns trigger as $a$\n\
>       \begin\n\
>       \  null;\n\
>       \end;\n\
>       \$a$ language plpgsql;\n\
>       \drop function if exists t2_constraint_trigger_operator();\n\
>       \create function t2_constraint_trigger_operator() returns trigger as $a$\n\
>       \begin\n\
>       \  null;\n\
>       \end;\n\
>       \$a$ language plpgsql;"
>    ,t addKey
>       "select add_key('tbl', 'attr');"
>       "create function check_con_tbl_attr_key() returns boolean as $a$\n\
>       \begin\n\
>       \  return true;\n\
>       \end;\n\
>       \$a$ language plpgsql stable;\n\
>       \/*drop function if exists tbl_constraint_trigger_operator();\n\
>       \create function tbl_constraint_trigger_operator() returns trigger as $a$\n\
>       \begin\n\
>       \  null;\n\
>       \end;\n\
>       \$a$ language plpgsql;*/"
>    ,t addKey
>       "select add_key('tbl', array['attr1','attr2']);"
>       "create function check_con_tbl_attr1_attr2_key() returns boolean as $a$\n\
>       \begin\n\
>       \  return true;\n\
>       \end;\n\
>       \$a$ language plpgsql stable;\n\
>       \/*drop function if exists tbl_constraint_trigger_operator();\n\
>       \create function tbl_constraint_trigger_operator() returns trigger as $a$\n\
>       \begin\n\
>       \  null;\n\
>       \end;\n\
>       \$a$ language plpgsql;*/"
>    ,t zeroOneTuple
>       "select constrain_to_zero_or_one_tuple('tbl');"
>       "create function check_con_tbl_01_tuple() returns boolean as $a$\n\
>       \begin\n\
>       \  return true;\n\
>       \end;\n\
>       \$a$ language plpgsql stable;\n\
>       \drop function if exists tbl_constraint_trigger_operator();\n\
>       \create function tbl_constraint_trigger_operator() returns trigger as $a$\n\
>       \begin\n\
>       \  null;\n\
>       \end;\n\
>       \$a$ language plpgsql;"


add_foreign_key
constrain zero one
add constraint

>    ])

>   where
>     t a b c = (a,b,c)
>     mapCheckExtension = map (\(a,b,c) ->  checkExtension a b c)
>     checkExtension :: (StatementList -> StatementList) -> String -> String -> Test.Framework.Test
>     checkExtension f stxt ttxt = testCase ("check " ++ stxt) $
>       case (do
>             sast <- parseSql "" stxt
>             let esast = f sast
>             --trace (printSql esast) $ return ()
>             tast <- parseSql "" ttxt
>             return (tast,esast)) of
>         Left e -> assertFailure $ show e
>         Right (ts,es) -> assertEqual "" (stripAnnotations ts) (stripAnnotations es)