1<?php
2
3namespace dokuwiki\plugin\struct\test;
4
5use dokuwiki\plugin\struct\meta\Search;
6
7/**
8 * Tests for the building of SQL-Queries for the struct plugin
9 *
10 * @group plugin_struct
11 * @group plugins
12 *
13 */
14class AccessTableDataSQLTest extends StructTest
15{
16
17    /**
18     * @return array
19     * @see schemaDataSQL_struct_test::test_buildGetDataSQL
20     * @noinspection SqlDialectInspection
21     * @noinspection SqlNoDataSourceInspection
22     */
23    public static function buildGetDataSQL_testdata()
24    {
25        $schemadata = new mock\AccessTableDataNoDB('testtable', 'pagename', 27);
26
27        /** @noinspection SqlResolve */
28        return [
29            [
30                [
31                    'obj' => $schemadata,
32                    'singles' => ['dokuwiki\\plugin\\struct\\types\\Text', 'dokuwiki\\plugin\\struct\\types\\Text'],
33                    'multis' => [],
34                ],
35                "SELECT DATA.pid AS PID,
36                        DATA.col1 AS out1,
37                        DATA.col2 AS out2
38                   FROM data_testtable AS DATA
39                  WHERE (DATA.pid = ?
40                    AND DATA.rev = ?)
41               GROUP BY DATA.pid,out1,out2",
42                ['pagename', 27],
43                'no multis, with ts',
44            ],
45            [
46                [
47                    'obj' => $schemadata,
48                    'singles' => ['dokuwiki\\plugin\\struct\\types\\Text', 'dokuwiki\\plugin\\struct\\types\\Text'],
49                    'multis' => ['dokuwiki\\plugin\\struct\\types\\Text'],
50                ],
51                "SELECT DATA.pid AS PID,
52                        DATA.col1 AS out1,
53                        DATA.col2 AS out2,
54                        GROUP_CONCAT_DISTINCT(M3.value,'" . Search::CONCAT_SEPARATOR . "') AS out3
55                   FROM data_testtable AS DATA
56                   LEFT OUTER JOIN multi_testtable AS M3
57                     ON DATA.pid = M3.pid
58                    AND DATA.rev = M3.rev
59                    AND M3.colref = 3
60                  WHERE (DATA.pid = ?
61                    AND DATA.rev = ?)
62               GROUP BY DATA.pid,out1,out2",
63                ['pagename', 27,],
64                'one multi, with ts',
65            ],
66            [
67                [
68                    'obj' => $schemadata,
69                    'singles' => [],
70                    'multis' => ['dokuwiki\\plugin\\struct\\types\\Text', 'dokuwiki\\plugin\\struct\\types\\Text']
71                ],
72                "SELECT DATA.pid AS PID,
73                        GROUP_CONCAT_DISTINCT(M1.value,'" . Search::CONCAT_SEPARATOR . "') AS out1,
74                        GROUP_CONCAT_DISTINCT(M2.value,'" . Search::CONCAT_SEPARATOR . "') AS out2
75                   FROM data_testtable AS DATA
76                   LEFT OUTER JOIN multi_testtable AS M2
77                     ON DATA.pid = M2.pid
78                    AND DATA.rev = M2.rev
79                    AND M2.colref = 2
80                   LEFT OUTER JOIN multi_testtable AS M1
81                     ON DATA.pid = M1.pid
82                    AND DATA.rev = M1.rev
83                    AND M1.colref = 1
84                  WHERE (DATA.pid = ?
85                    AND DATA.rev = ?)
86               GROUP BY DATA.pid",
87                ['pagename', 27,],
88                "only two multis"
89            ]
90        ];
91    }
92
93    /**
94     * @dataProvider buildGetDataSQL_testdata
95     *
96     * @covers       \dokuwiki\plugin\struct\meta\SchemaData::buildGetDataSQL
97     *
98     * @param $testvals
99     * @param string $expected_sql
100     * @param array $expected_opt
101     * @param string $msg
102     */
103    public function test_buildGetDataSQL($testvals, $expected_sql, $expected_opt, $msg)
104    {
105        /** @var mock\AccessTableDataNoDB $obj */
106        $obj = $testvals['obj'];
107        $obj->setColumns($testvals['singles'], $testvals['multis']);
108
109        list($actual_sql, $actual_opt) = $obj->buildGetDataSQL();
110
111        $this->assertSame($this->cleanWS($expected_sql), $this->cleanWS($actual_sql), $msg);
112        $this->assertEquals($expected_opt, $actual_opt, $msg);
113    }
114
115}
116