ILIAS  release_8 Revision v8.23
ilForumNotificationTest.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
24 
25 class ilForumNotificationTest extends TestCase
26 {
28  private $database;
30  private $user;
32  private $tree;
33  private ?Container $dic = null;
34 
35  public function testConstruct(): void
36  {
37  $this->assertInstanceOf(ilForumNotification::class, new ilForumNotification(938));
38  }
39 
40  public function testGetterAndSetter(): void
41  {
42  $instance = new ilForumNotification(940);
43  $instance->setNotificationId(1);
44  $this->assertSame(1, $instance->getNotificationId());
45  $instance->setUserId(2);
46  $this->assertSame(2, $instance->getUserId());
47  $instance->setForumId(3);
48  $this->assertSame(3, $instance->getForumId());
49  $instance->setThreadId(4);
50  $this->assertSame(4, $instance->getThreadId());
51  $instance->setInterestedEvents(5);
52  $this->assertSame(5, $instance->getInterestedEvents());
53  $instance->setAdminForce(true);
54  $this->assertTrue($instance->getAdminForce());
55  $instance->setUserToggle(true);
56  $this->assertTrue($instance->getUserToggle());
57  $instance->setForumRefId(6);
58  $this->assertSame(6, $instance->getForumRefId());
59  $instance->setUserIdNoti(7);
60  $this->assertSame(7, $instance->getUserIdNoti());
61  }
62 
63  public function testIsAdminForceNotification(): void
64  {
65  $forumId = 745;
66  $userId = 271;
67 
68  $mockStatement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
69  $this->database->expects(self::once())->method('queryF')->with(
70  '
71  SELECT admin_force_noti FROM frm_notification
72  WHERE user_id = %s
73  AND frm_id = %s
74  AND user_id_noti > %s ',
75  ['integer', 'integer', 'integer'],
76  [$userId, $forumId, 0]
77  )->willReturn($mockStatement);
78  $this->database->expects(self::once())->method('fetchAssoc')->with($mockStatement)->willReturn(['admin_force_noti' => '1']);
79 
80  $instance = new ilForumNotification(375);
81  $instance->setForumId($forumId);
82  $instance->setUserId($userId);
83 
84  $this->assertTrue($instance->isAdminForceNotification());
85  }
86 
87  public function testIsAdminForceNotificationFailed(): void
88  {
89  $forumId = 745;
90  $userId = 271;
91 
92  $mockStatement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
93  $this->database->expects(self::once())->method('queryF')->with(
94  '
95  SELECT admin_force_noti FROM frm_notification
96  WHERE user_id = %s
97  AND frm_id = %s
98  AND user_id_noti > %s ',
99  ['integer', 'integer', 'integer'],
100  [$userId, $forumId, 0]
101  )->willReturn($mockStatement);
102  $this->database->expects(self::once())->method('fetchAssoc')->with($mockStatement)->willReturn(null);
103 
104  $instance = new ilForumNotification(375);
105  $instance->setForumId($forumId);
106  $instance->setUserId($userId);
107 
108  $this->assertFalse($instance->isAdminForceNotification());
109  }
110 
111  public function testIsUserToggleNotification(): void
112  {
113  $forumId = 745;
114  $userId = 271;
115 
116  $mockStatement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
117  $this->database->expects(self::once())->method('queryF')->with(
118  '
119  SELECT user_toggle_noti FROM frm_notification
120  WHERE user_id = %s
121  AND frm_id = %s
122  AND user_id_noti > %s',
123  ['integer', 'integer', 'integer'],
124  [$userId, $forumId, 0]
125  )->willReturn($mockStatement);
126  $this->database->expects(self::once())->method('fetchAssoc')->with($mockStatement)->willReturn(['user_toggle_noti' => '1']);
127 
128  $instance = new ilForumNotification(375);
129  $instance->setForumId($forumId);
130  $instance->setUserId($userId);
131 
132  $this->assertTrue($instance->isUserToggleNotification());
133  }
134 
135  public function testIsUserToggleNotificationFailed(): void
136  {
137  $forumId = 745;
138  $userId = 271;
139 
140  $mockStatement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
141  $this->database->expects(self::once())->method('queryF')->with(
142  '
143  SELECT user_toggle_noti FROM frm_notification
144  WHERE user_id = %s
145  AND frm_id = %s
146  AND user_id_noti > %s',
147  ['integer', 'integer', 'integer'],
148  [$userId, $forumId, 0]
149  )->willReturn($mockStatement);
150  $this->database->expects(self::once())->method('fetchAssoc')->with($mockStatement)->willReturn(null);
151 
152  $instance = new ilForumNotification(375);
153  $instance->setForumId($forumId);
154  $instance->setUserId($userId);
155 
156  $this->assertFalse($instance->isUserToggleNotification());
157  }
158 
159  public function testInsertAdminForce(): void
160  {
161  $userToggle = true;
162  $adminForce = false;
163  $forumId = 970;
164  $userId = 530;
165  $objUserId = 3627;
166  $nextId = 3737;
167 
168  $this->user->expects(self::once())->method('getId')->willReturn($objUserId);
169 
170  $this->database->expects(self::once())->method('nextId')->willReturn($nextId);
171  $this->database->expects(self::once())->method('manipulateF')->with(
172  '
173  INSERT INTO frm_notification
174  (notification_id, user_id, frm_id, admin_force_noti, user_toggle_noti, user_id_noti)
175  VALUES(%s, %s, %s, %s, %s, %s)',
176  ['integer', 'integer', 'integer', 'integer', 'integer', 'integer'],
177  [
178  $nextId,
179  $userId,
180  $forumId,
181  $adminForce,
182  $userToggle,
183  $objUserId
184  ]
185  );
186 
187  $instance = new ilForumNotification(480);
188  $instance->setUserId($userId);
189  $instance->setForumId($forumId);
190  $instance->setAdminForce($adminForce);
191  $instance->setUserToggle($userToggle);
192 
193  $instance->insertAdminForce();
194  }
195 
196  public function testDeleteAdminForce(): void
197  {
198  $userId = 739;
199  $forumId = 48849;
200 
201  $this->database->expects(self::once())->method('manipulateF')->with(
202  '
203  DELETE FROM frm_notification
204  WHERE user_id = %s
205  AND frm_id = %s
206  AND admin_force_noti = %s
207  AND user_id_noti > %s',
208  ['integer', 'integer', 'integer', 'integer'],
209  [$userId, $forumId, 1, 0]
210  );
211 
212  $instance = new ilForumNotification(292);
213  $instance->setUserId($userId);
214  $instance->setForumId($forumId);
215 
216  $instance->deleteAdminForce();
217  }
218 
219  public function testDeleteUserToggle(): void
220  {
221  $forumId = 3877;
222  $userId = 3839;
223  $this->database->expects(self::once())->method('manipulateF')->with(
224  '
225  DELETE FROM frm_notification
226  WHERE user_id = %s
227  AND frm_id = %s
228  AND admin_force_noti = %s
229  AND user_toggle_noti = %s
230  AND user_id_noti > %s',
231  ['integer', 'integer', 'integer', 'integer', 'integer'],
232  [$userId, $forumId, 1, 1, 0]
233  );
234 
235  $instance = new ilForumNotification(3830);
236  $instance->setUserId($userId);
237  $instance->setForumId($forumId);
238  $instance->deleteUserToggle();
239  }
240 
241  public function testupdateUserToggle(): void
242  {
243  $userToggle = true;
244  $forumId = 3877;
245  $userId = 3839;
246 
247  $this->database->expects(self::once())->method('manipulateF')->with(
248  'UPDATE frm_notification SET user_toggle_noti = %s WHERE user_id = %s AND frm_id = %s AND admin_force_noti = %s',
249  ['integer', 'integer', 'integer', 'integer'],
250  [$userToggle, $userId, $forumId, 1]
251  );
252 
253  $instance = new ilForumNotification(3830);
254  $instance->setUserId($userId);
255  $instance->setForumId($forumId);
256  $instance->setUserToggle($userToggle);
257  $instance->updateUserToggle();
258  }
259 
260  public function testCheckForumsExistsInsert(): void
261  {
262  $nodeData = [];
263  $userId = 927;
264  $refId = 847;
265  $subTree = [['child' => 3719, 'ref_id' => 3738, 'obj_id' => 182]];
266  $pathNode = [['child' => $refId, 'type' => 'aa']];
267 
268  $this->tree->expects(self::once())->method('getNodePath')->with($subTree[0]['child'], $refId)->willReturn($pathNode);
269  $this->tree->expects(self::once())->method('getNodeData')->with($refId)->willReturn($nodeData);
270  $this->tree->expects(self::once())->method('getSubTree')->with(
271  $nodeData,
272  true,
273  ['frm']
274  )->willReturn($subTree);
275 
277  }
278 
279  public function testUpdate(): void
280  {
281  $forumId = 1122;
282  $userId = 484;
283  $events = 848;
284  $userToggle = true;
285  $adminForce = false;
286  $this->database->expects(self::once())->method('manipulateF')->with(
287  'UPDATE frm_notification SET admin_force_noti = %s, user_toggle_noti = %s, ' .
288  'interested_events = %s WHERE user_id = %s AND frm_id = %s',
289  ['integer', 'integer', 'integer', 'integer', 'integer'],
290  [
291  (int) $adminForce,
292  (int) $userToggle,
293  $events,
294  $userId,
295  $forumId
296  ]
297  );
298 
299  $instance = new ilForumNotification(8380);
300  $instance->setAdminForce($adminForce);
301  $instance->setUserToggle($userToggle);
302  $instance->setInterestedEvents($events);
303  $instance->setUserId($userId);
304  $instance->setForumId($forumId);
305 
306  $instance->update();
307  }
308 
309  public function testDeleteNotificationAllUsers(): void
310  {
311  $forumId = 490;
312  $this->database->expects(self::once())->method('manipulateF')->with(
313  'DELETE FROM frm_notification WHERE frm_id = %s AND user_id_noti > %s',
314  ['integer', 'integer'],
315  [$forumId, 0]
316  );
317 
318  $instance = new ilForumNotification(3490);
319  $instance->setForumId($forumId);
320 
321  $instance->deleteNotificationAllUsers();
322  }
323 
324 
325  public function testRead(): void
326  {
327  $forumId = 4859;
328  $row = [
329  'notification_id' => 789,
330  'user_id' => 490,
331  'frm_id' => 380,
332  'thread_id' => 280,
333  'admin_force_noti' => 20,
334  'user_toggle_noti' => 90,
335  'interested_events' => 8,
336  'user_id_noti' => 6,
337  ];
338  $mockStatement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
339  $this->database->expects(self::exactly(2))->method('fetchAssoc')->willReturn(
340  $row,
341  null
342  );
343  $this->database->expects(self::once())->method('queryF')->with(
344  'SELECT * FROM frm_notification WHERE frm_id = %s',
345  ['integer'],
346  [$forumId]
347  )->willReturn($mockStatement);
348 
349  $instance = new ilForumNotification(84849);
350  $instance->setForumId($forumId);
351 
352  $this->assertSame([
353  $row['user_id'] => $row,
354  ], $instance->read());
355  }
356 
357  public function testMergeThreadNotifications(): void
358  {
359  $srcRow = ['user_id' => 47349];
360  $mismatchUserIdRow = ['user_id' => 37, 'notification_id' => 48];
361  $matchUserIdRow = ['user_id' => $srcRow['user_id'], 'notification_id' => 380];
362  $targetId = 840;
363  $srcId = 5749;
364  $srcStatement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
365  $targetStatement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
366  $this->database->expects(self::exactly(2))->method('queryF')->withConsecutive(
367  [
368  'SELECT notification_id, user_id FROM frm_notification WHERE frm_id = %s AND thread_id = %s ORDER BY user_id ASC',
369  ['integer', 'integer'],
370  [0, $srcId],
371  ],
372  [
373  'SELECT DISTINCT user_id FROM frm_notification WHERE frm_id = %s AND thread_id = %s ORDER BY user_id ASC',
374  ['integer', 'integer'],
375  [0, $targetId],
376  ],
377  )->willReturnOnConsecutiveCalls($srcStatement, $targetStatement);
378 
379  $this->database->expects(self::exactly(5))
380  ->method('fetchAssoc')
381  ->withConsecutive([$srcStatement], [$srcStatement], [$targetStatement], [$targetStatement], [$targetStatement])
382  ->willReturnOnConsecutiveCalls($srcRow, null, $matchUserIdRow, $mismatchUserIdRow, null);
383 
384  $this->database->expects(self::once())->method('manipulateF')->with(
385  'DELETE FROM frm_notification WHERE notification_id = %s',
386  ['integer'],
387  [$matchUserIdRow['notification_id']]
388  );
389 
390  $this->database->expects(self::once())->method('update')->with(
391  'frm_notification',
392  ['thread_id' => ['integer', $targetId]],
393  ['thread_id' => ['integer', $srcId]]
394  );
395 
397  }
398 
399  public function testExistsNotification(): void
400  {
401  $adminForce = false;
402  $forumId = 7332;
403  $userId = 5758;
404 
405  $statement = $this->getMockBuilder(ilDBStatement::class)->disableOriginalConstructor()->getMock();
406  $this->database->expects(self::once())->method('queryF')->with(
407  'SELECT user_id FROM frm_notification WHERE user_id = %s AND frm_id = %s AND admin_force_noti = %s',
408  ['integer', 'integer', 'integer'],
409  [$userId, $forumId, (int) $adminForce]
410  )->willReturn($statement);
411 
412  $this->database->expects(self::once())->method('numRows')->with($statement)->willReturn(8);
413 
414  $instance = new ilForumNotification(434);
415  $instance->setForumId($forumId);
416  $instance->setUserId($userId);
417 
418  $this->assertTrue($instance->existsNotification());
419  }
420 
421  protected function setUp(): void
422  {
423  global $DIC;
424 
425  $this->dic = is_object($DIC) ? clone $DIC : $DIC;
426 
427  $DIC = new Container();
428 
429  $DIC['ilDB'] = ($this->database = $this->createMock(ilDBInterface::class));
430  $DIC['ilUser'] = ($this->user = $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock());
431  $DIC['ilObjDataCache'] = $this->getMockBuilder(ilObjectDataCache::class)->disableOriginalConstructor()->getMock();
432  $DIC['tree'] = ($this->tree = $this->getMockBuilder(ilTree::class)->disableOriginalConstructor()->getMock());
433  }
434 
435  protected function tearDown(): void
436  {
437  global $DIC;
438 
439  $DIC = $this->dic;
440 
441  parent::tearDown();
442  }
443 }
$refId
Definition: xapitoken.php:58
Customizing of pimple-DIC for ILIAS.
Definition: Container.php:31
global $DIC
Definition: feed.php:28
static mergeThreadNotifications($merge_source_thread_id, $merge_target_thread_id)
static checkForumsExistsInsert(int $ref_id, int $user_id)