diff --git a/README.md b/README.md index 6cd0a48..2918ceb 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ Redis command | Description **SETEX** *key* *seconds* *value* | Sets the value and expiration of a key **SETNX** *key* *value* | Sets key to hold value if key does not exist **SADD** *key* *member* *[member ...]* | Adds one or more members to a set +**SDIFF** *key* *key* *[key ...]* | Returns the members of the set resulting from the difference between the first set and all the successive sets. **SISMEMBER** *key* *member* | Determines if a member is in a set **SMEMBERS** *key* | Gets all the members in a set **SUNION** *key* *[key ...]* | Returns the members of the set resulting from the union of all the given sets. diff --git a/src/M6Web/Component/RedisMock/RedisMock.php b/src/M6Web/Component/RedisMock/RedisMock.php index 6534343..a89b76e 100644 --- a/src/M6Web/Component/RedisMock/RedisMock.php +++ b/src/M6Web/Component/RedisMock/RedisMock.php @@ -333,6 +333,21 @@ public function sadd($key, $members) } + public function sdiff($key) + { + $this->stopPipeline(); + $keys = is_array($key) ? $key : func_get_args(); + $result = []; + foreach ($keys as $key) { + $result[] = $this->smembers($key); + } + $result = array_values(array_diff(...$result)); + + $this->restorePipeline(); + + return $this->returnPipedInfo($result); + } + public function smembers($key) { if (!isset(self::$dataValues[$this->storage][$key]) || $this->deleteOnTtlExpired($key)) { diff --git a/tests/units/RedisMock.php b/tests/units/RedisMock.php index af77f6b..db62e7b 100644 --- a/tests/units/RedisMock.php +++ b/tests/units/RedisMock.php @@ -470,6 +470,18 @@ public function testSCard() ->isEqualTo(0); } + public function testSDiff() + { + $redisMock = new Redis(); + $redisMock->sadd('key1', 'a', 'b', 'c', 'd'); + $redisMock->sadd('key2', 'c'); + $redisMock->sadd('key3', 'a', 'c', 'e'); + + $this->assert + ->array($redisMock->sdiff('key1', 'key2', 'key3')) + ->isEqualTo(['b', 'd']); + } + public function testSAddSMembersSIsMemberSRem() { $redisMock = new Redis();