Open Data Catalog v2.0.0
HarvesterTest.php
Go to the documentation of this file.
1 <?php
2 
3 use Harvest\ETL\Load\Simple;
4 use Harvest\ETL\Extract\DataJson;
5 use PHPUnit\Framework\TestCase;
6 use MockChain\Chain;
7 use Contracts\FactoryInterface;
8 use Contracts\Mock\Storage\Memory;
11 use Drupal\dkan_harvest\Harvester as HarvestService;
12 
16 class HarvesterTest extends TestCase {
17 
18  private $storageFactory;
19 
23  public function test() {
24  $service = new HarvestService($this->getStorageFactory());
25 
26  $plan = (object) [
27  'identifier' => 'test_plan',
28  'extract' => (object) [
29  "type" => DataJson::class,
30  "uri" => "file://" . __DIR__ . '/../../files/data.json',
31  ],
32  'transforms' => [],
33  'load' => (object) [
34  "type" => Simple::class,
35  ],
36  ];
37 
38  // Register a harvest.
39  $result = $service->registerHarvest($plan);
40 
41  $this->assertEquals('test_plan', $result);
42 
43  $storedTestPlan = json_decode($this->getStorageFactory()->getInstance('harvest_plans')->retrieve('test_plan'));
44  $this->assertEquals('test_plan', $storedTestPlan->identifier);
45 
46  // Run a harvest.
47  $result = $service->runHarvest('test_plan');
48 
49  $this->assertEquals("SUCCESS", $result['status']['extract']);
50  $this->assertEquals(2, count($result['status']['extracted_items_ids']));
51  $this->assertEquals(json_encode(["NEW", "NEW"]), json_encode(array_values($result['status']['load'])));
52 
53  $storedObject = $this->getStorageFactory()->getInstance('harvest_test_plan_items')->retrieve("cedcd327-4e5d-43f9-8eb1-c11850fa7c55");
54  $this->assertTrue(is_string($storedObject));
55  $storedObject = json_decode($storedObject);
56  $this->assertTrue(is_object($storedObject));
57 
58  // Run havest again, no changes.
59  $result = $service->runHarvest('test_plan');
60 
61  $this->assertEquals("SUCCESS", $result['status']['extract']);
62  $this->assertEquals(2, count($result['status']['extracted_items_ids']));
63  $this->assertEquals(json_encode(["UNCHANGED", "UNCHANGED"]), json_encode(array_values($result['status']['load'])));
64 
65  // Run harvest with changes.
66  $plan2 = clone $plan;
67  $plan2->extract->uri = "file://" . __DIR__ . '/../../files/data2.json';
68  $service->registerHarvest($plan2);
69  $result = $service->runHarvest('test_plan');
70 
71  $this->assertEquals("SUCCESS", $result['status']['extract']);
72  $this->assertEquals(2, count($result['status']['extracted_items_ids']));
73  $this->assertEquals(json_encode(["UPDATED", "UNCHANGED"]), json_encode(array_values($result['status']['load'])));
74 
75  $storedObject = $this->getStorageFactory()->getInstance('harvest_test_plan_items')->retrieve("cedcd327-4e5d-43f9-8eb1-c11850fa7c55");
76  $this->assertTrue(is_string($storedObject));
77  $storedObject = json_decode($storedObject);
78  $this->assertTrue(is_object($storedObject));
79  $this->assertEquals("Florida Bike Lanes 2", $storedObject->title);
80 
81  // Revert harvest.
82  $service->revertHarvest('test_plan');
83  $storageTypes = [
84  'harvest_test_plan_items',
85  'harvest_test_plan_hashes',
86  'harvest_test_plan_runs',
87  ];
88  foreach ($storageTypes as $storageId) {
89  $this->assertEquals(0, count($this->getStorageFactory()->getInstance($storageId)->retrieveAll()));
90  }
91 
92  // Deregister harvest.
93  $service->deregisterHarvest('test_plan');
94  $this->assertEquals(0, count($this->getStorageFactory()->getInstance('harvest_plans')->retrieveAll()));
95  }
96 
100  public function testGetHarvestPlan() {
101  $storeFactory = (new Chain($this))
102  ->add(DatabaseTableFactory::class, "getInstance", DatabaseTable::class)
103  ->add(DatabaseTable::class, "retrieve", "Hello")
104  ->getMock();
105 
106  $service = new HarvestService($storeFactory);
107  $plan = $service->getHarvestPlan("test");
108  $this->assertEquals("Hello", $plan);
109  }
110 
114  public function testGetHarvestRunInfo() {
115  $storeFactory = (new Chain($this))
116  ->add(DatabaseTableFactory::class, "getInstance", DatabaseTable::class)
117  ->add(DatabaseTable::class, "retrieveAll", ["Hello"])
118  ->add(DatabaseTable::class, "retrieve", "Hello")
119  ->add(DatabaseTable::class, "store", "Hello")
120  ->getMock();
121 
122  $dkanHarvester = (new Chain($this))
123  ->add(HarvestService::class, "harvest", "Hello")
124  ->getMock();
125 
126  $service = $this->getMockBuilder(HarvestService::class)
127  ->setConstructorArgs([$storeFactory])
128  ->setMethods(['getDkanHarvesterInstance'])
129  ->getMock();
130 
131  $service->method('getDkanHarvesterInstance')->willReturn($dkanHarvester);
132 
133  $result = $service->getHarvestRunInfo("test", "1");
134  $this->assertFalse($result);
135  }
136 
140  private function getStorageFactory() {
141  if (!isset($this->storageFactory)) {
142  $this->storageFactory = new class() implements FactoryInterface {
143  private $stores = [];
144 
148  public function getInstance(string $identifier, array $config = []) {
149  if (!isset($this->stores[$identifier])) {
150  $this->stores[$identifier] = new class() extends Memory {
151 
155  public function retrieveAll(): array {
156  return array_keys(parent::retrieveAll());
157  }
158 
162  public function destroy() {
163  $this->storage = [];
164  }
165 
166  };
167  }
168  return $this->stores[$identifier];
169  }
170 
171  };
172  }
173 
174  return $this->storageFactory;
175  }
176 
177 }
HarvesterTest\testGetHarvestRunInfo
testGetHarvestRunInfo()
Definition: HarvesterTest.php:114
Drupal\dkan_datastore\Storage\DatabaseTable
Definition: DatabaseTable.php:16
Drupal\dkan_harvest\Harvester
Definition: Harvester.php:14
HarvesterTest
Definition: HarvesterTest.php:16
HarvesterTest\test
test()
Definition: HarvesterTest.php:23
Drupal\dkan_harvest\Storage\DatabaseTableFactory
Definition: DatabaseTableFactory.php:11
HarvesterTest\testGetHarvestPlan
testGetHarvestPlan()
Definition: HarvesterTest.php:100