77 lines
3.0 KiB
PHP
77 lines
3.0 KiB
PHP
<?php
|
|||
|
|
/**
|
||
|
|
* Tests unitaires pour la classe SimpleAPICache (includes/simple-cache.php).
|
||
|
|
*
|
||
|
|
* Le répertoire de cache est redirigé vers un dossier temporaire via
|
||
|
|
* réflexion afin de ne jamais toucher au cache réel (cache/api).
|
||
|
|
*/
|
||
|
|
|
||
|
|
$cache = new SimpleAPICache();
|
||
|
|
$cacheDirProperty = new ReflectionProperty(SimpleAPICache::class, 'cacheDir');
|
||
|
|
$cacheDirProperty->setAccessible(true);
|
||
|
|
|
||
|
|
$tmpDir = sys_get_temp_dir() . '/annu-kute-cache-test-' . getmypid();
|
||
|
|
if (!is_dir($tmpDir)) {
|
||
|
|
mkdir($tmpDir, 0755, true);
|
||
|
|
}
|
||
|
|
$cacheDirProperty->setValue($cache, $tmpDir);
|
||
|
|
|
||
|
|
// --- get sur un cache vide --------------------------------------------------
|
||
|
|
|
||
|
|
assertNull($cache->get('videos'), 'get retourne null quand aucune entrée n\'existe');
|
||
|
|
|
||
|
|
// --- set puis get -----------------------------------------------------------
|
||
|
|
|
||
|
|
$content = ['data' => ['video1', 'video2']];
|
||
|
|
$cache->set('videos', ['count' => 6], $content);
|
||
|
|
assertEquals($content, $cache->get('videos', ['count' => 6]), 'get retourne le contenu après set');
|
||
|
|
|
||
|
|
// Le fichier stocké contient bien content / expires / created
|
||
|
|
$files = glob($tmpDir . '/cache_*.json');
|
||
|
|
assertEquals(1, count($files), 'set crée exactement un fichier de cache');
|
||
|
|
$stored = json_decode(file_get_contents($files[0]), true);
|
||
|
|
assertEquals($content, $stored['content'], 'le fichier stocke le contenu sous la clé "content"');
|
||
|
|
assertTrue(isset($stored['expires']) && $stored['expires'] > time(), 'le fichier stocke une expiration future');
|
||
|
|
assertTrue(isset($stored['created']), 'le fichier stocke la date de création');
|
||
|
|
|
||
|
|
// --- Ordre des paramètres ---------------------------------------------------
|
||
|
|
|
||
|
|
// ksort() dans getCacheKey : l'ordre des paramètres ne change pas la clé
|
||
|
|
$cache->set('videos', ['b' => 2, 'a' => 1], 'ordonné');
|
||
|
|
assertEquals(
|
||
|
|
'ordonné',
|
||
|
|
$cache->get('videos', ['a' => 1, 'b' => 2]),
|
||
|
|
'get retrouve l\'entrée malgré un ordre de paramètres différent'
|
||
|
|
);
|
||
|
|
assertNull(
|
||
|
|
$cache->get('videos', ['a' => 9]),
|
||
|
|
'get retourne null pour des paramètres différents'
|
||
|
|
);
|
||
|
|
|
||
|
|
// --- Expiration -------------------------------------------------------------
|
||
|
|
|
||
|
|
$cache->set('videos', ['old' => 1], 'périmé', -1); // TTL négatif : déjà expiré
|
||
|
|
$filesBefore = count(glob($tmpDir . '/cache_*.json'));
|
||
|
|
assertNull($cache->get('videos', ['old' => 1]), 'get retourne null pour une entrée expirée');
|
||
|
|
assertEquals(
|
||
|
|
$filesBefore - 1,
|
||
|
|
count(glob($tmpDir . '/cache_*.json')),
|
||
|
|
'get supprime le fichier expiré'
|
||
|
|
);
|
||
|
|
|
||
|
|
// --- cleanup ----------------------------------------------------------------
|
||
|
|
|
||
|
|
$cache->set('cle-valide', [], 'valide', 300);
|
||
|
|
$cache->set('cle-perimee', [], 'périmée', -10);
|
||
|
|
$cleaned = $cache->cleanup();
|
||
|
|
assertEquals(1, $cleaned, 'cleanup supprime uniquement les entrées expirées');
|
||
|
|
assertEquals('valide', $cache->get('cle-valide'), 'cleanup conserve les entrées valides');
|
||
|
|
assertNull($cache->get('cle-perimee'), 'cleanup a bien supprimé l\'entrée expirée');
|
||
|
|
|
||
|
|
// --- Nettoyage du dossier temporaire ----------------------------------------
|
||
|
|
|
||
|
|
foreach (glob($tmpDir . '/cache_*.json') as $file) {
|
||
|
|
unlink($file);
|
||
|
|
}
|
||
|
|
rmdir($tmpDir);
|