ILIAS  release_7 Revision v7.30-3-g800a261c036
BasicPersistenceTest.php
Go to the documentation of this file.
1<?php
2
20
38use Mockery;
39use PHPUnit\Framework\TestCase;
40
41require_once("libs/composer/vendor/autoload.php");
42require_once("./Services/ActiveRecord/Connector/class.arConnector.php");
43require_once("./Services/ActiveRecord/Connector/class.arConnectorMap.php");
44
55class BasicPersistenceTest extends TestCase
56{
57 use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
58
60 protected $bucket;
61
63 protected $persistence;
64
65 public function setUp() : void
66 {
67 $dic = new Container();
68 $dic[Bucket::class] = function ($c) {
69 return new BasicBucket();
70 };
71
73 $this->persistence = BasicPersistence::instance($this->createMock(\ilDBInterface::class));
74
75 $bucket = new BasicBucket(Mockery::mock(Persistence::class));
76 $bucket->setUserId(3);
77 $bucket->setState(State::SCHEDULED);
78
80 $a = $factory->createInstance(PlusJob::class);
82 $b = $factory->createInstance(PlusJob::class);
84 $c = $factory->createInstance(PlusJob::class);
85
86 $a->setInput([1, 1]);
87 $b->setInput([1, 1]);
88 $c->setInput([$a, $b]);
89
91 $userInteraction = $factory->createInstance(DownloadInteger::class);
92 $userInteraction->setInput([$c]);
93
94 $bucket->setTask($userInteraction);
95
96 $this->bucket = $bucket;
97 }
98
102 public function testSave()
103 {
105 $bucketConnector = Mockery::namedMock("bucketConnectorMock", \arConnector::class);
107 $valueConnector = Mockery::namedMock("valueConnectorMock", \arConnector::class);
109 $taskConnector = Mockery::namedMock("taskConnectorMock", \arConnector::class);
111 $valueToTaskConnector = Mockery::namedMock("valueToTaskConnectorMock", \arConnector::class);
112
113 \arConnectorMap::register(new BucketContainer(), $bucketConnector);
114 \arConnectorMap::register(new ValueContainer(), $valueConnector);
115 \arConnectorMap::register(new TaskContainer(), $taskConnector);
116 \arConnectorMap::register(new ValueToTaskContainer(), $valueToTaskConnector);
117
118 // Bucket is created.
119 $bucketConnector->shouldReceive("nextID")->once()->andReturn(1);
120 $bucketConnector->shouldReceive("create")->once();
121
122 // Bucket is updated after tasks are added.
123 $bucketConnector->shouldReceive("affectedRows")->once()->andReturn(1);
124 $bucketConnector->shouldReceive("update")->once()->andReturn(true);
125
126 //For all four tasks
127 for ($i = 0; $i < 4; $i++) {
128 // task is created
129 $taskConnector->shouldReceive("affectedRows")->once()->andReturn(0);
130 $taskConnector->shouldReceive("nextID")->once()->andReturn(1);
131 $taskConnector->shouldReceive("create")->once();
132
133 // task is updated after values are linked.
134 $taskConnector->shouldReceive("affectedRows")->once()->andReturn(1);
135 $taskConnector->shouldReceive("update")->once();
136 }
137
138 // Create seven values
139 $valueConnector->shouldReceive("affectedRows")->times(7)->andReturn(0);
140 $valueConnector->shouldReceive("nextID")->times(7)->andReturn(1);
141 $valueConnector->shouldReceive("create")->times(7);
142
143 // Connect the seven values to the
144 $valueToTaskConnector->shouldReceive("affectedRows")->times(7)->andReturn(0);
145 $valueToTaskConnector->shouldReceive("nextID")->times(7)->andReturn(1);
146 $valueToTaskConnector->shouldReceive("create")->times(7);
147
148 $this->persistence->setConnector($bucketConnector);
149 $this->persistence->saveBucketAndItsTasks($this->bucket);
150 }
151
153 {
154 // We have an unknown observer, we can't update it.
155 $this->expectException(SerializationException::class);
156
157 $this->persistence->updateBucket($this->bucket);
158 }
159
160 public function testUpdateObserver()
161 {
162 // We do the whole save part.
163 $this->testSave();
165 $observerConnector = Mockery::namedMock("observerConnectorMock", \arConnector::class);
166
167 \arConnectorMap::register(new BucketContainer(), $observerConnector);
168
169 // Observer is updated after tasks are added.
170 $observerConnector->shouldReceive("read")->once()->andReturn(1);
171 $observerConnector->shouldReceive("update")->once()->andReturn(true);
172
173 $this->persistence->setConnector($observerConnector);
174 $this->persistence->updateBucket($this->bucket);
175 }
176
177 public function testGetObserverIdsOfUser()
178 {
180 $observerConnector = Mockery::namedMock("observerConnectorMock", \arConnector::class);
181
182 \arConnectorMap::register(new BucketContainer(), $observerConnector);
183 $observerConnector->shouldReceive("readSet")->once()->andReturn([["id" => 2], ["id" => 3]]);
184
185 $this->persistence->setConnector($observerConnector);
186 $observer_ids = $this->persistence->getBucketIdsOfUser(5);
187 $this->assertEquals($observer_ids, [0 => 2, 1 => 3]);
188 }
189
190 public function testGetObserverIdsByState()
191 {
193 $observerConnector = Mockery::namedMock("observerConnectorMock", \arConnector::class);
194
195 \arConnectorMap::register(new BucketContainer(), $observerConnector);
196 $observerConnector->shouldReceive("readSet")->once()->andReturn([["id" => 2], ["id" => 3]]);
197
198 $this->persistence->setConnector($observerConnector);
199 $observer_ids = $this->persistence->getBucketIdsByState(State::RUNNING);
200 $this->assertEquals($observer_ids, [2 => 2, 3 => 3]);
201 }
202
203
204 public function testUserInteraction()
205 {
206 $this->expectException(UserInteractionRequiredException::class);
208 $taskManager = new SyncTaskManager(Mockery::mock(Persistence::class));
210 $taskManager->executeTask($this->bucket->getTask(), new MockObserver());
211 }
212
213 public function testContinueUserInteraction()
214 {
216 $taskManager = new SyncTaskManager(Mockery::mock(Persistence::class));
217 try {
219 $taskManager->executeTask($this->bucket->getTask(), new NonPersistingObserver($this->bucket));
220 } catch (UserInteractionRequiredException $e) {
221 }
222
223 $download_integer = new DownloadInteger();
224
225 // We worked on the task up to the user interaction. The current task should be the download integer interaction.
226 self::assertEquals($this->bucket->getCurrentTask()->getType(), $download_integer->getType());
227
228 $options = $download_integer->getOptions([]); // Download, Dismiss (the input doesnt matter so we pass an empty array)
229
230 $dismiss = $download_integer->getRemoveOption();
231
232 $this->bucket->userInteraction($dismiss); // We "click" Dismiss.
233
234 // As we dismissed the last user interaction the state is finished.
235 self::assertEquals($this->bucket->getState(), State::FINISHED);
236 }
237
238 public function testContinueUserInteraction2()
239 {
240 $dic = new Container();
241
242 $factory = new Injector($dic, new EmptyDependencyMap());
243
244 $c = $this->bucket->getTask();
246 $x = $factory->createInstance(PlusJob::class);
247
248 $x->setInput([$c, 1]);
249
250 // we now have (1 + 1) + (1 + 1) -> User Interaction x -> (x + 1) Where x will be the input of the user interaction so: 4.
251 $this->bucket->setTask($x);
252
254 $taskManager = new SyncTaskManager(Mockery::mock(Persistence::class));
255 try {
257 $taskManager->executeTask($this->bucket->getTask(), new NonPersistingObserver($this->bucket));
258 } catch (UserInteractionRequiredException $e) {
259 }
260
261 $download_integer = new DownloadInteger();
262
263 // We worked on the task up to the user interaction. The current task should be the download integer interaction.
264 self::assertEquals($this->bucket->getCurrentTask()->getType(), $download_integer->getType());
265
266 $options = $download_integer->getOptions([]); // Download, Dismiss (the input doesn't matter so we pass an empty array)
267
268 $dismiss = $download_integer->getRemoveOption();
269
270 $this->bucket->userInteraction($dismiss); // We "click" Dismiss.
271
272 // As we dismissed the last user interaction the state is finished.
274 $result = $taskManager->executeTask($this->bucket->getTask(), new NonPersistingObserver($this->bucket));
275 self::assertEquals(5, $result->getValue());
276 }
277}
$result
An exception for terminatinating execution or to throw for unit testing.
Customizing of pimple-DIC for ILIAS.
Definition: Container.php:19
static register(ActiveRecord $ar, arConnector $connector)
$c
Definition: cli.php:37
$factory
Definition: metadata.php:58
$i
Definition: metadata.php:24
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
$dic
Definition: result.php:13