33namespace Tests \Feature \Cache ;
44
55use Illuminate \Foundation \Testing \RefreshDatabase ;
6+ use Illuminate \Support \Facades \Cache ;
67use Illuminate \Support \Facades \DB ;
8+ use Illuminate \Support \Facades \Redis ;
9+ use ProcessMaker \Cache \Settings \SettingCacheException ;
710use ProcessMaker \Models \Setting ;
11+ use ProcessMaker \Models \User ;
812use Tests \Feature \Shared \RequestHelper ;
913use Tests \TestCase ;
1014
@@ -13,6 +17,26 @@ class SettingCacheTest extends TestCase
1317 use RequestHelper;
1418 use RefreshDatabase;
1519
20+ protected function setUp (): void
21+ {
22+ parent ::setUp ();
23+
24+ $ this ->user = User::factory ()->create ([
25+ 'is_administrator ' => true ,
26+ ]);
27+
28+ config ()->set ('cache.default ' , 'cache_settings ' );
29+ }
30+
31+ protected function tearDown (): void
32+ {
33+ \SettingCache::clear ();
34+
35+ config ()->set ('cache.default ' , 'array ' );
36+
37+ parent ::tearDown ();
38+ }
39+
1640 private function upgrade ()
1741 {
1842 $ this ->artisan ('migrate ' , [
@@ -115,4 +139,122 @@ public function testGetSettingByNotExistingKey()
115139
116140 $ this ->assertNull ($ setting );
117141 }
142+
143+ public function testClearByPattern ()
144+ {
145+ \SettingCache::set ('password-policies.users_can_change ' , 1 );
146+ \SettingCache::set ('password-policies.numbers ' , 2 );
147+ \SettingCache::set ('password-policies.uppercase ' , 3 );
148+ Cache::put ('session-control.ip_restriction ' , 0 );
149+
150+ $ this ->assertEquals (1 , \SettingCache::get ('password-policies.users_can_change ' ));
151+ $ this ->assertEquals (2 , \SettingCache::get ('password-policies.numbers ' ));
152+ $ this ->assertEquals (3 , \SettingCache::get ('password-policies.uppercase ' ));
153+
154+ $ pattern = 'password-policies ' ;
155+
156+ \SettingCache::clearBy ($ pattern );
157+
158+ $ this ->assertNull (\SettingCache::get ('password-policies.users_can_change ' ));
159+ $ this ->assertNull (\SettingCache::get ('password-policies.numbers ' ));
160+ $ this ->assertNull (\SettingCache::get ('password-policies.uppercase ' ));
161+ }
162+
163+ public function testClearByPatternRemainUnmatched ()
164+ {
165+ \SettingCache::set ('session-control.ip_restriction ' , 0 );
166+ \SettingCache::set ('password-policies.users_can_change ' , 1 );
167+ \SettingCache::set ('password-policies.numbers ' , 2 );
168+ \SettingCache::set ('password-policies.uppercase ' , 3 );
169+
170+ $ this ->assertEquals (0 , \SettingCache::get ('session-control.ip_restriction ' ));
171+ $ this ->assertEquals (1 , \SettingCache::get ('password-policies.users_can_change ' ));
172+ $ this ->assertEquals (2 , \SettingCache::get ('password-policies.numbers ' ));
173+ $ this ->assertEquals (3 , \SettingCache::get ('password-policies.uppercase ' ));
174+
175+ $ pattern = 'password-policies ' ;
176+
177+ \SettingCache::clearBy ($ pattern );
178+
179+ $ this ->assertEquals (0 , \SettingCache::get ('session-control.ip_restriction ' ));
180+ $ this ->assertNull (\SettingCache::get ('password-policies.users_can_change ' ));
181+ $ this ->assertNull (\SettingCache::get ('password-policies.numbers ' ));
182+ $ this ->assertNull (\SettingCache::get ('password-policies.uppercase ' ));
183+ }
184+
185+ public function testClearByPatternWithFailedDeletion ()
186+ {
187+ $ pattern = 'test_pattern ' ;
188+ $ keys = [
189+ 'settings:test_pattern:1 ' ,
190+ 'settings:test_pattern:2 '
191+ ];
192+ \SettingCache::set ('test_pattern:1 ' , 1 );
193+ \SettingCache::set ('test_pattern:2 ' , 2 );
194+
195+ Redis::shouldReceive ('keys ' )
196+ ->with ('*settings:* ' )
197+ ->andReturn ($ keys );
198+
199+ Redis::shouldReceive ('del ' )
200+ ->with ($ keys )
201+ ->andThrow (new SettingCacheException ('Failed to delete keys. ' ));
202+
203+ $ this ->expectException (SettingCacheException::class);
204+ $ this ->expectExceptionMessage ('Failed to delete keys. ' );
205+
206+ \SettingCache::clearBy ($ pattern );
207+ }
208+
209+ public function testTryClearByPatternWithNonRedisDriver ()
210+ {
211+ config ()->set ('cache.default ' , 'array ' );
212+
213+ $ this ->expectException (SettingCacheException::class);
214+ $ this ->expectExceptionMessage ('The cache driver must be Redis. ' );
215+
216+ \SettingCache::clearBy ('pattern ' );
217+ }
218+
219+ public function testClearAllSettings ()
220+ {
221+ \SettingCache::set ('password-policies.users_can_change ' , 1 );
222+ \SettingCache::set ('password-policies.numbers ' , 2 );
223+ \SettingCache::set ('password-policies.uppercase ' , 3 );
224+
225+ $ this ->assertEquals (1 , \SettingCache::get ('password-policies.users_can_change ' ));
226+ $ this ->assertEquals (2 , \SettingCache::get ('password-policies.numbers ' ));
227+ $ this ->assertEquals (3 , \SettingCache::get ('password-policies.uppercase ' ));
228+
229+ \SettingCache::clear ();
230+
231+ $ this ->assertNull (\SettingCache::get ('password-policies.users_can_change ' ));
232+ $ this ->assertNull (\SettingCache::get ('password-policies.numbers ' ));
233+ $ this ->assertNull (\SettingCache::get ('password-policies.uppercase ' ));
234+ }
235+
236+ public function testClearOnlySettings ()
237+ {
238+ \SettingCache::set ('password-policies.users_can_change ' , 1 );
239+ \SettingCache::set ('password-policies.numbers ' , 2 );
240+
241+ config ()->set ('cache.default ' , 'array ' );
242+ Cache::put ('password-policies.uppercase ' , 3 );
243+
244+ config ()->set ('cache.default ' , 'cache_settings ' );
245+ $ this ->assertEquals (1 , \SettingCache::get ('password-policies.users_can_change ' ));
246+ $ this ->assertEquals (2 , \SettingCache::get ('password-policies.numbers ' ));
247+
248+ config ()->set ('cache.default ' , 'array ' );
249+ $ this ->assertEquals (3 , Cache::get ('password-policies.uppercase ' ));
250+
251+ config ()->set ('cache.default ' , 'cache_settings ' );
252+ \SettingCache::clear ();
253+
254+ $ this ->assertNull (\SettingCache::get ('password-policies.users_can_change ' ));
255+ $ this ->assertNull (\SettingCache::get ('password-policies.numbers ' ));
256+
257+ config ()->set ('cache.default ' , 'array ' );
258+ $ this ->assertEquals (3 , Cache::get ('password-policies.uppercase ' ));
259+ }
118260}
0 commit comments