Passed
Push — develop ( f7d5f1...b2e8eb )
by Mathieu
01:53
created

DBCollectionTest::testGetParentId()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 5
nc 1
nop 0
dl 0
loc 8
rs 10
c 1
b 0
f 0
1
<?php
2
3
require_once 'stubs/Category.php';
4
5
class DBCollectionTest extends \PHPUnit\Framework\TestCase
6
{
7
    public function testGetTableName()
8
    {
9
        $testName = 'categories';
10
11
        $testCollection = new \Suricate\DBCollection();
12
        self::mockProperty($testCollection, 'tableName', $testName);
13
        $this->assertEquals($testName, $testCollection->getTableName());
14
    }
15
16
    public function testGetItemsType()
17
    {
18
        $testName = Category::class;
19
20
        $testCollection = new \Suricate\DBCollection();
21
        self::mockProperty($testCollection, 'itemsType', $testName);
22
        $this->assertEquals($testName, $testCollection->getItemsType());
23
    }
24
25
    public function testGetDBConfig()
26
    {
27
        $testConfigName = 'my_config';
28
29
        $testCollection = new \Suricate\DBCollection();
30
        self::mockProperty($testCollection, 'DBConfig', $testConfigName);
31
        $this->assertEquals($testConfigName, $testCollection->getDBConfig());
32
    }
33
34
    public function testGetParentIdField()
35
    {
36
        $testName = 'parent_id';
37
38
        $testCollection = new \Suricate\DBCollection();
39
        self::mockProperty($testCollection, 'parentIdField', $testName);
40
        $this->assertEquals($testName, $testCollection->getParentIdField());
41
    }
42
43
    public function testGetParentId()
44
    {
45
        $testId = 100;
46
47
        $testCollection = new \Suricate\DBCollection();
48
        $this->assertNull($testCollection->getParentId());
49
        self::mockProperty($testCollection, 'parentId', $testId);
50
        $this->assertSame($testId, $testCollection->getParentId());
51
    }
52
53
    public function testGetParentType()
54
    {
55
        $testType = Category::class;
56
57
        $testCollection = new \Suricate\DBCollection();
58
        $this->assertSame('', $testCollection->getParentType());
59
        self::mockProperty($testCollection, 'parentType', $testType);
60
        $this->assertSame($testType, $testCollection->getParentType());
61
    }
62
63
    public function testGetSetLazyLoad()
64
    {
65
        $testCollection = new \Suricate\DBCollection();
66
        $this->assertFalse($testCollection->getLazyLoad());
67
        $retVal = $testCollection->setLazyLoad(true);
68
        $this->assertInstanceOf(\Suricate\DBCollection::class, $retVal);
69
        $this->assertTrue($testCollection->getLazyLoad());
70
    }
71
72
    public function testLoadFromSql()
73
    {
74
        $this->setupData();
75
        $testDBCollection = $this->getDBCollection();
76
77
        $sql = "SELECT * FROM categories WHERE id>:id";
78
        $sqlParams = ['id' => 0];
79
80
        $retVal = $testDBCollection->loadFromSql($sql, $sqlParams);
81
        
82
        $this->assertInstanceOf(\Suricate\DBCollection::class, $retVal);
83
        $this->assertSame(2, $testDBCollection->count());
84
        $this->assertInstanceOf(Category::class, $testDBCollection[0]);
85
    }
86
87
    protected function getDatabase()
88
    {
89
        $database = new \Suricate\Database();
90
        $database->configure([
91
            'type' => 'sqlite',
92
            'file' => '/tmp/test.db',
93
        ]);
94
95
        return $database;
96
    }
97
98
    protected function getDBCollection()
99
    {
100
        $dbLink = $this->getDatabase();
101
        // Inject database handler
102
        $testDBCollection = new \Suricate\DBCollection();
103
104
105
        $reflector = new ReflectionClass(get_class($testDBCollection));
106
        $property = $reflector->getProperty('dbLink');
107
        $property->setAccessible(true);
108
        $property->setValue($testDBCollection, $dbLink);
109
110
        self::mockProperty($testDBCollection, 'tableName', 'categories');
111
        self::mockProperty($testDBCollection, 'itemsType', Category::class);
112
        self::mockProperty($testDBCollection, 'parentIdField', 'parent_id');
113
        self::mockProperty($testDBCollection, 'parentType', Category::class);
114
        
115
        return $testDBCollection;
116
    }
117
118
    protected function setupData()
119
    {
120
        $pdo = new PDO('sqlite:/tmp/test.db');
121
        $pdo->exec("DROP TABLE IF EXISTS `users`");
122
        $pdo->exec("DROP TABLE IF EXISTS `categories`");
123
        $pdo->exec("CREATE TABLE `users` (`id` INTEGER PRIMARY KEY,`category_id` INTEGER, `name` varchar(50) DEFAULT NULL,`date_added` datetime NOT NULL)");
124
        $pdo->exec("CREATE TABLE `categories` (`id` INTEGER PRIMARY KEY, `name` varchar(50) DEFAULT NULL, `parent_id` INTEGER DEFAULT NULL)");
125
        
126
        $stmt = $pdo->prepare("INSERT INTO `users` (name, category_id, date_added) VALUES (:name, :categoryid, :date)");
127
        $values = [
128
            ['John', 100, '2019-01-10 00:00:00'],
129
            ['Paul', 100, '2019-01-11 00:00:00'],
130
            ['Robert', 101, '2019-01-12 00:00:00']
131
        ];
132
        foreach ($values as $value) {
133
            $stmt->execute(['name' => $value[0], 'categoryid' => $value[1], 'date' => $value[2]]);
134
        }
135
136
        $stmt = $pdo->prepare("INSERT INTO `categories` (id, name) VALUES (:id, :name)");
137
        $values = [
138
            [100, 'Admin'],
139
            [101, 'Employee']
140
        ];
141
        foreach ($values as $value) {
142
            $stmt->execute(['id' => $value[0], 'name' => $value[1]]);
143
        }
144
    }
145
146
    public static function mockProperty($object, string $propertyName, $value)
147
    {
148
        $reflectionClass = new \ReflectionClass($object);
149
150
        $property = $reflectionClass->getProperty($propertyName);
151
        $property->setAccessible(true);
152
        $property->setValue($object, $value);
153
        $property->setAccessible(false);
154
    }
155
}