setAccessible(true); return $rM->invoke($rM->isStatic() ? null : new StreamsCronJob(), ...$rArgs); } private function uuids($rConnections, $rStreamID): array { return $this->call('connectionUuidsForStream', $rConnections, $rStreamID); } private function collect($rNode): array { return $this->call('collectUuidRows', $rNode); } public function testRedisPairShapeFiltersByStream(): void { $rConnections = [ ['redis-key-1', 'redis-key-2'], [ ['uuid' => 'a', 'stream_id' => 5], ['uuid' => 'b', 'stream_id' => 9], ], ]; $this->assertSame(['a'], $this->uuids($rConnections, 5)); } public function testMysqlGroupedShapeKeepsRowsWithoutStreamId(): void { $rConnections = [ 10 => [['uuid' => 'c', 'stream_id' => 5]], 11 => [['uuid' => 'd']], // no stream_id → kept ]; $this->assertSame(['c', 'd'], $this->uuids($rConnections, 5)); } public function testSingleConnectionRow(): void { $this->assertSame(['e'], $this->uuids(['uuid' => 'e', 'stream_id' => 5], 5)); } public function testNonArrayAndEmptyYieldNothing(): void { $this->assertSame([], $this->uuids([], 5)); $this->assertSame([], $this->uuids(null, 5)); $this->assertSame([], $this->collect('a-redis-key-string')); } }