From 8f9cf8f2f9bb9576db2635d9bf525ac925c133af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Bourgier?= Date: Sat, 2 Apr 2022 18:52:22 +0200 Subject: [PATCH] [InMemory] Make timestamp configurable Use an optional 'timestamp' option in the config to set the 'lastModified' attribute when writing or copying a file. This allows using the memory adapter in testing environments for testing time-based behaviors. --- src/InMemory/InMemoryFile.php | 12 ++++++++++-- src/InMemory/InMemoryFilesystemAdapter.php | 6 ++++-- src/InMemory/InMemoryFilesystemAdapterTest.php | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/InMemory/InMemoryFile.php b/src/InMemory/InMemoryFile.php index 871b67060..9e7e46b44 100644 --- a/src/InMemory/InMemoryFile.php +++ b/src/InMemory/InMemoryFile.php @@ -27,10 +27,10 @@ class InMemoryFile */ private $visibility; - public function updateContents(string $contents): void + public function updateContents(string $contents, ?int $timestamp): void { $this->contents = $contents; - $this->lastModified = time(); + $this->lastModified = $timestamp ?: time(); } public function lastModified(): int @@ -38,6 +38,14 @@ public function lastModified(): int return $this->lastModified; } + public function withLastModified(int $lastModified): self + { + $clone = clone $this; + $clone->lastModified = $lastModified; + + return $clone; + } + public function read(): string { return $this->contents; diff --git a/src/InMemory/InMemoryFilesystemAdapter.php b/src/InMemory/InMemoryFilesystemAdapter.php index 773067070..b744c0f48 100644 --- a/src/InMemory/InMemoryFilesystemAdapter.php +++ b/src/InMemory/InMemoryFilesystemAdapter.php @@ -55,7 +55,7 @@ public function write(string $path, string $contents, Config $config): void { $path = $this->preparePath($path); $file = $this->files[$path] = $this->files[$path] ?? new InMemoryFile(); - $file->updateContents($contents); + $file->updateContents($contents, $config->get('timestamp')); $visibility = $config->get(Config::OPTION_VISIBILITY, $this->defaultVisibility); $file->setVisibility($visibility); @@ -249,7 +249,9 @@ public function copy(string $source, string $destination, Config $config): void throw UnableToCopyFile::fromLocationTo($source, $destination); } - $this->files[$destination] = clone $this->files[$source]; + $lastModified = $config->get('timestamp', time()); + + $this->files[$destination] = $this->files[$source]->withLastModified($lastModified); } private function preparePath(string $path): string diff --git a/src/InMemory/InMemoryFilesystemAdapterTest.php b/src/InMemory/InMemoryFilesystemAdapterTest.php index b6ec330e2..618979921 100644 --- a/src/InMemory/InMemoryFilesystemAdapterTest.php +++ b/src/InMemory/InMemoryFilesystemAdapterTest.php @@ -273,6 +273,22 @@ public function fetching_unknown_mime_type_of_a_file(): void parent::fetching_unknown_mime_type_of_a_file(); } + /** + * @test + */ + public function using_custom_timestamp(): void + { + $adapter = $this->adapter(); + + $now = 100; + $adapter->write('file.txt', 'contents', new Config(['timestamp' => $now])); + $this->assertEquals($now, $adapter->lastModified('file.txt')->lastModified()); + + $earlier = 50; + $adapter->copy('file.txt', 'new_file.txt', new Config(['timestamp' => $earlier])); + $this->assertEquals($earlier, $adapter->lastModified('new_file.txt')->lastModified()); + } + protected static function createFilesystemAdapter(): FilesystemAdapter { return new InMemoryFilesystemAdapter();