Browse Source

Add test and type hinting (#5087)

* - Add test and type hinting
- pass PhpStan Level 9

* fix dump

* fix style

* fix visibility

* fix style

* add test

* add test

* add test

* add test

* add test

* Simplify

* cleaning after test

* remove space

* fix style

* use specific log file for test

* Remarque's from Alkarex

* A few more details

---------

Co-authored-by: Luc <sanchezluc+freshrss@gmail.com>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
Luc SANCHEZ 3 years ago
parent
commit
0317683155
5 changed files with 68 additions and 19 deletions
  1. 9 6
      app/Models/Log.php
  2. 12 10
      app/Models/LogDAO.php
  3. 2 2
      lib/Minz/Session.php
  4. 45 0
      tests/app/Models/LogDAOTest.php
  5. 0 1
      tests/phpstan-next.txt

+ 9 - 6
app/Models/Log.php

@@ -1,26 +1,29 @@
 <?php
 
 class FreshRSS_Log extends Minz_Model {
+	/** @var string */
 	private $date;
+	/** @var string */
 	private $level;
+	/** @var string */
 	private $information;
 
-	public function date() {
+	public function date(): string {
 		return $this->date;
 	}
-	public function level() {
+	public function level(): string {
 		return $this->level;
 	}
-	public function info() {
+	public function info(): string {
 		return $this->information;
 	}
-	public function _date($date) {
+	public function _date(string $date): void {
 		$this->date = $date;
 	}
-	public function _level($level) {
+	public function _level(string $level): void {
 		$this->level = $level;
 	}
-	public function _info($information) {
+	public function _info(string $information): void {
 		$this->information = $information;
 	}
 }

+ 12 - 10
app/Models/LogDAO.php

@@ -1,19 +1,21 @@
 <?php
 
-class FreshRSS_LogDAO {
-
-	private static function logPath(): string {
-		return USERS_PATH . '/' . (Minz_User::name() ?? Minz_User::INTERNAL_USER) . '/' . LOG_FILENAME;
+final class FreshRSS_LogDAO {
+	public static function logPath(?string $logFileName = null): string {
+		if ($logFileName === null || $logFileName === '') {
+			$logFileName = LOG_FILENAME;
+		}
+		return USERS_PATH . '/' . (Minz_User::name() ?? Minz_User::INTERNAL_USER) . '/' . $logFileName;
 	}
 
 	/** @return array<FreshRSS_Log> */
-	public static function lines(): array {
-		$logs = array();
-		$handle = @fopen(self::logPath(), 'r');
+	public static function lines(?string $logFileName = null): array {
+		$logs = [];
+		$handle = @fopen(self::logPath($logFileName), 'r');
 		if ($handle) {
 			while (($line = fgets($handle)) !== false) {
 				if (preg_match('/^\[([^\[]+)\] \[([^\[]+)\] --- (.*)$/', $line, $matches)) {
-					$myLog = new FreshRSS_Log ();
+					$myLog = new FreshRSS_Log();
 					$myLog->_date($matches[1]);
 					$myLog->_level($matches[2]);
 					$myLog->_info($matches[3]);
@@ -25,8 +27,8 @@ class FreshRSS_LogDAO {
 		return array_reverse($logs);
 	}
 
-	public static function truncate(): void {
-		file_put_contents(self::logPath(), '');
+	public static function truncate(?string $logFileName = null): void {
+		file_put_contents(self::logPath($logFileName), '');
 		if (FreshRSS_Auth::hasAccess('admin')) {
 			file_put_contents(ADMIN_LOG, '');
 			file_put_contents(API_LOG, '');

+ 2 - 2
lib/Minz/Session.php

@@ -59,8 +59,8 @@ class Minz_Session {
 	 * @param string $p le paramètre à récupérer
 	 * @return mixed|false la valeur de la variable de session, false si n'existe pas
 	 */
-	public static function param($p, $default = false) {
-		return isset($_SESSION[$p]) ? $_SESSION[$p] : $default;
+	public static function param(string $p, $default = false) {
+		return $_SESSION[$p] ?? $default;
 	}
 
 

+ 45 - 0
tests/app/Models/LogDAOTest.php

@@ -0,0 +1,45 @@
+<?php
+declare(strict_types=1);
+
+use PHPUnit\Framework\TestCase;
+
+class LogDAOTest extends TestCase {
+	private const LOG_FILE_TEST = 'logFileTest.txt';
+
+	/** @var FreshRSS_LogDAO */
+	private $logDAO;
+
+	/** @var string */
+	private $logPath;
+
+	protected function setUp(): void {
+		$this->logDAO = new FreshRSS_LogDAO();
+		$this->logPath = FreshRSS_LogDAO::logPath(self::LOG_FILE_TEST);
+
+		file_put_contents(
+			$this->logPath,
+			'[Wed, 08 Feb 2023 15:35:05 +0000] [notice] --- Migration 2019_12_22_FooBar: OK'
+		);
+	}
+
+	public function test_lines_is_array_and_truncate_function_work(): void {
+		$this->assertEquals(USERS_PATH . '/' . Minz_User::INTERNAL_USER . '/' . self::LOG_FILE_TEST, $this->logPath);
+
+		$line = $this->logDAO::lines(self::LOG_FILE_TEST);
+
+		$this->assertIsArray($line);
+		$this->assertCount(1, $line);
+		$this->assertInstanceOf(FreshRSS_Log::class, $line[0]);
+		$this->assertEquals('Wed, 08 Feb 2023 15:35:05 +0000', $line[0]->date());
+		$this->assertEquals('notice', $line[0]->level());
+		$this->assertEquals("Migration 2019_12_22_FooBar: OK", $line[0]->info());
+
+		$this->logDAO::truncate(self::LOG_FILE_TEST);
+
+		$this->assertStringContainsString('', file_get_contents($this->logPath));
+	}
+
+	protected function tearDown(): void {
+		unlink($this->logPath);
+	}
+}

+ 0 - 1
tests/phpstan-next.txt

@@ -31,7 +31,6 @@
 ./app/Models/FeedDAOSQLite.php
 ./app/Models/FilterAction.php
 ./app/Models/FormAuth.php
-./app/Models/Log.php
 ./app/Models/ReadingMode.php
 ./app/Models/Search.php
 ./app/Models/Share.php