Skip to content
Extraits de code Groupes Projets
Bifurcation depuis spip / spip
732 validations de retard le dépôt en amont.
  • marcimat's avatar
    2b2288a1
    tests: Tentative de correction de CacheSessionTest · 2b2288a1
    marcimat a rédigé
    Il faut nettoyer le cache sinon ça ne retourne pas des résultats cohérents
    d’un coup à l’autre sur le `testVerifierCaptureMajInvalideurs` data #1
    (1 ou 2 erreurs retournées = calcule 1 ou 2 caches selon).
    
    On essaie de faire de s’assurer que le cache est vide au départ.
    
    Cependant il y a parfois un autre problème, c’est que dans certains cas (?)
    le dossier_squelettes spécifique n’est pas appliqué. Ce n’est pas systématique,
    et a priori jamais si on lance uniquement ce fichier de test.
    2b2288a1
    Historique
    tests: Tentative de correction de CacheSessionTest
    marcimat a rédigé
    Il faut nettoyer le cache sinon ça ne retourne pas des résultats cohérents
    d’un coup à l’autre sur le `testVerifierCaptureMajInvalideurs` data #1
    (1 ou 2 erreurs retournées = calcule 1 ou 2 caches selon).
    
    On essaie de faire de s’assurer que le cache est vide au départ.
    
    Cependant il y a parfois un autre problème, c’est que dans certains cas (?)
    le dossier_squelettes spécifique n’est pas appliqué. Ce n’est pas systématique,
    et a priori jamais si on lance uniquement ce fichier de test.
CacheSessionTest.php 4,12 Kio
<?php

declare(strict_types=1);

namespace Spip\Test\Squelettes\Balise;

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Depends;
use Spip\Test\SquelettesTestCase;

class CacheSessionTest extends SquelettesTestCase
{
	private static array $errors = [];
	private static string $squelettes;

	public static function setUpBeforeClass(): void {
		self::$squelettes = self::relativePath(__DIR__ . '/data/squelettes');
		$GLOBALS['dossier_squelettes'] = self::$squelettes;
		$GLOBALS['delais'] = 3600; // See boostrap.php qui met delais = 0 (inhibe le cache)
		include_spip('inc/invalideur');
		purger_repertoire(_DIR_CACHE . 'calcul/', ['subdir' => true]);
	}

	public static function tearDownAfterClass(): void {
		$GLOBALS['dossier_squelettes'] = '';
		$GLOBALS['delais'] = 0;
	}

	protected function setUp(): void {
		$this->resetErrors();
	}

	public function testVerifierPathMajInvalideurs(): void {
		$this->assertEquals(self::$squelettes, $GLOBALS['dossier_squelettes'] ?? null);
		$this->assertTrue(file_exists(__DIR__ . '/data/squelettes/inc/maj_invalideurs.php'));
		$this->assertNotFalse(find_in_path('inc/maj_invalideurs.php'));
		$this->assertNotFalse(include_spip('inc/maj_invalideurs'));
		$this->assertEquals('inc_maj_invalideurs', charger_fonction('maj_invalideurs', 'inc', true));
	}

	/** Vérifier qu’on sait attraper les données de cache */
	#[Depends('testVerifierPathMajInvalideurs')]
	#[DataProvider('providerVerifierCaptureMajInvalideurs')]
	public function testVerifierCaptureMajInvalideurs(int $expectedCountErrors, string $squelette, bool $session_attendue): void {
		$this->runWithSquelette($squelette, $session_attendue);
		$this->assertCount($expectedCountErrors, $this->getErrors(), $this->showErrors());
	}

	public static function providerVerifierCaptureMajInvalideurs(): array {
		return [
			[0, 'inclure/A_session_wo', false],
			[2, 'inclure/A_session_wo', true],
			[2, 'inclure/A_session_w', false],
			[0, 'inclure/A_session_w', true],
		];
	}

	#[Depends('testVerifierCaptureMajInvalideurs')]
	#[DataProvider('providerCachesSessionnes')]
	public function testCachesSessionnes(int $expectedCountErrors, string $squelette, bool $session_attendue): void {
		$this->runWithSquelette($squelette, $session_attendue);
		$this->assertCount($expectedCountErrors, $this->getErrors(), $this->showErrors());
	}

	public static function providerCachesSessionnes(): array {
		return [
			[0, 'cache_session_wo_1', false],
			[0, 'cache_session_wo_2', false],
			[0, 'cache_session_wo_3', false],
			[0, 'cache_session_wo_4', false],
			[0, 'cache_session_wo_5', false],
			[0, 'cache_session_wo_6', false],
			[0, 'cache_session_wo_7', false],
			[0, 'cache_session_w_1', true],
			[0, 'cache_session_w_2', true],
			[0, 'cache_session_w_3', true],
		];
	}

	private function runWithSquelette(string $fond, bool $session_attendue) {
		unset($GLOBALS['cache_utilise_session']);
		recuperer_fond($fond, [
			'assert_session' => $session_attendue,
			'caller' => 'none',
			'salt' => $this->saltContext(),
		]);
		unset($GLOBALS['cache_utilise_session']);
		recuperer_fond('root', [
			'sousfond' => $fond,
			'inc_assert_session' => $session_attendue,
			'salt' => $this->saltContext(),
		]);
	}

	private function saltContext(): string {
		return (string) time() . ':' . uniqid();
	}

	private function getErrors(): array {
		return self::$errors;
	}

	private function showErrors(): string {
		return "Errors:\n" . implode("\n", array_map(fn ($e) => "- $e", self::getErrors()));
	}

	private function resetErrors(): void {
		self::$errors = [];
	}

	public static function addError(string $msg, array $page): void {
		self::$errors[] = sprintf(
			'%s pour %s: %s',
			$msg,
			$page['source'],
			self::trace_contexte($page['contexte'])
		);
	}

	private static function trace_contexte(array $contexte): string {
		foreach ($contexte as $k => $v) {
			if (str_starts_with($k, 'date_') || $k === 'salt') {
				unset($contexte[$k]);
			}
		}
		if (isset($contexte['caller']) && str_starts_with($contexte['caller'], 'tests/squelettes/')) {
			$contexte['caller'] = substr($contexte['caller'], 17);
		}

		return json_encode($contexte, JSON_THROW_ON_ERROR);
	}
}