|
7 | 7 | use Utopia\Cache\Cache; |
8 | 8 | use Utopia\Database\Adapter\Memory as DatabaseMemory; |
9 | 9 | use Utopia\Database\Database; |
| 10 | +use Utopia\Database\Document; |
| 11 | +use Utopia\Database\Helpers\Permission; |
| 12 | +use Utopia\Database\Helpers\Role; |
| 13 | +use Utopia\Database\Query; |
10 | 14 |
|
11 | 15 | class ListCacheTest extends TestCase |
12 | 16 | { |
@@ -182,6 +186,101 @@ function () use (&$callbackCalls): string { |
182 | 186 | $this->assertSame('fresh', $value); |
183 | 187 | $this->assertSame(2, $callbackCalls); |
184 | 188 | } |
| 189 | + |
| 190 | + public function testCachedFindUsesCacheUntilPurged(): void |
| 191 | + { |
| 192 | + $cache = new HashMemoryCache(); |
| 193 | + $database = $this->createDatabase($cache); |
| 194 | + $database->createCollection('wafRules', [ |
| 195 | + new Document([ |
| 196 | + '$id' => 'projectId', |
| 197 | + 'type' => Database::VAR_STRING, |
| 198 | + 'size' => 255, |
| 199 | + 'required' => false, |
| 200 | + 'signed' => true, |
| 201 | + 'array' => false, |
| 202 | + 'filters' => [], |
| 203 | + ]), |
| 204 | + ], permissions: [ |
| 205 | + Permission::read(Role::any()), |
| 206 | + Permission::create(Role::any()), |
| 207 | + ]); |
| 208 | + |
| 209 | + $database->createDocument('wafRules', new Document([ |
| 210 | + '$id' => 'rule-a', |
| 211 | + 'projectId' => 'project-a', |
| 212 | + ])); |
| 213 | + |
| 214 | + $queries = [ |
| 215 | + Query::equal('projectId', ['project-a']), |
| 216 | + Query::limit(25), |
| 217 | + ]; |
| 218 | + |
| 219 | + $first = $database->cachedFind('wafRules', $queries, '_39', ['waf']); |
| 220 | + $this->assertCount(1, $first); |
| 221 | + $this->assertSame('rule-a', $first[0]->getId()); |
| 222 | + |
| 223 | + $database->createDocument('wafRules', new Document([ |
| 224 | + '$id' => 'rule-b', |
| 225 | + 'projectId' => 'project-a', |
| 226 | + ])); |
| 227 | + |
| 228 | + $cached = $database->cachedFind('wafRules', $queries, '_39', ['waf']); |
| 229 | + $this->assertCount(1, $cached); |
| 230 | + $this->assertSame('rule-a', $cached[0]->getId()); |
| 231 | + |
| 232 | + $this->assertTrue($database->purgeCachedFind('wafRules', '_39')); |
| 233 | + |
| 234 | + $fresh = $database->cachedFind('wafRules', $queries, '_39', ['waf']); |
| 235 | + $this->assertCount(2, $fresh); |
| 236 | + $this->assertSame(['rule-a', 'rule-b'], \array_map( |
| 237 | + static fn (Document $document): string => $document->getId(), |
| 238 | + $fresh, |
| 239 | + )); |
| 240 | + } |
| 241 | + |
| 242 | + public function testCachedFindSeparatesEntriesByRoles(): void |
| 243 | + { |
| 244 | + $cache = new HashMemoryCache(); |
| 245 | + $database = $this->createDatabase($cache); |
| 246 | + $database->createCollection('wafRules', [ |
| 247 | + new Document([ |
| 248 | + '$id' => 'projectId', |
| 249 | + 'type' => Database::VAR_STRING, |
| 250 | + 'size' => 255, |
| 251 | + 'required' => false, |
| 252 | + 'signed' => true, |
| 253 | + 'array' => false, |
| 254 | + 'filters' => [], |
| 255 | + ]), |
| 256 | + ], permissions: [ |
| 257 | + Permission::read(Role::any()), |
| 258 | + Permission::create(Role::any()), |
| 259 | + ]); |
| 260 | + |
| 261 | + $database->createDocument('wafRules', new Document([ |
| 262 | + '$id' => 'rule-a', |
| 263 | + 'projectId' => 'project-a', |
| 264 | + ])); |
| 265 | + |
| 266 | + $queries = [ |
| 267 | + Query::equal('projectId', ['project-a']), |
| 268 | + Query::limit(25), |
| 269 | + ]; |
| 270 | + |
| 271 | + $database->cachedFind('wafRules', $queries, '_39', ['waf']); |
| 272 | + |
| 273 | + $database->createDocument('wafRules', new Document([ |
| 274 | + '$id' => 'rule-b', |
| 275 | + 'projectId' => 'project-a', |
| 276 | + ])); |
| 277 | + |
| 278 | + $cached = $database->cachedFind('wafRules', $queries, '_39', ['waf']); |
| 279 | + $this->assertCount(1, $cached); |
| 280 | + |
| 281 | + $roleSeparated = $database->cachedFind('wafRules', $queries, '_39', ['manager']); |
| 282 | + $this->assertCount(2, $roleSeparated); |
| 283 | + } |
185 | 284 | } |
186 | 285 |
|
187 | 286 | class HashMemoryCache implements Adapter |
|
0 commit comments