Failed Conditions
Push — master ( edfbda...298c91 )
by Luís
16s
created

Doctrine/Tests/DBAL/Functional/PortabilityTest.php (2 issues)

1
<?php
2
3
namespace Doctrine\Tests\DBAL\Functional;
4
5
use Doctrine\DBAL\Connection;
6
use Doctrine\DBAL\DriverManager;
7
use Doctrine\DBAL\Portability\Connection as ConnectionPortability;
8
use PDO;
9
10
/**
11
 * @group DBAL-56
12
 */
13
class PortabilityTest extends \Doctrine\Tests\DbalFunctionalTestCase
14
{
15
    private $portableConnection;
16
17
    protected function tearDown()
18
    {
19
        if ($this->portableConnection) {
20
            $this->portableConnection->close();
21
        }
22
23
        parent::tearDown();
24
    }
25
26
    /**
27
     * @param   integer     $portabilityMode
28
     * @param   integer     $case
29
     * @return  Connection
30
     */
31
    private function getPortableConnection($portabilityMode = \Doctrine\DBAL\Portability\Connection::PORTABILITY_ALL, $case = \PDO::CASE_LOWER)
32
    {
33
        if (!$this->portableConnection) {
34
            $params = $this->_conn->getParams();
35
            $params['wrapperClass'] = 'Doctrine\DBAL\Portability\Connection';
36
            $params['portability'] = $portabilityMode;
37
            $params['fetch_case'] = $case;
38
            $this->portableConnection = DriverManager::getConnection($params, $this->_conn->getConfiguration(), $this->_conn->getEventManager());
39
40
            try {
41
                /* @var $sm \Doctrine\DBAL\Schema\AbstractSchemaManager */
42
                $table = new \Doctrine\DBAL\Schema\Table("portability_table");
43
                $table->addColumn('Test_Int', 'integer');
44
                $table->addColumn('Test_String', 'string', array('fixed' => true, 'length' => 32));
45
                $table->addColumn('Test_Null', 'string', array('notnull' => false));
46
                $table->setPrimaryKey(array('Test_Int'));
47
48
                $sm = $this->portableConnection->getSchemaManager();
49
                $sm->createTable($table);
50
51
                $this->portableConnection->insert('portability_table', array('Test_Int' => 1, 'Test_String' => 'foo', 'Test_Null' => ''));
52
                $this->portableConnection->insert('portability_table', array('Test_Int' => 2, 'Test_String' => 'foo  ', 'Test_Null' => null));
53
            } catch(\Exception $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
54
55
            }
56
        }
57
58
        return $this->portableConnection;
59
    }
60
61
    public function testFullFetchMode()
62
    {
63
        $rows = $this->getPortableConnection()->fetchAll('SELECT * FROM portability_table');
64
        $this->assertFetchResultRows($rows);
65
66
        $stmt = $this->getPortableConnection()->query('SELECT * FROM portability_table');
67
        $stmt->setFetchMode(\PDO::FETCH_ASSOC);
68
        foreach ($stmt as $row) {
69
            $this->assertFetchResultRow($row);
70
        }
71
72
        $stmt = $this->getPortableConnection()->query('SELECT * FROM portability_table');
73
        while (($row = $stmt->fetch(\PDO::FETCH_ASSOC))) {
74
            $this->assertFetchResultRow($row);
75
        }
76
77
        $stmt = $this->getPortableConnection()->prepare('SELECT * FROM portability_table');
78
        $stmt->execute();
79
        while (($row = $stmt->fetch(\PDO::FETCH_ASSOC))) {
80
            $this->assertFetchResultRow($row);
81
        }
82
    }
83
84
    public function testConnFetchMode()
85
    {
86
        $conn = $this->getPortableConnection();
87
        $conn->setFetchMode(\PDO::FETCH_ASSOC);
88
89
        $rows = $conn->fetchAll('SELECT * FROM portability_table');
90
        $this->assertFetchResultRows($rows);
91
92
        $stmt = $conn->query('SELECT * FROM portability_table');
93
        foreach ($stmt as $row) {
94
          $this->assertFetchResultRow($row);
95
        }
96
97
        $stmt = $conn->query('SELECT * FROM portability_table');
98
        while (($row = $stmt->fetch())) {
99
          $this->assertFetchResultRow($row);
100
        }
101
102
        $stmt = $conn->prepare('SELECT * FROM portability_table');
103
        $stmt->execute();
104
        while (($row = $stmt->fetch())) {
105
          $this->assertFetchResultRow($row);
106
        }
107
    }
108
109
    public function assertFetchResultRows($rows)
110
    {
111
        self::assertEquals(2, count($rows));
112
        foreach ($rows as $row) {
113
            $this->assertFetchResultRow($row);
114
        }
115
    }
116
117
    public function assertFetchResultRow($row)
118
    {
119
        self::assertTrue(in_array($row['test_int'], array(1, 2)), "Primary key test_int should either be 1 or 2.");
120
        self::assertArrayHasKey('test_string', $row, "Case should be lowered.");
121
        self::assertEquals(3, strlen($row['test_string']), "test_string should be rtrimed to length of three for CHAR(32) column.");
122
        self::assertNull($row['test_null']);
123
        self::assertArrayNotHasKey(0, $row, "PDO::FETCH_ASSOC should not return numerical keys.");
124
    }
125
126
    public function testPortabilitySqlServer()
127
    {
128
        $portability = ConnectionPortability::PORTABILITY_SQLSRV;
129
        $params = array(
130
            'portability' => $portability
131
        );
132
133
        $driverMock = $this->getMockBuilder('Doctrine\\DBAL\\Driver\\PDOSqlsrv\\Driver')
134
            ->setMethods(array('connect'))
135
            ->getMock();
136
137
        $driverMock->expects($this->once())
138
                   ->method('connect')
139
                   ->will($this->returnValue(null));
140
141
        $connection = new ConnectionPortability($params, $driverMock);
142
143
        $connection->connect($params);
0 ignored issues
show
The call to Doctrine\DBAL\Portability\Connection::connect() has too many arguments starting with $params. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

143
        $connection->/** @scrutinizer ignore-call */ 
144
                     connect($params);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
144
145
        self::assertEquals($portability, $connection->getPortability());
146
    }
147
148
    /**
149
     * @dataProvider fetchAllColumnProvider
150
     */
151
    public function testFetchAllColumn($field, array $expected)
152
    {
153
        $conn = $this->getPortableConnection();
154
        $stmt = $conn->query('SELECT ' . $field . ' FROM portability_table');
155
156
        $column = $stmt->fetchAll(PDO::FETCH_COLUMN);
157
        self::assertEquals($expected, $column);
158
    }
159
160
    public static function fetchAllColumnProvider()
161
    {
162
        return array(
163
            'int' => array(
164
                'Test_Int',
165
                array(1, 2),
166
            ),
167
            'string' => array(
168
                'Test_String',
169
                array('foo', 'foo'),
170
            ),
171
        );
172
    }
173
174
    public function testFetchAllNullColumn()
175
    {
176
        $conn = $this->getPortableConnection();
177
        $stmt = $conn->query('SELECT Test_Null FROM portability_table');
178
179
        $column = $stmt->fetchAll(PDO::FETCH_COLUMN);
180
        self::assertSame(array(null, null), $column);
181
    }
182
}
183