= 7.0.0 */ class FUNCTIONS_Test extends PredisCommandTestCase { /** * @var string */ private $libName = 'mylib'; /** * {@inheritdoc} */ protected function getExpectedCommand(): string { return FUNCTIONS::class; } /** * {@inheritdoc} */ protected function getExpectedId(): string { return 'FUNCTION'; } /** * @group disconnected */ public function testLoadFilterArguments(): void { $arguments = ['LOAD', 'function-code', true]; $expected = ['LOAD', 'function-code', 'REPLACE']; $command = $this->getCommand(); $command->setArguments($arguments); $this->assertSameValues($expected, $command->getArguments()); } /** * @group disconnected */ public function testDeleteFilterArguments(): void { $arguments = ['DELETE', 'libraryName']; $expected = ['DELETE', 'libraryName']; $command = $this->getCommand(); $command->setArguments($arguments); $this->assertSameValues($expected, $command->getArguments()); } /** * @group disconnected */ public function testDumpFilterArguments(): void { $arguments = ['DUMP']; $expected = ['DUMP']; $command = $this->getCommand(); $command->setArguments($arguments); $this->assertSameValues($expected, $command->getArguments()); } /** * @dataProvider flushArgumentsProvider * @group disconnected */ public function testFlushFilterArguments(array $actualArguments, array $expectedResponse): void { $command = $this->getCommand(); $command->setArguments($actualArguments); $this->assertSameValues($expectedResponse, $command->getArguments()); } /** * @dataProvider restoreArgumentsProvider * @group disconnected */ public function testRestoreFilterArguments(array $actualArguments, array $expectedResponse): void { $command = $this->getCommand(); $command->setArguments($actualArguments); $this->assertSameValues($expectedResponse, $command->getArguments()); } /** * @group disconnected */ public function testParseResponse(): void { $this->assertSame(1, $this->getCommand()->parseResponse(1)); } /** * @group connected * @return void * @requiresRedisVersion >= 7.0.0 */ public function testLoadFunctionAddFunctionIntoGivenLibrary(): void { $redis = $this->getClient(); $redis->function->flush(); $actualResponse = $redis->function->load( "#!lua name={$this->libName} \n redis.register_function('myfunc', function(keys, args) return args[1] end)" ); $this->assertSame('mylib', $actualResponse); $this->assertSame('arg1', $redis->fcall('myfunc', [], 'arg1')); $this->assertEquals('OK', $redis->function->delete($this->libName)); } /** * @group connected * @return void * @requiresRedisVersion >= 7.0.0 */ public function testLoadFunctionOverridesExistingFunctionWithReplaceArgumentGiven(): void { $redis = $this->getClient(); $redis->function->flush(); $actualResponse = $redis->function->load( "#!lua name={$this->libName} \n redis.register_function('myfunc', function(keys, args) return args[1] end)" ); $this->assertSame($this->libName, $actualResponse); $this->assertSame('arg1', $redis->fcall('myfunc', [], 'arg1')); $overriddenResponse = $redis->function->load( "#!lua name={$this->libName} \n redis.register_function('myfunc', function(keys, args) return args[2] end)", true ); $this->assertSame($this->libName, $overriddenResponse); $this->assertSame('arg2', $redis->fcall('myfunc', [], 'arg1', 'arg2')); $this->assertEquals('OK', $redis->function->delete($this->libName)); } /** * @group connected * @return void * @requiresRedisVersion >= 7.0.0 */ public function testLoadFunctionThrowsErrorOnAlreadyExistingLibraryGiven(): void { $redis = $this->getClient(); $redis->function->flush(); $actualResponse = $redis->function->load( "#!lua name={$this->libName} \n redis.register_function('myfunc', function(keys, args) return args[1] end)" ); $this->assertSame($this->libName, $actualResponse); $this->expectException(ServerException::class); $this->expectExceptionMessage("ERR Library '{$this->libName}' already exists"); try { $redis->function->load( "#!lua name={$this->libName} \n redis.register_function('myfunc', function(keys, args) return args[1] end)" ); } finally { $this->assertEquals('OK', $redis->function->delete($this->libName)); } } /** * @group connected * @return void * @requiresRedisVersion >= 7.0.0 */ public function testDeleteFunctionRemovesAlreadyExistingLibrary(): void { $redis = $this->getClient(); $redis->function->flush(); $actualResponse = $redis->function->load( "#!lua name={$this->libName} \n redis.register_function('myfunc', function(keys, args) return args[1] end)" ); $this->assertSame($this->libName, $actualResponse); $this->assertEquals('OK', $redis->function->delete($this->libName)); } /** * @group connected * @return void * @requiresRedisVersion >= 7.0.0 */ public function testDumpReturnsSerializedPayloadOfLibrary(): void { $redis = $this->getClient(); $redis->function->flush(); $libName = $redis->function->load( "#!lua name={$this->libName} \n redis.register_function('myfunc', function(keys, args) return args[1] end)" ); $this->assertSame($this->libName, $libName); $this->assertStringContainsString($libName, $redis->function->dump()); } /** * @group connected * @return void * @requiresRedisVersion >= 7.0.0 */ public function testFlushRemovesAllLibraries(): void { $redis = $this->getClient(); $redis->function->flush(); $libName = $redis->function->load( "#!lua name={$this->libName} \n redis.register_function('myfunc', function(keys, args) return args[1] end)" ); $this->assertEquals($this->libName, $libName); $this->assertEquals('OK', $redis->function->flush()); } /** * @group connected * @return void * @requiresRedisVersion >= 7.0.0 */ public function testRestoresLibraryFromSerializedPayload(): void { $redis = $this->getClient(); $redis->function->flush(); $libName = $redis->function->load( "#!lua name={$this->libName} \n redis.register_function('myfunc', function(keys, args) return args[1] end)" ); $this->assertEquals($this->libName, $libName); $serializedPayload = $redis->function->dump(); $this->assertStringContainsString($libName, $serializedPayload); $redis->function->flush(); $this->assertEquals('OK', $redis->function->restore($serializedPayload)); } /** * @group connected * @return void * @requiresRedisVersion >= 7.0.0 */ public function testDeleteFunctionThrowsErrorOnNonExistingLibrary(): void { $redis = $this->getClient(); $redis->function->flush(); $this->expectException(ServerException::class); $this->expectExceptionMessage('ERR Library not found'); $redis->function->delete($this->libName); } public function flushArgumentsProvider(): array { return [ 'with default arguments' => [ ['FLUSH', null], ['FLUSH'], ], 'with mode argument' => [ ['FLUSH', 'sync'], ['FLUSH', 'SYNC'], ], ]; } public function restoreArgumentsProvider(): array { return [ 'with default arguments' => [ ['RESTORE', 'value', null], ['RESTORE', 'value'], ], 'with mode argument' => [ ['RESTORE', 'value', 'append'], ['RESTORE', 'value', 'APPEND'], ], ]; } }