Open Data Catalog v2.0.0
DatabaseTableTest.php
Go to the documentation of this file.
1 <?php
2 
4 
5 use Dkan\Datastore\Resource;
6 use Drupal\Core\Database\Connection;
7 use Drupal\Core\Database\Query\Insert;
8 use Drupal\Core\Database\Query\Select;
9 use Drupal\Core\Database\Schema;
10 use Drupal\Core\Database\Statement;
11 use MockChain\Chain;
12 use MockChain\Sequence;
15 use PHPUnit\Framework\TestCase;
16 
20 class DatabaseTableTest extends TestCase {
21 
25  public function testConstruction() {
26 
27  $databaseTable = new DatabaseTable(
28  $this->getConnectionChain()->getMock(),
29  $this->getResource()
30  );
31  $this->assertTrue(is_object($databaseTable));
32  }
33 
37  public function testRetrieveAll() {
38 
39  $fieldInfo = [
40  (object) ['Field' => "first_name"],
41  (object) ['Field' => "last_name"],
42  ];
43 
44  $sequence = (new Sequence())
45  ->add($fieldInfo)
46  ->add([]);
47 
48  $connection = $this->getConnectionChain()
49  ->add(Connection::class, "select", Select::class)
50  ->add(Select::class, "fields", Select::class)
51  ->add(Select::class, "execute", Statement::class)
52  ->add(Statement::class, 'fetchAll', $sequence)
53  ->getMock();
54 
55  $databaseTable = new DatabaseTable(
56  $connection,
57  $this->getResource()
58  );
59  $this->assertEquals([], $databaseTable->retrieveAll());
60  }
61 
65  public function testStore() {
66  $connectionChain = $this->getConnectionChain()
67  ->add(Connection::class, 'insert', Insert::class)
68  ->add(Insert::class, 'fields', Insert::class)
69  ->add(Insert::class, 'values', Insert::class)
70  ->add(Insert::class, 'execute', "1")
71  ->add(Connection::class, 'select', Select::class, 'select_1')
72  ->add(Select::class, 'fields', Select::class)
73  ->add(Select::class, 'condition', Select::class)
74  ->add(Select::class, 'execute', Statement::class)
75  ->add(Statement::class, 'fetch', NULL);
76 
77  $databaseTable = new DatabaseTable(
78  $connectionChain->getMock(),
79  $this->getResource()
80  );
81  $this->assertEquals("1", $databaseTable->store('["Gerardo", "Gonzalez"]', "1"));
82  }
83 
87  public function testStoreFieldCountException() {
88  $connectionChain = $this->getConnectionChain()
89  ->add(Connection::class, 'insert', Insert::class)
90  ->add(Insert::class, 'fields', Insert::class)
91  ->add(Insert::class, 'values', Insert::class)
92  ->add(Insert::class, 'execute', "1")
93  ->add(Connection::class, 'select', Select::class, 'select_1')
94  ->add(Select::class, 'fields', Select::class)
95  ->add(Select::class, 'condition', Select::class)
96  ->add(Select::class, 'execute', Statement::class)
97  ->add(Statement::class, 'fetch', NULL);
98 
99  $databaseTable = new DatabaseTable(
100  $connectionChain->getMock(),
101  $this->getResource()
102  );
103  $this->expectExceptionMessageRegExp("/The number of fields and data given do not match:/");
104  $this->assertEquals("1", $databaseTable->store('["Foobar"]', "1"));
105  }
106 
110  public function testStoreMultiple() {
111  $connectionChain = $this->getConnectionChain()
112  ->add(Connection::class, 'insert', Insert::class)
113  ->add(Insert::class, 'fields', Insert::class)
114  ->add(Insert::class, 'values', Insert::class)
115  ->add(Insert::class, 'execute', "1")
116  ->add(Connection::class, 'select', Select::class, 'select_1')
117  ->add(Select::class, 'fields', Select::class)
118  ->add(Select::class, 'condition', Select::class)
119  ->add(Select::class, 'execute', Statement::class)
120  ->add(Statement::class, 'fetch', NULL);
121 
122  $databaseTable = new DatabaseTable(
123  $connectionChain->getMock(),
124  $this->getResource()
125  );
126  $data = [
127  '["Gerardo", "Gonzalez"]',
128  '["Thierry", "Dallacroce"]',
129  '["Foo", "Bar"]',
130  ];
131  $this->assertEquals("1", $databaseTable->storeMultiple($data, "1"));
132  }
133 
138  $connectionChain = $this->getConnectionChain()
139  ->add(Connection::class, 'insert', Insert::class)
140  ->add(Insert::class, 'fields', Insert::class)
141  ->add(Insert::class, 'values', Insert::class)
142  ->add(Insert::class, 'execute', "1")
143  ->add(Connection::class, 'select', Select::class, 'select_1')
144  ->add(Select::class, 'fields', Select::class)
145  ->add(Select::class, 'condition', Select::class)
146  ->add(Select::class, 'execute', Statement::class)
147  ->add(Statement::class, 'fetch', NULL);
148 
149  $databaseTable = new DatabaseTable(
150  $connectionChain->getMock(),
151  $this->getResource()
152  );
153  $data = [
154  '["One"]',
155  '["Two"]',
156  '["Three"]',
157  ];
158  $this->expectExceptionMessageRegExp("/The number of fields and data given do not match:/");
159  $this->assertEquals("1", $databaseTable->storeMultiple($data, "1"));
160  }
161 
165  public function testCount() {
166  $connectionChain = $this->getConnectionChain()
167  ->add(Connection::class, 'select', Select::class, 'select_1')
168  ->add(Select::class, 'fields', Select::class)
169  ->add(Select::class, 'countQuery', Select::class)
170  ->add(Select::class, 'execute', Statement::class)
171  ->add(Statement::class, 'fetchField', 1);
172 
173  $databaseTable = new DatabaseTable(
174  $connectionChain->getMock(),
175  $this->getResource()
176  );
177  $this->assertEquals(1, $databaseTable->count());
178  }
179 
183  public function testGetSummary() {
184  $connectionChain = $this->getConnectionChain()
185  ->add(Connection::class, 'select', Select::class, 'select_1')
186  ->add(Select::class, 'fields', Select::class)
187  ->add(Select::class, 'countQuery', Select::class)
188  ->add(Select::class, 'execute', Statement::class)
189  ->add(Statement::class, 'fetchField', 1);
190 
191  $databaseTable = new DatabaseTable(
192  $connectionChain->getMock(),
193  $this->getResource()
194  );
195  $this->assertEquals(
196  new TableSummary(
197  3,
198  ["record_number", "first_name", "last_name"],
199  1
200  ), $databaseTable->getSummary());
201  }
202 
206  public function testDestroy() {
207  $connectionChain = $this->getConnectionChain();
208 
209  $databaseTable = new DatabaseTable(
210  $connectionChain->getMock(),
211  $this->getResource()
212  );
213  $databaseTable->destroy();
214  $this->assertTrue(TRUE);
215 
216  }
217 
221  public function testPrepareDataJsonDecodeNull() {
222  $connectionChain = $this->getConnectionChain()
223  ->add(Connection::class, 'insert', Insert::class)
224  ->add(Insert::class, 'fields', Insert::class)
225  ->add(Insert::class, 'values', Insert::class)
226  ->add(Insert::class, 'execute', "1")
227  ->add(Connection::class, 'select', Select::class, 'select_1')
228  ->add(Select::class, 'fields', Select::class)
229  ->add(Select::class, 'condition', Select::class)
230  ->add(Select::class, 'execute', Statement::class)
231  ->add(Statement::class, 'fetch', NULL);
232 
233  $databaseTable = new DatabaseTable(
234  $connectionChain->getMock(),
235  $this->getResource()
236  );
237  $this->expectExceptionMessage('Import for 1 returned an error when preparing table header: {"foo":"bar"}');
238  $this->assertEquals("1", $databaseTable->store('{"foo":"bar"}', "1"));
239  }
240 
244  public function testPrepareDataNonArray() {
245  $connectionChain = $this->getConnectionChain()
246  ->add(Connection::class, 'insert', Insert::class)
247  ->add(Insert::class, 'fields', Insert::class)
248  ->add(Insert::class, 'values', Insert::class)
249  ->add(Insert::class, 'execute', "1")
250  ->add(Connection::class, 'select', Select::class, 'select_1')
251  ->add(Select::class, 'fields', Select::class)
252  ->add(Select::class, 'condition', Select::class)
253  ->add(Select::class, 'execute', Statement::class)
254  ->add(Statement::class, 'fetch', NULL);
255 
256  $databaseTable = new DatabaseTable(
257  $connectionChain->getMock(),
258  $this->getResource()
259  );
260  $this->expectExceptionMessage("Import for 1 error when decoding foobar");
261  $this->assertEquals("1", $databaseTable->store("foobar", "1"));
262  }
263 
267  private function getConnectionChain() {
268  $fieldInfo = [
269  (object) ['Field' => "first_name"],
270  (object) ['Field' => "last_name"],
271  ];
272 
273  $chain = (new Chain($this))
274  // Construction.
275  ->add(Connection::class, "schema", Schema::class)
276  ->add(Connection::class, 'query', Statement::class)
277  ->add(Statement::class, 'fetchAll', $fieldInfo)
278  ->add(Schema::class, "tableExists", TRUE);
279 
280  return $chain;
281  }
282 
286  private function getResource() {
287  return new Resource("people", "", "text/csv");
288  }
289 
290 }
Drupal\Tests\dkan_datastore\Unit\Storage\DatabaseTableTest
Definition: DatabaseTableTest.php:20
Drupal\dkan_datastore\Storage\DatabaseTable
Definition: DatabaseTable.php:16
Drupal\dkan_datastore\Storage\TableSummary
Definition: TableSummary.php:10
Drupal\Tests\dkan_datastore\Unit\Storage\DatabaseTableTest\testStoreMultiple
testStoreMultiple()
Definition: DatabaseTableTest.php:110
Drupal\Tests\dkan_datastore\Unit\Storage\DatabaseTableTest\testStoreMultipleFieldCountException
testStoreMultipleFieldCountException()
Definition: DatabaseTableTest.php:137
Drupal\Tests\dkan_datastore\Unit\Storage\DatabaseTableTest\testStore
testStore()
Definition: DatabaseTableTest.php:65
Drupal\Tests\dkan_datastore\Unit\Storage
Definition: DatabaseTableFactoryTest.php:3
Drupal\Tests\dkan_datastore\Unit\Storage\DatabaseTableTest\testDestroy
testDestroy()
Definition: DatabaseTableTest.php:206
Drupal\Tests\dkan_datastore\Unit\Storage\DatabaseTableTest\testRetrieveAll
testRetrieveAll()
Definition: DatabaseTableTest.php:37
Drupal\Tests\dkan_datastore\Unit\Storage\DatabaseTableTest\testConstruction
testConstruction()
Definition: DatabaseTableTest.php:25
Drupal\dkan_common\Storage\AbstractDatabaseTable\destroy
destroy()
Definition: AbstractDatabaseTable.php:241
Drupal\Tests\dkan_datastore\Unit\Storage\DatabaseTableTest\testPrepareDataJsonDecodeNull
testPrepareDataJsonDecodeNull()
Definition: DatabaseTableTest.php:221
Drupal\Tests\dkan_datastore\Unit\Storage\DatabaseTableTest\testPrepareDataNonArray
testPrepareDataNonArray()
Definition: DatabaseTableTest.php:244
Drupal\Tests\dkan_datastore\Unit\Storage\DatabaseTableTest\testStoreFieldCountException
testStoreFieldCountException()
Definition: DatabaseTableTest.php:87
Drupal\Tests\dkan_datastore\Unit\Storage\DatabaseTableTest\testCount
testCount()
Definition: DatabaseTableTest.php:165
Drupal\Tests\dkan_datastore\Unit\Storage\DatabaseTableTest\testGetSummary
testGetSummary()
Definition: DatabaseTableTest.php:183