<?php

declare(strict_types=1);

namespace Drupal\Tests\update\Kernel;

use Drupal\KernelTests\KernelTestBase;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\Attributes\IgnoreDeprecations;
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;

/**
 * Tests the update_delete_file_if_stale() function.
 */
#[Group('update')]
#[IgnoreDeprecations]
#[RunTestsInSeparateProcesses]
class UpdateDeleteFileIfStaleTest extends KernelTestBase {

  /**
   * Disable strict config schema checking.
   *
   * This test requires saving invalid configuration. This allows for the
   * simulation of a temporary file becoming stale.
   *
   * @var bool
   */
  protected $strictConfigSchema = FALSE;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'update',
  ];

  /**
   * Tests the deletion of stale files.
   */
  public function testUpdateDeleteFileIfStale(): void {
    $file_system = $this->container->get('file_system');

    $file_name = $file_system->saveData($this->randomMachineName(), 'public://');
    $this->assertNotNull($file_name);
    $file_path = $file_system->realpath($file_name);

    // During testing, the file change and the stale checking occurs in the same
    // request, so the beginning of request will be before the file changes and
    // \Drupal::time()->getRequestTime() - $filectime is negative or zero.
    // Set the maximum age to a number even smaller than that.
    $this->config('system.file')
      ->set('temporary_maximum_age', 100000)
      ->save();

    // First test that the file is not stale and thus not deleted.
    $deleted = update_delete_file_if_stale($file_path);
    $this->assertFalse($deleted);
    $this->assertFileExists($file_path);

    // Set the maximum age to a number smaller than
    // \Drupal::time()->getRequestTime() - $filectime.
    $this->config('system.file')
      ->set('temporary_maximum_age', -100000)
      ->save();

    // Now attempt to delete the file; as it should be considered stale, this
    // attempt should succeed.
    $deleted = update_delete_file_if_stale($file_path);
    $this->assertTrue($deleted);
    $this->assertFileDoesNotExist($file_path);
  }

}
