getCommand(); $command->setArguments($actualArguments); $this->assertSame($expectedArguments, $command->getArguments()); } /** * @group disconnected */ public function testFilterArgumentsThrowsExceptionOnIncorrectFlagValue(): void { $command = $this->getCommand(); $this->expectException(UnexpectedValueException::class); $this->expectExceptionMessage('Unsupported flag value'); $command->setArguments(['key', 1893456000, ['member'], 'wrong']); } /** * @group disconnected */ public function testParseResponse(): void { $command = $this->getCommand(); $this->assertSame([1, -2], $command->parseResponse([1, -2])); } /** * @group disconnected */ public function testPrefixKeys(): void { /** @var PrefixableCommand $command */ $command = $this->getCommand(); $command->setArguments(['key', 1893456000, ['member1', 'member2']]); $command->prefixKeys('prefix:'); $this->assertSame(['prefix:key', 1893456000, 'MEMBERS', 2, 'member1', 'member2'], $command->getArguments()); } /** * @dataProvider setProvider * @group connected * @group slow * @requiresRedisVersion >= 8.11.0 */ public function testSetMembersExpireCorrectlyWithNoFlags( array $members, array $expireMembers, array $expectedResponse, array $expectedMembers ): void { $redis = $this->getClient(); $redis->saddex('setkey', $members); $this->assertSame($expectedResponse, $redis->sexpireat('setkey', time() + 1, $expireMembers)); $this->sleep(2); $this->assertSameValues($expectedMembers, $redis->smembers('setkey')); } /** * @group connected * @requiresRedisVersion >= 8.11.0 */ public function testPastTimestampDeletesMembers(): void { $redis = $this->getClient(); $redis->saddex('setkey', ['member1', 'member2']); $this->assertSame([2], $redis->sexpireat('setkey', time() - 10, ['member1'])); $this->assertSame(['member2'], $redis->smembers('setkey')); } /** * @group connected * @requiresRedisVersion >= 8.11.0 */ public function testSetMembersExpireCorrectlyWithFlags(): void { $redis = $this->getClient(); $now = time(); $redis->saddex('setkey', ['member1', 'member2']); $this->assertSame([1, 1], $redis->sexpireat('setkey', $now + 20, ['member1', 'member2'])); $this->assertSame([0, 0], $redis->sexpireat('setkey', $now + 20, ['member1', 'member2'], 'NX')); $this->assertSame([1, 1], $redis->sexpireat('setkey', $now + 20, ['member1', 'member2'], 'XX')); $this->assertSame([1, 1], $redis->sexpireat('setkey', $now + 30, ['member1', 'member2'], 'GT')); $this->assertSame([0, 0], $redis->sexpireat('setkey', $now + 10, ['member1', 'member2'], 'GT')); $this->assertSame([1, 1], $redis->sexpireat('setkey', $now + 20, ['member1', 'member2'], 'LT')); $this->assertSame([0, 0], $redis->sexpireat('setkey', $now + 30, ['member1', 'member2'], 'LT')); $this->assertSame([-2, -2], $redis->sexpireat('wrongkey', $now + 20, ['member1', 'member2'])); } public function setProvider(): array { return [ 'with all members expired' => [ ['member1', 'member2'], ['member1', 'member2'], [1, 1], [], ], 'with partial members expired' => [ ['member1', 'member2'], ['member1'], [1], ['member2'], ], 'with incorrect members' => [ ['member1', 'member2'], ['member3', 'member4'], [-2, -2], ['member1', 'member2'], ], ]; } public function argumentsProvider(): array { return [ 'with specified members' => [ ['key', 1893456000, ['member1', 'member2']], ['key', 1893456000, 'MEMBERS', 2, 'member1', 'member2'], ], 'with lowercase flag' => [ ['key', 1893456000, ['member1'], 'nx'], ['key', 1893456000, 'NX', 'MEMBERS', 1, 'member1'], ], 'with all arguments' => [ ['key', 1893456000, ['member1', 'member2'], 'XX'], ['key', 1893456000, 'XX', 'MEMBERS', 2, 'member1', 'member2'], ], ]; } }