Passed
Push — develop ( 213a3e...25acdc )
by Mathieu
01:45
created

DatabaseTest::testFetchColumn()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 6
nc 1
nop 0
dl 0
loc 8
rs 10
c 1
b 0
f 0
1
<?php
2
3
use PHPUnit\Framework\TestCase;
4
5
6
class DatabaseTest extends TestCase
7
{
8
    protected $className = '\Suricate\Database';
9
    protected $tableName = 'users';
10
11
    protected function setupData()
12
    {
13
        $pdo = new PDO('sqlite:/tmp/test.db');
14
        $pdo->exec("DROP TABLE IF EXISTS `" . $this->tableName ."`");
15
        $pdo->exec("CREATE TABLE `" .$this->tableName. "` (`id` INTEGER PRIMARY KEY,`name` varchar(50) DEFAULT NULL,`date_added` datetime NOT NULL)");
16
        $stmt = $pdo->prepare("INSERT INTO `" . $this->tableName . "` (name, date_added) VALUES (:name, :date)");
17
        $values = [
18
            ['John', '2019-01-10 00:00:00'],
19
            ['Paul', '2019-01-11 00:00:00'],
20
            ['Robert', '2019-01-12 00:00:00']
21
        ];
22
        foreach ($values as $value) {
23
            $stmt->execute(['name' => $value[0], 'date' => $value[1]]);
24
        }
25
    }
26
27
    protected function getDatabase()
28
    {
29
        $className = $this->className;
30
        $database = new $className();
31
        $database->configure([
32
            'type' => 'sqlite',
33
            'file' => '/tmp/test.db',
34
        ]);
35
36
        return $database;
37
    }
38
39
    public function setUp()
40
    {
41
        $this->setupData();
42
    }
43
44
    public function testContructor()
45
    {
46
        $className = $this->className;
47
        $database = new $className();
48
49
        $this->assertNull($database->getConfig());
50
        $reflection = new \ReflectionClass(get_class($database));
51
        $property = $reflection->getProperty('handler');
52
        $property->setAccessible(true);
53
        $this->assertEquals($property->getValue($database), false);
54
    }
55
56
    public function testGetSetConfig()
57
    {
58
        $className = $this->className;
59
        $configName = "testConfig";
60
61
        $database = new $className();
62
        $this->assertNull($database->getConfig());
63
        $retVar = $database->setConfig($configName);
64
65
        $this->assertInstanceOf($className, $retVar);
66
        $this->assertEquals($configName, $database->getConfig());
67
    }
68
69
    public function testConnect()
70
    {
71
        $database = $this->getDatabase();
72
        $database->query("SELECT * FROM users");
73
        $reflection = new \ReflectionClass(get_class($database));
74
        $property = $reflection->getProperty('handler');
75
        $property->setAccessible(true);
76
77
        $this->assertInstanceOf('\PDO', $property->getValue($database));
78
    }
79
80
    public function testUnsupportedHandler()
81
    {
82
        $className = $this->className;
83
        $database = new $className();
84
        $database->configure([
85
            'type' => 'my-pdo-handler',
86
        ]);
87
        $this->expectException(\Exception::class);
88
        $database->query("SELECT * FROM users");
89
    }
90
91
    public function testFetchAll()
92
    {
93
        $database = $this->getDatabase();
94
        $queryResult = $database->query("SELECT * FROM `" . $this->tableName . "`");
95
        $this->assertEquals($queryResult->fetchAll(), [
96
            ['id' => '1', 'name' => 'John', 'date_added' => '2019-01-10 00:00:00'],
97
            ['id' => '2', 'name' => 'Paul', 'date_added' => '2019-01-11 00:00:00'],
98
            ['id' => '3', 'name' => 'Robert', 'date_added' => '2019-01-12 00:00:00'],
99
        ]);
100
    }
101
102
    public function testFetch()
103
    {
104
        $database = $this->getDatabase();
105
        $database->query("SELECT * FROM `" . $this->tableName . "`");
106
        // Record 1
107
        $this->assertSame(['id' => '1', 'name' => 'John', 'date_added' => '2019-01-10 00:00:00'], $database->fetch());
108
        // Record 2
109
        $this->assertSame(['id' => '2', 'name' => 'Paul', 'date_added' => '2019-01-11 00:00:00'], $database->fetch());
110
        // Record 3
111
        $this->assertSame(['id' => '3', 'name' => 'Robert', 'date_added' => '2019-01-12 00:00:00'], $database->fetch());
112
        // No more records
113
        $this->assertFalse($database->fetch());
114
    }
115
116
    public function testFetchObject()
117
    {
118
        $database = $this->getDatabase();
119
        $database->query("SELECT * FROM `" . $this->tableName . "`");
120
        $result = $database->fetchObject();
121
        $expected = new \stdClass;
122
        $expected->id = '1';
123
        $expected->name = 'John';
124
        $expected->date_added = '2019-01-10 00:00:00';
125
126
        $this->assertEquals($expected, $result);
127
        $this->assertSame($expected->id, $result->id);
128
    }
129
130
    public function testFetchColumn()
131
    {
132
        $database = $this->getDatabase();
133
        $database->query("SELECT * FROM `" . $this->tableName . "` WHERE id=2");
134
        $this->assertSame('2', $database->fetchColumn());
135
        $database->query("SELECT * FROM `" . $this->tableName . "` WHERE id=2");
136
        $this->assertSame('Paul', $database->fetchColumn(1));
137
        $this->assertFalse($database->fetchColumn(1));
138
    }
139
140
    public function testLastInsertId()
141
    {
142
        $database = $this->getDatabase();
143
        $database->query("INSERT INTO `" . $this->tableName . "` (name, date_added) VALUES ('Rodrigo', '2019-01-13 00:00:00')");
144
        $this->assertSame('4', $database->lastInsertId(), 'Test last inserted id');
145
    }
146
147
    public function testGetColumnCount()
148
    {
149
        $database = $this->getDatabase();
150
        $database->query("SELECT * FROM `" . $this->tableName . "`");
151
        $this->assertEquals(3, $database->getColumnCount());
152
    }
153
154
    protected function tearDown()
155
    {
156
        if (is_file('/tmp/test.db')) {
157
            unlink('/tmp/test.db');
158
        }
159
    }
160
}
161