3 use Harvest\ETL\Load\Simple;
4 use Harvest\ETL\Extract\DataJson;
5 use PHPUnit\Framework\TestCase;
7 use Contracts\FactoryInterface;
8 use Contracts\Mock\Storage\Memory;
18 private $storageFactory;
24 $service =
new HarvestService($this->getStorageFactory());
27 'identifier' =>
'test_plan',
28 'extract' => (
object) [
29 "type" => DataJson::class,
30 "uri" =>
"file://" . __DIR__ .
'/../../files/data.json',
34 "type" => Simple::class,
39 $result = $service->registerHarvest($plan);
41 $this->assertEquals(
'test_plan', $result);
43 $storedTestPlan = json_decode($this->getStorageFactory()->getInstance(
'harvest_plans')->retrieve(
'test_plan'));
44 $this->assertEquals(
'test_plan', $storedTestPlan->identifier);
47 $result = $service->runHarvest(
'test_plan');
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'])));
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));
59 $result = $service->runHarvest(
'test_plan');
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'])));
67 $plan2->extract->uri =
"file://" . __DIR__ .
'/../../files/data2.json';
68 $service->registerHarvest($plan2);
69 $result = $service->runHarvest(
'test_plan');
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'])));
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);
82 $service->revertHarvest(
'test_plan');
84 'harvest_test_plan_items',
85 'harvest_test_plan_hashes',
86 'harvest_test_plan_runs',
88 foreach ($storageTypes as $storageId) {
89 $this->assertEquals(0, count($this->getStorageFactory()->getInstance($storageId)->retrieveAll()));
93 $service->deregisterHarvest(
'test_plan');
94 $this->assertEquals(0, count($this->getStorageFactory()->getInstance(
'harvest_plans')->retrieveAll()));
101 $storeFactory = (
new Chain($this))
102 ->add(DatabaseTableFactory::class,
"getInstance", DatabaseTable::class)
103 ->add(DatabaseTable::class,
"retrieve",
"Hello")
106 $service =
new HarvestService($storeFactory);
107 $plan = $service->getHarvestPlan(
"test");
108 $this->assertEquals(
"Hello", $plan);
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")
122 $dkanHarvester = (
new Chain($this))
123 ->add(HarvestService::class,
"harvest",
"Hello")
126 $service = $this->getMockBuilder(HarvestService::class)
127 ->setConstructorArgs([$storeFactory])
128 ->setMethods([
'getDkanHarvesterInstance'])
131 $service->method(
'getDkanHarvesterInstance')->willReturn($dkanHarvester);
133 $result = $service->getHarvestRunInfo(
"test",
"1");
134 $this->assertFalse($result);
140 private function getStorageFactory() {
141 if (!isset($this->storageFactory)) {
142 $this->storageFactory =
new class() implements FactoryInterface {
143 private $stores = [];
148 public function getInstance(
string $identifier, array $config = []) {
149 if (!isset($this->stores[$identifier])) {
150 $this->stores[$identifier] =
new class() extends Memory {
155 public function retrieveAll(): array {
156 return array_keys(parent::retrieveAll());
162 public function destroy() {
168 return $this->stores[$identifier];
174 return $this->storageFactory;