99
1010namespace  OCA \OpenProject \Service ;
1111
12+ use  OCA \Notifications \Handler ;
13+ use  OCP \Http \Client \IClientService ;
1214use  OCP \Http \Client \IResponse ;
1315use  OCP \IConfig ;
1416use  OCP \IUserManager ;
1719use  PHPUnit \Framework \TestCase ;
1820
1921class  OpenProjectAPIServiceCheckNotificationsTest extends  TestCase {
20- 	public  function  testCheckNotifications (): void  {
21- 		$ configMock$ this getMockBuilder (IConfig::class)->getMock ();
22- 		$ configMock
22+ 	/** @var IConfig $configMock */ 
23+ 	private  $ configMock
24+ 
25+ 	/** 
26+ 	 * @return void 
27+ 	 * @before 
28+ 	 */ 
29+ 	public  function  setUpMocks (): void  {
30+ 		$ this configMock  = $ this getMockBuilder (IConfig::class)->getMock ();
31+ 		$ this configMock 
2332			->method ('getUserValue ' )
2433			->withConsecutive (
2534				[$ this anything (), 'integration_openproject ' , 'token ' ],
@@ -34,7 +43,7 @@ public function testCheckNotifications(): void {
3443				'refresh-token ' ,
3544			);
3645
37- 		$ configMock
46+ 		$ this -> configMock 
3847			->method ('getAppValue ' )
3948			->withConsecutive (
4049				['integration_openproject ' , 'default_enable_notifications ' ,'0 ' ],
@@ -47,26 +56,211 @@ public function testCheckNotifications(): void {
4756				'SECRET ' ,
4857				'https://openproject ' ,
4958			);
59+ 	}
5060
61+ 	/** 
62+ 	 * @param string|null $oPNotificationAPIResponse 
63+ 	 * @return IClientService 
64+ 	 */ 
65+ 	private  function  getClientServiceMock ($ oPNotificationAPIResponsenull ): IClientService 
5166		$ response$ this getMockBuilder (IResponse::class)->getMock ();
52- 		$ oPNotificationAPIResponse'{  
67+ 		if  ($ oPNotificationAPIResponsenull ) {
68+ 			$ oPNotificationAPIResponse'{  
5369			"_type": "Collection", 
5470			"_embedded": { 
5571			"elements": 
5672		 '
57- 		$ oPNotificationAPIResponsefile_get_contents (
58- 			__DIR__  . '/../../jest/fixtures/notificationsResponse.json ' 
59- 		);
60- 		$ oPNotificationAPIResponse'}} ' ;
73+ 			$ oPNotificationAPIResponsefile_get_contents (
74+ 				__DIR__  . '/../../jest/fixtures/notificationsResponse.json ' 
75+ 			);
76+ 			$ oPNotificationAPIResponse'}} ' ;
77+ 		}
6178		$ responsemethod ('getBody ' )->willReturn ($ oPNotificationAPIResponse
6279		$ ocClient$ this getMockBuilder ('\OCP\Http\Client\IClient ' )->getMock ();
6380		$ ocClientmethod ('get ' )->willReturn ($ response
6481		$ clientService$ this getMockBuilder ('\OCP\Http\Client\IClientService ' )->getMock ();
6582		$ clientServicemethod ('newClient ' )->willReturn ($ ocClient
83+ 		return  $ clientService
84+ 	}
85+ 
86+ 	/** 
87+ 	 * @param IManager $notificationManagerMock 
88+ 	 * @param IClientService $clientServiceMock 
89+ 	 * @param Handler $handlerMock 
90+ 	 * @return OpenProjectAPIService 
91+ 	 */ 
92+ 	private  function  getService ($ notificationManagerMock$ clientServiceMock$ handlerMockOpenProjectAPIService 
93+ 		return  new  OpenProjectAPIService (
94+ 			'integration_openproject ' ,
95+ 			\OC ::$ serverget (IUserManager::class),
96+ 			$ this createMock (\OCP \IAvatarManager::class),
97+ 			$ this createMock (\Psr \Log \LoggerInterface::class),
98+ 			$ this createMock (\OCP \IL10N ::class),
99+ 			$ this configMock ,
100+ 			$ notificationManagerMock
101+ 			$ clientServiceMock
102+ 			$ this createMock (\OCP \Files \IRootFolder::class),
103+ 			$ this createMock (\OCP \IURLGenerator::class),
104+ 			$ this createMock (\OCP \ICacheFactory::class),
105+ 			$ handlerMock
106+ 		);
107+ 	}
66108
109+ 	public  function  testCheckNotifications (): void  {
67110		$ notificationManagerMock$ this getMockBuilder (IManager::class)->getMock ();
111+ 		$ notificationMock$ this getMockBuilder (INotification::class)
112+ 			->getMock ();
68113
114+ 		$ notificationMock
115+ 			->expects ($ this exactly (3 ))
116+ 			->method ('setSubject ' )
117+ 			->withConsecutive (
118+ 				[
119+ 					'op_notification ' ,
120+ 					[
121+ 						'wpId '  => '36 ' ,
122+ 						'resourceTitle '  => 'write a software ' ,
123+ 						'projectTitle '  => 'Dev-large ' ,
124+ 						'count '  => 2 ,
125+ 						'reasons '  => ['assigned ' ],
126+ 						'actors '  => ['Admin de DEV user ' ],
127+ 						'updatedAt '  => '2022-08-17T10:28:12Z ' 
128+ 					]
129+ 				],
130+ 				[
131+ 					'op_notification ' ,
132+ 					[
133+ 						'wpId '  => '17 ' ,
134+ 						'resourceTitle '  => 'Create wireframes for new landing page ' ,
135+ 						'projectTitle '  => 'Scrum project ' ,
136+ 						'count '  => 5 ,
137+ 						'reasons '  => [0  => 'assigned ' , 3  => 'mentioned ' ],
138+ 						'actors '  => [0  => 'Admin de DEV user ' , 2  => 'Artur Neumann ' ],
139+ 						'updatedAt '  => '2022-08-17T10:27:41Z ' 
140+ 					]
141+ 				],
142+ 				[
143+ 					'op_notification ' ,
144+ 					[
145+ 						'wpId '  => '18 ' ,
146+ 						'resourceTitle '  => 'Contact form ' ,
147+ 						'projectTitle '  => 'Scrum project ' ,
148+ 						'count '  => 1 ,
149+ 						'reasons '  => ['mentioned ' ],
150+ 						'actors '  => ['Artur Neumann ' ],
151+ 						'updatedAt '  => '2022-08-09T08:00:08Z ' 
152+ 					]
153+ 				]
154+ 			);
69155
156+ 		$ notificationManagerMock
157+ 			->expects ($ this exactly (4 )) //once for marking as read and once for every notification 
158+ 			->method ('createNotification ' )
159+ 			->willReturn ($ notificationMock
160+ 
161+ 		$ notificationManagerMock
162+ 			->expects ($ this exactly (3 ))
163+ 			->method ('notify ' );
164+ 
165+ 		$ service$ this getService (
166+ 			$ notificationManagerMock
167+ 			$ this getClientServiceMock (),
168+ 			$ this createMock (Handler::class)
169+ 		);
170+ 		$ servicecheckNotifications ();
171+ 	}
172+ 	public  function  testCheckNotificationsAfterAllNotificationsAreMarkedAsRead (): void  {
173+ 		$ oPNotificationAPIResponse'{  
174+ 			"_type": "Collection", 
175+ 			"_embedded": { 
176+ 			"elements": [] 
177+ 			} 
178+ 		} 
179+ 		 '
180+ 		$ notificationManagerMock$ this getMockBuilder (IManager::class)->getMock ();
181+ 		$ notificationMock$ this getMockBuilder (INotification::class)
182+ 			->getMock ();
183+ 
184+ 		$ notificationMock
185+ 			->expects ($ this never ())
186+ 			->method ('setSubject ' );
187+ 
188+ 		$ notificationManagerMock
189+ 			->expects ($ this exactly (1 )) //for marking as read 
190+ 			->method ('createNotification ' )
191+ 			->willReturn ($ notificationMock
192+ 
193+ 		$ notificationManagerMock
194+ 			->expects ($ this exactly (2 ))
195+ 			->method ('markProcessed ' );
196+ 
197+ 		$ currentNotificationMock0$ this getMockBuilder (INotification::class)->getMock ();
198+ 		$ currentNotificationMock0
199+ 			->method ('getSubjectParameters ' )
200+ 			->willReturn (['wpId '  => 34 , 'updatedAt '  => '2022-11-08T06:34:40Z ' ]);
201+ 		$ currentNotificationMock1$ this getMockBuilder (INotification::class)->getMock ();
202+ 		$ currentNotificationMock1
203+ 			->method ('getSubjectParameters ' )
204+ 			->willReturn (['wpId '  => 16 , 'updatedAt '  => '2022-11-07T06:34:40Z ' ]);
205+ 
206+ 		$ handlerMock$ this getMockBuilder (Handler::class)->disableOriginalConstructor ()->getMock ();
207+ 		$ handlerMockmethod ('get ' )
208+ 			->willReturn (
209+ 				[12  => $ currentNotificationMock013  => $ currentNotificationMock1
210+ 			);
211+ 		$ service$ this getService (
212+ 			$ notificationManagerMock
213+ 			$ this getClientServiceMock ($ oPNotificationAPIResponse
214+ 			$ handlerMock
215+ 		);
216+ 		$ servicecheckNotifications ();
217+ 	}
218+ 	public  function  testCheckNotificationsAfterAllNotificationsOfOneWPAreMarkedAsRead (): void  {
219+ 		$ notificationManagerMock$ this getMockBuilder (IManager::class)->getMock ();
220+ 		$ notificationMock$ this getMockBuilder (INotification::class)
221+ 			->getMock ();
222+ 
223+ 		$ notificationMock
224+ 			->expects ($ this exactly (3 )) // new notifications should be set 
225+ 			->method ('setSubject ' );
226+ 
227+ 		$ notificationManagerMock
228+ 			->expects ($ this exactly (4 )) //once for marking as read and once for every notification 
229+ 			->method ('createNotification ' )
230+ 			->willReturn ($ notificationMock
231+ 
232+ 		$ notificationManagerMock
233+ 			->expects ($ this exactly (3 )) // for new notifications 
234+ 			->method ('notify ' );
235+ 
236+ 		$ notificationManagerMock
237+ 			->expects ($ this exactly (2 ))
238+ 			->method ('markProcessed ' ); // for current ones that do not exist in the new response 
239+ 
240+ 		// current notifications of WP that do not exist in the new response 
241+ 		$ currentNotificationMock0$ this getMockBuilder (INotification::class)->getMock ();
242+ 		$ currentNotificationMock0
243+ 			->method ('getSubjectParameters ' )
244+ 			->willReturn (['wpId '  => 34 , 'updatedAt '  => '2022-11-08T06:34:40Z ' ]);
245+ 		$ currentNotificationMock1$ this getMockBuilder (INotification::class)->getMock ();
246+ 		$ currentNotificationMock1
247+ 			->method ('getSubjectParameters ' )
248+ 			->willReturn (['wpId '  => 16 , 'updatedAt '  => '2022-11-07T06:34:40Z ' ]);
249+ 
250+ 		$ handlerMock$ this getMockBuilder (Handler::class)->disableOriginalConstructor ()->getMock ();
251+ 		$ handlerMockmethod ('get ' )
252+ 			->willReturn (
253+ 				[12  => $ currentNotificationMock013  => $ currentNotificationMock1
254+ 			);
255+ 		$ service$ this getService (
256+ 			$ notificationManagerMock
257+ 			$ this getClientServiceMock (),
258+ 			$ handlerMock
259+ 		);
260+ 		$ servicecheckNotifications ();
261+ 	}
262+ 	public  function  testCheckNotificationsAfterOneWPReceivedANewNotification (): void  {
263+ 		$ notificationManagerMock$ this getMockBuilder (IManager::class)->getMock ();
70264		$ notificationMock$ this getMockBuilder (INotification::class)
71265			->getMock ();
72266
@@ -118,22 +312,27 @@ public function testCheckNotifications(): void {
118312			->willReturn ($ notificationMock
119313
120314		$ notificationManagerMock
121- 			->expects ($ this exactly (3 ))
315+ 			->expects ($ this exactly (3 ))  // for new notifications 
122316			->method ('notify ' );
123317
124- 		$ servicenew  OpenProjectAPIService (
125- 			'integration_openproject ' ,
126- 			\OC ::$ serverget (IUserManager::class),
127- 			$ this createMock (\OCP \IAvatarManager::class),
128- 			$ this createMock (\Psr \Log \LoggerInterface::class),
129- 			$ this createMock (\OCP \IL10N ::class),
130- 			$ configMock
318+ 		$ notificationManagerMock
319+ 			->expects ($ this exactly (1 ))
320+ 			->method ('markProcessed ' ); // for the notification that needs to be upldated 
321+ 
322+ 		// this notification is also part of the response, but the response also 
323+ 		// contains an other newer notification of that WP 
324+ 		$ currentNotificationMock0$ this getMockBuilder (INotification::class)->getMock ();
325+ 		$ currentNotificationMock0
326+ 			->method ('getSubjectParameters ' )
327+ 			->willReturn (['wpId '  => 36 , 'updatedAt '  => '2022-08-17T10:13:25Z ' ]);
328+ 
329+ 		$ handlerMock$ this getMockBuilder (Handler::class)->disableOriginalConstructor ()->getMock ();
330+ 		$ handlerMockmethod ('get ' )
331+ 			->willReturn ([12  => $ currentNotificationMock0
332+ 		$ service$ this getService (
131333			$ notificationManagerMock
132- 			$ clientService
133- 			$ this createMock (\OCP \Files \IRootFolder::class),
134- 			$ this createMock (\OCP \IURLGenerator::class),
135- 			$ this createMock (\OCP \ICacheFactory::class),
136- 			$ this createMock (\OCA \Notifications \Handler::class),
334+ 			$ this getClientServiceMock (),
335+ 			$ handlerMock
137336		);
138337		$ servicecheckNotifications ();
139338	}
0 commit comments