Fix MonitorCacheKeysTest
This commit is contained in:
@@ -6,342 +6,200 @@ namespace App\Tests\Unit\Core;
|
||||
use App\MonitorCacheKeys;
|
||||
use OutOfBoundsException;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Psr\Cache\CacheItemInterface;
|
||||
use Psr\Cache\CacheItemPoolInterface;
|
||||
use Symfony\Component\Cache\Adapter\ArrayAdapter;
|
||||
|
||||
final class MonitorCacheKeysTest extends TestCase {
|
||||
private function createMockPool(): CacheItemPoolInterface {
|
||||
return $this->createMock(CacheItemPoolInterface::class);
|
||||
}
|
||||
|
||||
private function createMockItem(string $key, mixed $value = null, bool $isHit = true): CacheItemInterface {
|
||||
$item = $this->createMock(CacheItemInterface::class);
|
||||
$item->method('getKey')->willReturn($key);
|
||||
$item->method('get')->willReturn($value);
|
||||
$item->method('isHit')->willReturn($isHit);
|
||||
return $item;
|
||||
}
|
||||
|
||||
public function testConstructorInitializesWhenKeyListMissing(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', null, false);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
|
||||
$pool->expects(self::exactly(2))
|
||||
->method('saveDeferred')
|
||||
->willReturnCallback(function ($item) {
|
||||
self::assertContains($item->getKey(), ['__key_list', '__chg_list']);
|
||||
return true;
|
||||
});
|
||||
$pool->expects(self::once())->method('commit')->willReturn(true);
|
||||
|
||||
new MonitorCacheKeys($pool);
|
||||
self::assertSame([], $monitor->getKeys());
|
||||
self::assertSame([], $monitor->getChanges());
|
||||
}
|
||||
|
||||
public function testConstructorDoesNotInitializeWhenItemsExist(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
$monitor->saveDeferred($pool->getItem('testkey'));
|
||||
$monitor->commit();
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
|
||||
$pool->expects(self::never())->method('saveDeferred');
|
||||
$pool->expects(self::never())->method('commit');
|
||||
|
||||
new MonitorCacheKeys($pool);
|
||||
// Create a new MonitorCacheKeys with the same pool - should not reinitialize
|
||||
$monitor2 = new MonitorCacheKeys($pool);
|
||||
self::assertSame(['testkey'], $monitor2->getKeys());
|
||||
}
|
||||
|
||||
public function testGetKeys(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', ['key1' => true, 'key2' => true], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
$pool->method('getItem')
|
||||
->with('__key_list')
|
||||
->willReturn($keyListItem);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
$item = $pool->getItem('key1');
|
||||
$item->set('value1');
|
||||
$monitor->save($item);
|
||||
|
||||
$item2 = $pool->getItem('key2');
|
||||
$item2->set('value2');
|
||||
$monitor->save($item2);
|
||||
|
||||
self::assertSame(['key1', 'key2'], $monitor->getKeys());
|
||||
}
|
||||
|
||||
public function testGetChanges(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', ['key1' => MonitorCacheKeys::UPDATED], true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
$pool->method('getItem')
|
||||
->with('__chg_list')
|
||||
->willReturn($changeListItem);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
$item = $pool->getItem('key1');
|
||||
$item->set('value1');
|
||||
$monitor->save($item);
|
||||
|
||||
self::assertSame(['key1' => MonitorCacheKeys::UPDATED], $monitor->getChanges());
|
||||
}
|
||||
|
||||
public function testMarkClean(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', ['key1' => MonitorCacheKeys::UPDATED], true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
$pool->method('getItem')
|
||||
->with('__chg_list')
|
||||
->willReturn($changeListItem);
|
||||
$pool->expects(self::once())
|
||||
->method('save')
|
||||
->with(self::callback(function ($item) {
|
||||
return $item->getKey() === '__chg_list' && $item->get() === [];
|
||||
}))
|
||||
->willReturn(true);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
$item = $pool->getItem('key1');
|
||||
$item->set('value1');
|
||||
$monitor->save($item);
|
||||
|
||||
self::assertSame(['key1' => MonitorCacheKeys::UPDATED], $monitor->getChanges());
|
||||
$monitor->markClean();
|
||||
self::assertSame([], $monitor->getChanges());
|
||||
}
|
||||
|
||||
public function testGetItemDelegates(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
$requestedItem = $this->createMockItem('mykey', 'value', true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
$pool->method('getItem')
|
||||
->with('mykey')
|
||||
->willReturn($requestedItem);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
self::assertSame($requestedItem, $monitor->getItem('mykey'));
|
||||
|
||||
$item = $monitor->getItem('mykey');
|
||||
self::assertSame('mykey', $item->getKey());
|
||||
}
|
||||
|
||||
public function testGetItemsDelegates(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->willReturnCallback(function ($keys) {
|
||||
return array_map(fn($k) => $this->createMockItem($k, null, true), $keys);
|
||||
});
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
$items = iterator_to_array($monitor->getItems(['a', 'b']));
|
||||
self::assertCount(2, $items);
|
||||
self::assertArrayHasKey('a', $items);
|
||||
self::assertArrayHasKey('b', $items);
|
||||
}
|
||||
|
||||
public function testHasItemDelegates(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
$pool->method('hasItem')
|
||||
->with('mykey')
|
||||
->willReturn(true);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
self::assertFalse($monitor->hasItem('mykey'));
|
||||
|
||||
$item = $pool->getItem('mykey');
|
||||
$item->set('value');
|
||||
$monitor->save($item);
|
||||
|
||||
self::assertTrue($monitor->hasItem('mykey'));
|
||||
}
|
||||
|
||||
public function testClearWhenNotEmpty(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', ['key1' => true], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
$pool->method('getItem')
|
||||
->with('__key_list')
|
||||
->willReturn($keyListItem);
|
||||
$pool->expects(self::once())->method('clear')->willReturn(true);
|
||||
$pool->expects(self::exactly(2))->method('saveDeferred')->willReturn(true);
|
||||
$pool->expects(self::once())->method('commit')->willReturn(true);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
$item = $pool->getItem('key1');
|
||||
$item->set('value1');
|
||||
$monitor->save($item);
|
||||
|
||||
self::assertTrue($monitor->clear());
|
||||
self::assertSame([], $monitor->getKeys());
|
||||
}
|
||||
|
||||
public function testClearWhenEmpty(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
$pool->method('getItem')
|
||||
->with('__key_list')
|
||||
->willReturn($keyListItem);
|
||||
$pool->expects(self::never())->method('clear');
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
self::assertTrue($monitor->clear());
|
||||
}
|
||||
|
||||
public function testDeleteItemUpdatesKeyList(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', ['mykey' => true], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
$pool->method('getItem')
|
||||
->willReturnCallback(function ($key) use ($keyListItem, $changeListItem) {
|
||||
return match ($key) {
|
||||
'__key_list' => $keyListItem,
|
||||
'__chg_list' => $changeListItem,
|
||||
default => $this->createMockItem($key, null, false),
|
||||
};
|
||||
});
|
||||
$pool->expects(self::once())->method('deleteItem')->with('mykey')->willReturn(true);
|
||||
$pool->expects(self::exactly(2))->method('saveDeferred')->willReturn(true);
|
||||
$pool->expects(self::once())->method('commit')->willReturn(true);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
$item = $pool->getItem('mykey');
|
||||
$item->set('value');
|
||||
$monitor->save($item);
|
||||
|
||||
self::assertTrue($monitor->deleteItem('mykey'));
|
||||
self::assertSame(['mykey' => MonitorCacheKeys::REMOVED], $monitor->getChanges());
|
||||
self::assertFalse($monitor->hasItem('mykey'));
|
||||
}
|
||||
|
||||
public function testDeleteItemThrowsOnPrivateKey(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
$this->expectException(OutOfBoundsException::class);
|
||||
$monitor->deleteItem('__key_list');
|
||||
}
|
||||
|
||||
public function testDeleteItemsUpdatesKeyList(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', ['a' => true, 'b' => true], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
$pool->method('getItem')
|
||||
->with('__key_list')
|
||||
->willReturn($keyListItem);
|
||||
$pool->expects(self::once())->method('deleteItems')->with(['a', 'b'])->willReturn(true);
|
||||
$pool->expects(self::once())->method('saveDeferred')->willReturn(true);
|
||||
$pool->expects(self::once())->method('commit')->willReturn(true);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
$item1 = $pool->getItem('a');
|
||||
$item1->set('value1');
|
||||
$monitor->save($item1);
|
||||
|
||||
$item2 = $pool->getItem('b');
|
||||
$item2->set('value2');
|
||||
$monitor->save($item2);
|
||||
|
||||
self::assertTrue($monitor->deleteItems(['a', 'b']));
|
||||
self::assertSame(['a' => MonitorCacheKeys::REMOVED, 'b' => MonitorCacheKeys::REMOVED], $monitor->getChanges());
|
||||
}
|
||||
|
||||
public function testDeleteItemsThrowsOnPrivateKey(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
$this->expectException(OutOfBoundsException::class);
|
||||
$monitor->deleteItems(['a', '__chg_list']);
|
||||
}
|
||||
|
||||
public function testSaveUpdatesKeyList(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
$newItem = $this->createMockItem('newkey', 'value', true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
$pool->method('getItem')
|
||||
->willReturnCallback(function ($key) use ($keyListItem, $changeListItem) {
|
||||
return match ($key) {
|
||||
'__key_list' => $keyListItem,
|
||||
'__chg_list' => $changeListItem,
|
||||
default => $this->createMockItem($key, null, false),
|
||||
};
|
||||
});
|
||||
$pool->expects(self::once())->method('save')->with($newItem)->willReturn(true);
|
||||
$pool->expects(self::exactly(2))->method('saveDeferred')->willReturn(true);
|
||||
$pool->expects(self::once())->method('commit')->willReturn(true);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
self::assertTrue($monitor->save($newItem));
|
||||
|
||||
$item = $pool->getItem('newkey');
|
||||
$item->set('value');
|
||||
|
||||
self::assertTrue($monitor->save($item));
|
||||
self::assertSame(['newkey' => MonitorCacheKeys::UPDATED], $monitor->getChanges());
|
||||
self::assertTrue($monitor->hasItem('newkey'));
|
||||
}
|
||||
|
||||
public function testSaveThrowsOnPrivateKey(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
$badItem = $this->createMockItem('__key_list', 'value', true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
$item = $pool->getItem('__key_list');
|
||||
$item->set('value');
|
||||
|
||||
$this->expectException(OutOfBoundsException::class);
|
||||
$monitor->save($badItem);
|
||||
$monitor->save($item);
|
||||
}
|
||||
|
||||
public function testSaveDeferredUpdatesKeyList(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
$newItem = $this->createMockItem('newkey', 'value', true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
$pool->method('getItem')
|
||||
->willReturnCallback(function ($key) use ($keyListItem, $changeListItem) {
|
||||
return match ($key) {
|
||||
'__key_list' => $keyListItem,
|
||||
'__chg_list' => $changeListItem,
|
||||
default => $this->createMockItem($key, null, false),
|
||||
};
|
||||
});
|
||||
$pool->expects(self::once())->method('saveDeferred')->with($newItem)->willReturn(true);
|
||||
$pool->expects(self::exactly(2))->method('saveDeferred')->willReturn(true);
|
||||
$pool->expects(self::once())->method('commit')->willReturn(true);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
self::assertTrue($monitor->saveDeferred($newItem));
|
||||
|
||||
$item = $pool->getItem('newkey');
|
||||
$item->set('value');
|
||||
|
||||
self::assertTrue($monitor->saveDeferred($item));
|
||||
self::assertSame(['newkey' => MonitorCacheKeys::UPDATED], $monitor->getChanges());
|
||||
}
|
||||
|
||||
public function testCommitDelegates(): void {
|
||||
$pool = $this->createMockPool();
|
||||
$keyListItem = $this->createMockItem('__key_list', [], true);
|
||||
$changeListItem = $this->createMockItem('__chg_list', [], true);
|
||||
|
||||
$pool->method('getItems')
|
||||
->with(['__key_list', '__chg_list'])
|
||||
->willReturn([$keyListItem, $changeListItem]);
|
||||
$pool->expects(self::once())->method('commit')->willReturn(true);
|
||||
|
||||
$pool = new ArrayAdapter();
|
||||
$monitor = new MonitorCacheKeys($pool);
|
||||
|
||||
self::assertTrue($monitor->commit());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user