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