ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
BasicPersistenceTestTBD.php
Go to the documentation of this file.
1<?php
2
20
21use PHPUnit\Framework\Attributes\BackupGlobals;
22use PHPUnit\Framework\Attributes\BackupStaticProperties;
23use PHPUnit\Framework\Attributes\PreserveGlobalState;
24use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
41use Mockery;
42use PHPUnit\Framework\TestCase;
43
44require_once("vendor/composer/vendor/autoload.php");
45require_once("./components/ILIAS/ActiveRecord/Connector/class.arConnector.php");
46require_once("./components/ILIAS/ActiveRecord/Connector/class.arConnectorMap.php");
47
54#[BackupGlobals(false)]
55#[BackupStaticProperties(false)]
56#[PreserveGlobalState(false)]
57class BasicPersistenceTest extends TestCase
58{
59 use MockeryPHPUnitIntegration;
60
62 protected $bucket;
63
65 protected $persistence;
66
67 public function setUp(): void
68 {
69 $dic = new Container();
70 $dic[Bucket::class] = (fn($c): BasicBucket => new BasicBucket());
71
72 $factory = new Injector($dic, new BaseDependencyMap());
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(): void
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
152 public function testCannotUpdateUnknownBucket(): void
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(): void
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 => new BucketContainer()]);
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(): void
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(): void
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(): void
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(): void
214 {
216 $taskManager = new SyncTaskManager(Mockery::mock(Persistence::class));
217 try {
219 $taskManager->executeTask($this->bucket->getTask(), new NonPersistingObserver($this->bucket));
220 } catch (UserInteractionRequiredException) {
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 $this->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 $this->assertEquals(State::FINISHED, $this->bucket->getState());
236 }
237
238 public function testContinueUserInteraction2(): void
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) {
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 $this->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 $this->assertEquals(5, $result->getValue());
276 }
277}
Customizing of pimple-DIC for ILIAS.
Definition: Container.php:36
static register(ActiveRecord $activeRecord, arConnector $arConnector)
$c
Definition: deliver.php:25
$dic
Definition: ltiresult.php:33
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