Valider 0b4afbde rédigé par tcharlss's avatar tcharlss Validation de marcimat
Parcourir les fichiers

feat: un test ExporterCsvTest pour la fonction exporter_csv()

Teste la combinaison des options pour le délimiteur, l'extension et les entêtes.
On compare le contenu et l'extension des fichiers produits avec des fichiers de référence.

Restera à compléter les tests pour les options charset, callback, et éventuellement avec des ressources SQL.

On place cela dans un nouveau dossier/groupe `Export` qui pourra accueillir les autres fonctionnalités d'export.

Refs spip/spip#5447
parent d1163c8c
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+129 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php

declare(strict_types=1);

/**
 * Test unitaire de la fonction exporter_csv du fichier ./inc/exporter_csv.php
 *
 * Vérifie le contenu et l'extension des fichiers produits en fonction des options.
 * On ne teste que l'export, pas l'envoi.
 *
 * TODO : tester les options `charset` et `callback`
 * TODO plus compliqué : tester avec une ressource sql (mais vérifier quoi dans ce cas ?)
 */

namespace Spip\Core\Tests\Export;

use PHPUnit\Framework\TestCase;

class ExporterCsvTest extends TestCase
{

	// Nom et contenu des fichiers exportés
	private $csv_titre = 'test_exporter_csv';
	private $csv_entetes = ['PRÉNOM','NOM'];
	private $csv_resource = [['Victor','Hugo'],['Émile','Zola']];
	private $csv_temp;
	// Répertoire contenant les fichiers à comparer
	private $csv_expected_path = 'tests/tests/Export/expected/csv/';

	protected function setUp(): void
	{
		find_in_path('./inc/exporter_csv.php', '', true);
	}

	protected function tearDown(): void
	{
		// Supprimer les fichiers d'export temporaires tmp/cache/export/test_exporter_csv.xxx
		if ($this->csv_temp and file_exists($this->csv_temp)) {
			@unlink($this->csv_temp);
		}
	}

	/**
	 * @dataProvider providerExportExporterCsv
	 *
	 * @param string $expected_file
	 *     Nom du fichier à utiliser pour la comparaison
	 * @param iterable $args
	 *     Paramètres $options et suivants transmis à exporter_csv()
	 */
	public function testExportExporterCsv(string $expected_file, ...$args): void
	{
		$exporter_csv = charger_fonction('exporter_csv', 'inc');
		$expected = $this->csv_expected_path . $expected_file;
		$expected_extension = pathinfo($expected, PATHINFO_EXTENSION) ?: substr(strrchr($expected, '.'), 1);
		$actual = $exporter_csv($this->csv_titre, $this->csv_resource, ...$args);
		$actual_extension = pathinfo($actual, PATHINFO_EXTENSION) ?: substr(strrchr($actual, '.'), 1);
		$this->csv_temp = $actual; // Pour nettoyer après

		// Le fichier existe
		$this->assertFileExists($actual);

		// Le contenu du fichier est identique à celui attendu
		$this->assertFileEquals($expected, $actual);

		// L'extension est identique à celle attendue
		$this->assertEquals($expected_extension, $actual_extension);
	}

	public function providerExportExporterCsv(): array
	{
		return [
			// Défaut = csv avec des virgules
			'défaut csv' => [
				'commas_headless.csv',
				[
					'envoyer' => false,
				]
			],
			// Idem défaut mais avec des entêtes
			'défaut csv avec entêtes' => [
				'commas.csv',
				[
					'envoyer' => false,
					'entetes' => $this->csv_entetes,
				]
			],
			// xls avec des tabulations
			'tabulations xls' => [
				'tabs.xls',
				[
					'delim'   => 'TAB',
					'envoyer' => false,
					'entetes' => $this->csv_entetes,
				]
			],
			// xls avec des points virgules
			'points virgules xls' => [
				'semicolons.xls',
				[
					'delim'   => ';',
					'envoyer' => false,
					'entetes' => $this->csv_entetes,
				]
			],
			// csv avec des points virgules
			'points virgules csv' => [
				'semicolons.csv',
				[
					'delim'     => ';',
					'extension' => 'csv',
					'envoyer'   => false,
					'entetes'   => $this->csv_entetes,
				]
			],
			// csv avec des tabulations
			'tabulations csv' => [
				'tabs.csv',
				[
					'delim'     => 'TAB',
					'extension' => 'csv',
					'envoyer'   => false,
					'entetes'   => $this->csv_entetes,
				]
			],
			// TODO : charset et callback
		];
	}
}
+3 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
"PRÉNOM","NOM"
"Victor","Hugo"
"Émile","Zola"
+2 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
"Victor","Hugo"
"Émile","Zola"
+3 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
"PRÉNOM";"NOM"
"Victor";"Hugo"
"Émile";"Zola"
+3 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
"PRNOM";"NOM"
"Victor";"Hugo"
"mile";"Zola"
Chargement en cours