first test
[m6w6/pq-gateway] / tests / setup.inc
1 <?php
2
3 use pq\Connection;
4 use pq\Gateway\Table;
5 use pq\Mapper\Map;
6 use pq\Mapper\MapInterface;
7 use pq\Mapper\Mapper;
8 use pq\Query\ExecutorInterface;
9 use pq\Query\Writer;
10
11 ini_set("date.timezone", "UTC");
12 ini_set("error_reporting", E_ALL);
13
14 define("PQ_TEST_DSN", getenv("PQ_TEST_DSN"));
15
16 const PQ_TEST_SETUP_SQL = <<<SQL
17 create extension if not exists hstore;
18
19 drop table if exists test cascade;
20 create table test (
21 id serial primary key,
22 created timestamp,
23 counter int,
24 number decimal,
25 data text,
26 list int[],
27 prop hstore
28 );
29
30 drop table if exists reftest cascade;
31 create table reftest (
32 test_id integer not null references test on delete cascade,
33 another_test_id integer not null references test on delete cascade
34 );
35
36 insert into test values (default, 'yesterday', -1, -1.1, 'yesterday', '{-1,0,1}');
37 insert into test values (default, 'today', 0, 0, 'today', '{0,1,2}');
38 insert into test values (default, 'tomorrow', 1, 1.1, 'tomorrow', '{1,2,3}');
39
40 insert into reftest values (1,3);
41 insert into reftest values (2,2);
42 insert into reftest values (3,1);
43 SQL;
44
45 const PQ_TEST_TEARDOWN_SQL = <<<SQL
46 drop table if exists test cascade;
47 drop table if exists reftest cascade;
48 SQL;
49
50 require_once __DIR__ . "/../vendor/autoload.php";
51
52 function executeInConcurrentTransaction(ExecutorInterface $exec, $sql, array $params = null) {
53 $conn = $exec->getConnection();
54 $exec->setConnection(new Connection(PQ_TEST_DSN));
55 $exec->execute(new Writer($sql, $params), function(){});
56 $exec->setConnection($conn);
57 }
58
59 class QueryLogger implements SplObserver
60 {
61 protected $fp;
62
63 function __construct($logfile = null) {
64 if (!isset($logfile)) {
65 $logfile = __DIR__."/query.log";
66 }
67 if (!$this->fp = @fopen($logfile, "a")) {
68 throw new RuntimeException(error_get_last()["message"]);
69 }
70 }
71
72 function __destruct() {
73 if (is_resource($this->fp)) {
74 fclose($this->fp);
75 }
76 }
77
78 function update(SplSubject $executor) {
79 $result = $executor->getResult();
80 if (isset($result)) {
81 fprintf($this->fp, "[%s] R %s\n",
82 date_create()->format("Y-m-d H:i:s"),
83 json_encode($result));
84 } elseif (($query = $executor->getQuery())) {
85 fprintf($this->fp, "[%s] Q %s %% %s\n",
86 date_create()->format("Y-m-d H:i:s"),
87 preg_replace("/\s+/", " ", $query),
88 json_encode($query->getParams()));
89 }
90 }
91 }
92
93 class TestModel implements JsonSerializable {
94 private $id, $created, $counter, $number, $data, $list, $prop;
95
96 function jsonSerialize() {
97 return get_object_vars($this);
98 }
99
100 /**
101 * @param Mapper $mapper
102 * @return MapInterface
103 */
104 static function mapAs(Mapper $mapper) {
105 return new Map(
106 __CLASS__,
107 new Table("test"),
108 $mapper->mapField("id"),
109 $mapper->mapField("created"),
110 $mapper->mapField("counter"),
111 $mapper->mapField("number"),
112 $mapper->mapField("data"),
113 $mapper->mapField("list"),
114 $mapper->mapField("prop")
115 );
116 }
117 }