/
githubmirror
/
framework
Обзор
Документация
Войти
/
githubmirror
/
framework
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
13.x
tests/Cache/CacheArrayStoreTest.php
417 строк
12 KB
Amirhf
Fix Cache::touch() expiration handling (#60878)
24 июл 2026, 17:56
Не верифицирован
24 июл 2026, 17:56
77a15f4
Код
Авторство
О чём код?
<?php namespace Illuminate\Tests\Cache; use Illuminate\Cache\ArrayStore; use Illuminate\Support\Carbon; use PHPUnit\Framework\TestCase; use stdClass; class CacheArrayStoreTest extends TestCase { public function testItemsCanBeSetAndRetrieved() { $store = new ArrayStore; $result = $store->put('foo', 'bar', 10); $this->assertTrue($result); $this->assertSame('bar', $store->get('foo')); } public function testCacheTtl(): void { $store = new ArrayStore(); Carbon::setTestNow('2000-01-01 00:00:00.500'); // 500 milliseconds past $store->put('hello', 'world', 1); Carbon::setTestNow('2000-01-01 00:00:01.499'); // progress 0.999 seconds $this->assertSame('world', $store->get('hello')); Carbon::setTestNow('2000-01-01 00:00:01.500'); // progress 0.001 seconds. 1 second since putting into cache. $this->assertNull($store->get('hello')); } public function testMultipleItemsCanBeSetAndRetrieved() { $store = new ArrayStore; $result = $store->put('foo', 'bar', 10); $resultMany = $store->putMany([ 'fizz' => 'buz', 'quz' => 'baz', ], 10); $this->assertTrue($result); $this->assertTrue($resultMany); $this->assertEquals([ 'foo' => 'bar', 'fizz' => 'buz', 'quz' => 'baz', 'norf' => null, ], $store->many(['foo', 'fizz', 'quz', 'norf'])); } public function testItemsCanExpire() { Carbon::setTestNow($now = Carbon::now()); $store = new ArrayStore; $store->put('foo', 'bar', 10); Carbon::setTestNow($now->addSeconds(10)->addSecond()); $result = $store->get('foo'); $this->assertNull($result); } public function testTouchExtendsTtl(): void { $key = 'key'; $value = 'value'; $store = new ArrayStore; Carbon::setTestNow($now = Carbon::now()); $store->put($key, $value, 30); $store->touch($key, 60); Carbon::setTestNow($now->addSeconds(45)); $this->assertSame($value, $store->get($key)); } public function testTouchDoesNotRestoreExpiredItem(): void { Carbon::setTestNow($now = Carbon::now()); $store = new ArrayStore; $store->put('key', 'value', 30); Carbon::setTestNow($now->addSeconds(30)); $this->assertFalse($store->touch('key', 60)); $this->assertNull($store->get('key')); } public function testStoreItemForeverProperlyStoresInArray() { $mock = $this->getMockBuilder(ArrayStore::class)->onlyMethods(['put'])->getMock(); $mock->expects($this->once()) ->method('put')->with('foo', 'bar', 0) ->willReturn(true); $result = $mock->forever('foo', 'bar'); $this->assertTrue($result); } public function testValuesCanBeIncremented() { $store = new ArrayStore; $store->put('foo', 1, 10); $result = $store->increment('foo'); $this->assertEquals(2, $result); $this->assertEquals(2, $store->get('foo')); $result = $store->increment('foo', 2); $this->assertEquals(4, $result); $this->assertEquals(4, $store->get('foo')); } public function testValuesGetCastedByIncrementOrDecrement() { $store = new ArrayStore; $store->put('foo', '1', 10); $result = $store->increment('foo'); $this->assertEquals(2, $result); $this->assertEquals(2, $store->get('foo')); $store->put('bar', '1', 10); $result = $store->decrement('bar'); $this->assertEquals(0, $result); $this->assertEquals(0, $store->get('bar')); } public function testIncrementNonNumericValues() { $store = new ArrayStore; $store->put('foo', 'I am string', 10); $result = $store->increment('foo'); $this->assertEquals(1, $result); $this->assertEquals(1, $store->get('foo')); } public function testNonExistingKeysCanBeIncremented() { Carbon::setTestNow($now = Carbon::now()); $store = new ArrayStore; $result = $store->increment('foo'); $this->assertEquals(1, $result); $this->assertEquals(1, $store->get('foo')); // Will be there forever Carbon::setTestNow($now->addYears(10)); $this->assertEquals(1, $store->get('foo')); } public function testExpiredKeysAreIncrementedLikeNonExistingKeys() { Carbon::setTestNow($now = Carbon::now()); $store = new ArrayStore; $store->put('foo', 999, 10); Carbon::setTestNow($now->addSeconds(10)->addSecond()); $result = $store->increment('foo'); $this->assertEquals(1, $result); } public function testValuesCanBeDecremented() { $store = new ArrayStore; $store->put('foo', 1, 10); $result = $store->decrement('foo'); $this->assertEquals(0, $result); $this->assertEquals(0, $store->get('foo')); $result = $store->decrement('foo', 2); $this->assertEquals(-2, $result); $this->assertEquals(-2, $store->get('foo')); } public function testItemsCanBeRemoved() { $store = new ArrayStore; $store->put('foo', 'bar', 10); $this->assertTrue($store->forget('foo')); $this->assertNull($store->get('foo')); $this->assertFalse($store->forget('foo')); } public function testItemsCanBeFlushed() { $store = new ArrayStore; $store->put('foo', 'bar', 10); $store->put('baz', 'boom', 10); $result = $store->flush(); $this->assertTrue($result); $this->assertNull($store->get('foo')); $this->assertNull($store->get('baz')); } public function testLocksCanBeFlushed() { $store = new ArrayStore; $store->lock('foo', 10); $store->lock('bar', 10); $result = $store->flushLocks(); $this->assertTrue($result); $this->assertNull($store->get('foo')); $this->assertNull($store->get('bar')); $this->assertEmpty($store->locks); } public function testCacheKey() { $store = new ArrayStore; $this->assertEmpty($store->getPrefix()); } public function testCannotAcquireLockTwice() { $store = new ArrayStore; $lock = $store->lock('foo', 10); $this->assertTrue($lock->acquire()); $this->assertFalse($lock->acquire()); } public function testCanAcquireLockAgainAfterExpiry() { Carbon::setTestNow($now = Carbon::now()); $store = new ArrayStore; $lock = $store->lock('foo', 10); $lock->acquire(); Carbon::setTestNow($now->addSeconds(10)); $this->assertTrue($lock->acquire()); } public function testLockExpirationLowerBoundary() { Carbon::setTestNow($now = Carbon::now()); $store = new ArrayStore; $lock = $store->lock('foo', 10); $lock->acquire(); Carbon::setTestNow($now->addSeconds(10)->subMicrosecond()); $this->assertFalse($lock->acquire()); } public function testLockWithNoExpirationNeverExpires() { $store = new ArrayStore; $lock = $store->lock('foo'); $lock->acquire(); Carbon::setTestNow(Carbon::now()->addCentury()); $this->assertFalse($lock->acquire()); } public function testCanAcquireLockAfterRelease() { $store = new ArrayStore; $lock = $store->lock('foo', 10); $lock->acquire(); $this->assertTrue($lock->release()); $this->assertTrue($lock->acquire()); } public function testAnotherOwnerCannotReleaseLock() { $store = new ArrayStore; $owner = $store->lock('foo', 10); $wannabeOwner = $store->lock('foo', 10); $owner->acquire(); $this->assertFalse($wannabeOwner->release()); } public function testAnotherOwnerCanForceReleaseALock() { $store = new ArrayStore; $owner = $store->lock('foo', 10); $wannabeOwner = $store->lock('foo', 10); $owner->acquire(); $wannabeOwner->forceRelease(); $this->assertTrue($wannabeOwner->acquire()); } public function testValuesAreNotStoredByReference() { $store = new ArrayStore($serialize = true); $object = new stdClass; $object->foo = true; $store->put('object', $object, 10); $object->bar = true; $retrievedObject = $store->get('object'); $this->assertTrue($retrievedObject->foo); $this->assertFalse(property_exists($retrievedObject, 'bar')); } public function testValuesAreStoredByReferenceIfSerializationIsDisabled() { $store = new ArrayStore; $object = new stdClass; $object->foo = true; $store->put('object', $object, 10); $object->bar = true; $retrievedObject = $store->get('object'); $this->assertTrue($retrievedObject->foo); $this->assertTrue($retrievedObject->bar); } public function testReleasingLockAfterAlreadyForceReleasedByAnotherOwnerFails() { $store = new ArrayStore; $owner = $store->lock('foo', 10); $wannabeOwner = $store->lock('foo', 10); $owner->acquire(); $wannabeOwner->forceRelease(); $this->assertFalse($wannabeOwner->release()); } public function testOwnerStatusCanBeCheckedAfterRestoringLock() { $store = new ArrayStore; $firstLock = $store->lock('foo', 10); $this->assertTrue($firstLock->get()); $owner = $firstLock->owner(); $secondLock = $store->restoreLock('foo', $owner); $this->assertTrue($secondLock->isOwnedByCurrentProcess()); } public function testOtherOwnerDoesNotOwnLockAfterRestore() { $store = new ArrayStore; $firstLock = $store->lock('foo', 10); $this->assertTrue($firstLock->get()); $secondLock = $store->restoreLock('foo', 'other_owner'); $this->assertFalse($secondLock->isOwnedByCurrentProcess()); } public function testExpiredLockCannotBeRefreshedByPreviousOwner() { Carbon::setTestNow($now = Carbon::now()); $store = new ArrayStore; $lock = $store->lock('foo', 10); $this->assertTrue($lock->get()); Carbon::setTestNow($now->addSeconds(10)->addSecond()); $this->assertFalse($lock->refresh(20)); } public function testRestoringNonExistingLockDoesNotOwnAnything() { $store = new ArrayStore; $firstLock = $store->restoreLock('foo', 'owner'); $this->assertFalse($firstLock->isOwnedByCurrentProcess()); } public function testCanGetAll() { Carbon::setTestNow($now = Carbon::now()); $store = new ArrayStore(false); $store->put('foo', 'bar', 10); $this->assertEquals([ 'foo' => ['value' => 'bar', 'expiresAt' => $now->addSeconds(10)->getPreciseTimestamp(3) / 1000], ], $store->all()); } public function testCanGetAllWhenSerialized() { Carbon::setTestNow($now = Carbon::now()); $store = new ArrayStore(true); $store->put('foo', 'bar', 10); $this->assertEquals([ 'foo' => ['value' => 'bar', 'expiresAt' => $expiresAt = ($now->copy()->addSeconds(10)->getPreciseTimestamp(3) / 1000)], ], $store->all()); // Now let's put a serializable value in there $store->forget('foo'); $store->put('foo', $now, 10); $this->assertEquals([ 'foo' => [ 'value' => $now, 'expiresAt' => $expiresAt, ], ], $store->all()); $this->assertEquals( serialize($now), $store->all(false)['foo']['value'] ); } }