Passed
Push — develop ( 25acdc...1cf741 )
by Mathieu
01:47
created

DatabaseTest::testGetSetConfigs()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 9
nc 1
nop 0
dl 0
loc 14
rs 9.9666
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 testGetSetConfigs()
70
    {
71
        $className = $this->className;
72
        $configs = [
73
            'test1' => ['type' => 'sqlite', 'memory' => true],
74
            'test2' => ['type' => 'mysql'],
75
        ];
76
77
        $database = new $className();
78
        $this->assertSame([], $database->getConfigs());
79
        $retVar = $database->setConfigs($configs);
80
81
        $this->assertInstanceOf($className, $retVar);
82
        $this->assertEquals($configs, $database->getConfigs());
83
    }
84
85
    public function testConnect()
86
    {
87
        $database = $this->getDatabase();
88
        $database->query("SELECT * FROM users");
89
        $reflection = new \ReflectionClass(get_class($database));
90
        $property = $reflection->getProperty('handler');
91
        $property->setAccessible(true);
92
93
        $this->assertInstanceOf('\PDO', $property->getValue($database));
94
    }
95
96
    public function testUnsupportedHandler()
97
    {
98
        $className = $this->className;
99
        $database = new $className();
100
        $database->configure([
101
            'type' => 'my-pdo-handler',
102
        ]);
103
        $this->expectException(\Exception::class);
104
        $database->query("SELECT * FROM users");
105
    }
106
107
    public function testFetchAll()
108
    {
109
        $database = $this->getDatabase();
110
        $queryResult = $database->query("SELECT * FROM `" . $this->tableName . "`");
111
        $this->assertEquals($queryResult->fetchAll(), [
112
            ['id' => '1', 'name' => 'John', 'date_added' => '2019-01-10 00:00:00'],
113
            ['id' => '2', 'name' => 'Paul', 'date_added' => '2019-01-11 00:00:00'],
114
            ['id' => '3', 'name' => 'Robert', 'date_added' => '2019-01-12 00:00:00'],
115
        ]);
116
    }
117
118
    public function testFetch()
119
    {
120
        $database = $this->getDatabase();
121
        $database->query("SELECT * FROM `" . $this->tableName . "`");
122
        // Record 1
123
        $this->assertSame(['id' => '1', 'name' => 'John', 'date_added' => '2019-01-10 00:00:00'], $database->fetch());
124
        // Record 2
125
        $this->assertSame(['id' => '2', 'name' => 'Paul', 'date_added' => '2019-01-11 00:00:00'], $database->fetch());
126
        // Record 3
127
        $this->assertSame(['id' => '3', 'name' => 'Robert', 'date_added' => '2019-01-12 00:00:00'], $database->fetch());
128
        // No more records
129
        $this->assertFalse($database->fetch());
130
    }
131
132
    public function testFetchObject()
133
    {
134
        $database = $this->getDatabase();
135
        $database->query("SELECT * FROM `" . $this->tableName . "`");
136
        $result = $database->fetchObject();
137
        $expected = new \stdClass;
138
        $expected->id = '1';
139
        $expected->name = 'John';
140
        $expected->date_added = '2019-01-10 00:00:00';
141
142
        $this->assertEquals($expected, $result);
143
        $this->assertSame($expected->id, $result->id);
144
    }
145
146
    public function testFetchColumn()
147
    {
148
        $database = $this->getDatabase();
149
        $database->query("SELECT * FROM `" . $this->tableName . "` WHERE id=2");
150
        $this->assertSame('2', $database->fetchColumn());
151
        $database->query("SELECT * FROM `" . $this->tableName . "` WHERE id=2");
152
        $this->assertSame('Paul', $database->fetchColumn(1));
153
        $this->assertFalse($database->fetchColumn(1));
154
    }
155
156
    public function testLastInsertId()
157
    {
158
        $database = $this->getDatabase();
159
        $database->query("INSERT INTO `" . $this->tableName . "` (name, date_added) VALUES ('Rodrigo', '2019-01-13 00:00:00')");
160
        $this->assertSame('4', $database->lastInsertId(), 'Test last inserted id');
161
    }
162
163
    public function testGetColumnCount()
164
    {
165
        $database = $this->getDatabase();
166
        $database->query("SELECT * FROM `" . $this->tableName . "`");
167
        $this->assertEquals(3, $database->getColumnCount());
168
    }
169
170
    protected function tearDown()
171
    {
172
        if (is_file('/tmp/test.db')) {
173
            unlink('/tmp/test.db');
174
        }
175
    }
176
}
177