Passed
Push — master ( 37e483...d2fc64 )
by Wilmer
11:53 queued 09:06
created

CommonCommandPDOTest::testColumnCase()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 35
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 22
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 35
rs 9.568
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Db\Tests\Common;
6
7
use PDO;
8
use PHPUnit\Framework\TestCase;
9
use Yiisoft\Db\Command\Param;
10
use Yiisoft\Db\Command\ParamInterface;
11
use Yiisoft\Db\Tests\Support\DbHelper;
12
use Yiisoft\Db\Tests\Support\TestTrait;
13
14
abstract class CommonCommandPDOTest extends TestCase
15
{
16
    use TestTrait;
17
18
    /**
19
     * @dataProvider \Yiisoft\Db\Tests\Provider\CommandPDOProvider::bindParam()
20
     */
21
    public function testBindParam(
22
        string $field,
23
        string $name,
24
        mixed $value,
25
        int $dataType,
26
        int|null $length,
27
        mixed $driverOptions,
28
        array $expected,
29
    ): void {
30
        $db = $this->getConnection(true);
31
32
        /** @psalm-var $sql */
33
        $sql = DbHelper::replaceQuotes(
34
            <<<SQL
35
            SELECT * FROM [[customer]] WHERE $field = $name
36
            SQL,
37
            $db->getName(),
38
        );
39
        $command = $db->createCommand();
40
        $command->setSql($sql);
41
        $command->bindParam($name, $value, $dataType, $length, $driverOptions);
42
43
        $this->assertSame($sql, $command->getSql());
44
        $this->assertSame($expected, $command->queryOne());
45
    }
46
47
    /**
48
     * Test whether param binding works in other places than WHERE.
49
     *
50
     * @dataProvider \Yiisoft\Db\Tests\Provider\CommandPDOProvider::bindParamsNonWhere()
51
     */
52
    public function testBindParamsNonWhere(string $sql): void
53
    {
54
        $db = $this->getConnection(true);
55
56
        $db->createCommand()->insert(
57
            '{{customer}}',
58
            [
59
                'name' => 'testParams',
60
                'email' => '[email protected]',
61
                'address' => '1',
62
            ]
63
        )->execute();
64
        $params = [':email' => '[email protected]', ':len' => 5];
65
        $command = $db->createCommand($sql, $params);
66
67
        $this->assertSame('Params', $command->queryScalar());
68
    }
69
70
    public function testBindParamValue(): void
71
    {
72
        $db = $this->getConnection(true);
73
74
        $command = $db->createCommand();
75
76
        // bindParam
77
        $command->setSql(
78
            <<<SQL
79
            INSERT INTO [[customer]] ([[name]], [[email]], [[address]]) VALUES (:name, :email, :address)
80
            SQL
81
        );
82
        $email = '[email protected]';
83
        $name = 'user4';
84
        $address = 'address4';
85
        $command->bindParam(':email', $email);
86
        $command->bindParam(':name', $name);
87
        $command->bindParam(':address', $address);
88
        $command->execute();
89
        $command = $command->setSql(
90
            <<<SQL
91
            SELECT [[name]] FROM [[customer]] WHERE [[email]] = :email
92
            SQL,
93
        );
94
        $command->bindParam(':email', $email);
95
96
        $this->assertSame($name, $command->queryScalar());
97
98
        // bindValue
99
        $command->setSql(
100
            <<<SQL
101
            INSERT INTO [[customer]] ([[email]], [[name]], [[address]]) VALUES (:email, 'user5', 'address5')
102
            SQL
103
        );
104
        $command->bindValue(':email', '[email protected]');
105
        $command->execute();
106
        $command->setSql(
107
            <<<SQL
108
            SELECT [[email]] FROM [[customer]] WHERE [[name]] = :name
109
            SQL
110
        );
111
        $command->bindValue(':name', 'user5');
112
113
        $this->assertSame('[email protected]', $command->queryScalar());
114
    }
115
116
    public function testBindValues(): void
117
    {
118
        $db = $this->getConnection();
119
120
        $command = $db->createCommand();
121
122
        $values = ['int' => 1, 'string' => 'str'];
123
        $command->bindValues($values);
124
        $bindedValues = $command->getParams(false);
125
126
        $this->assertIsArray($bindedValues);
127
        $this->assertContainsOnlyInstancesOf(ParamInterface::class, $bindedValues);
128
        $this->assertCount(2, $bindedValues);
129
130
        $param = new Param('str', 99);
131
        $command->bindValues(['param' => $param]);
132
        $bindedValues = $command->getParams(false);
133
134
        $this->assertIsArray($bindedValues);
135
        $this->assertContainsOnlyInstancesOf(ParamInterface::class, $bindedValues);
136
        $this->assertCount(3, $bindedValues);
137
        $this->assertSame($param, $bindedValues['param']);
138
        $this->assertNotEquals($param, $bindedValues['int']);
139
140
        /* Replace test */
141
        $command->bindValues(['int' => $param]);
142
        $bindedValues = $command->getParams(false);
143
144
        $this->assertIsArray($bindedValues);
145
        $this->assertContainsOnlyInstancesOf(ParamInterface::class, $bindedValues);
146
        $this->assertCount(3, $bindedValues);
147
        $this->assertSame($param, $bindedValues['int']);
148
    }
149
150
    public function testColumnCase(): void
151
    {
152
        $db = $this->getConnection(true);
153
154
        $this->assertSame(PDO::CASE_NATURAL, $db->getActivePDO()?->getAttribute(PDO::ATTR_CASE));
155
156
        $command = $db->createCommand();
157
        $sql = <<<SQL
158
        SELECT [[customer_id]], [[total]] FROM [[order]]
159
        SQL;
160
        $rows = $command->setSql($sql)->queryAll();
161
162
        $this->assertTrue(isset($rows[0]));
163
        $this->assertTrue(isset($rows[0]['customer_id']));
164
        $this->assertTrue(isset($rows[0]['total']));
165
166
        $db->getActivePDO()?->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
167
168
        $this->assertSame(PDO::CASE_LOWER, $db->getActivePDO()?->getAttribute(PDO::ATTR_CASE));
169
170
        $rows = $command->setSql($sql)->queryAll();
171
172
        $this->assertTrue(isset($rows[0]));
173
        $this->assertTrue(isset($rows[0]['customer_id']));
174
        $this->assertTrue(isset($rows[0]['total']));
175
176
        $db->getActivePDO()?->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
177
178
        $this->assertSame(PDO::CASE_UPPER, $db->getActivePDO()?->getAttribute(PDO::ATTR_CASE));
179
180
        $rows = $command->setSql($sql)->queryAll();
181
182
        $this->assertTrue(isset($rows[0]));
183
        $this->assertTrue(isset($rows[0]['CUSTOMER_ID']));
184
        $this->assertTrue(isset($rows[0]['TOTAL']));
185
    }
186
}
187