Files
Nathan Harris adcff65030 Add variadic overloads for several commands
Motivation:

For ergonomics, users sometimes want to provide arguments as a variadic list rather than an array.

Modifications:

- Add variadic overloads for almost all methods that accept lists of homogenous types

Result:

Users should have more flexibility in the way arguments are passed to command methods
2019-10-26 23:55:47 -07:00

164 lines
6.2 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the RediStack open source project
//
// Copyright (c) 2019 RediStack project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of RediStack project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
@testable import RediStack
import RediStackTestUtils
import XCTest
final class HashCommandsTests: RediStackIntegrationTestCase {
func test_hset() throws {
var result = try connection.hset("test", to: "\(#line)", in: #function).wait()
XCTAssertTrue(result)
result = try connection.hset("test", to: "\(#line)", in: #function).wait()
XCTAssertFalse(result)
}
func test_hmset() throws {
XCTAssertNoThrow(try connection.hmset(["field": 30], in: #function).wait())
let value = try connection.hget("field", from: #function).wait()
XCTAssertEqual(value, "30")
}
func test_hsetnx() throws {
var success = try connection.hsetnx("field", to: "foo", in: #function).wait()
XCTAssertTrue(success)
success = try connection.hsetnx("field", to: 30, in: #function).wait()
XCTAssertFalse(success)
let value = try connection.hget("field", from: #function).wait()
XCTAssertEqual(value, "foo")
}
func test_hget() throws {
_ = try connection.hset("test", to: 30, in: #function).wait()
let value = try connection.hget("test", from: #function).wait()
XCTAssertEqual(value, "30")
}
func test_hmget() throws {
_ = try connection.hmset(["first": "foo", "second": "bar"], in: #function).wait()
let values = try connection.hmget("first", "second", "fake", from: #function).wait()
XCTAssertEqual(values[0], "foo")
XCTAssertEqual(values[1], "bar")
XCTAssertNil(values[2])
}
func test_hgetall() throws {
let dataset = ["first": "foo", "second": "bar"]
_ = try connection.hmset(dataset, in: #function).wait()
let hashes = try connection.hgetall(from: #function).wait()
XCTAssertEqual(hashes, dataset)
}
func test_hdel() throws {
_ = try connection.hmset(["first": "foo", "second": "bar"], in: #function).wait()
let count = try connection.hdel("first", "second", "fake", from: #function).wait()
XCTAssertEqual(count, 2)
}
func test_hexists() throws {
var exists = try connection.hexists("foo", in: #function).wait()
XCTAssertFalse(exists)
_ = try connection.hset("foo", to: "\(#line)", in: #function).wait()
exists = try connection.hexists("foo", in: #function).wait()
XCTAssertTrue(exists)
}
func test_hlen() throws {
var count = try connection.hlen(of: #function).wait()
XCTAssertEqual(count, 0)
_ = try connection.hset("first", to: "\(#line)", in: #function).wait()
count = try connection.hlen(of: #function).wait()
XCTAssertEqual(count, 1)
_ = try connection.hset("second", to: "\(#line)", in: #function).wait()
count = try connection.hlen(of: #function).wait()
XCTAssertEqual(count, 2)
}
func test_hstrlen() throws {
_ = try connection.hset("first", to: "foo", in: #function).wait()
var size = try connection.hstrlen(of: "first", in: #function).wait()
XCTAssertEqual(size, 3)
_ = try connection.hset("second", to: 300, in: #function).wait()
size = try connection.hstrlen(of: "second", in: #function).wait()
XCTAssertEqual(size, 3)
}
func test_hkeys() throws {
let dataset: [String: String] = [
"first": "3",
"second": "foo"
]
_ = try connection.hmset(dataset, in: #function).wait()
let keys = try connection.hkeys(in: #function).wait()
XCTAssertEqual(keys.count, 2)
XCTAssertTrue(keys.allSatisfy(dataset.keys.contains))
}
func test_hvals() throws {
let dataset = [
"first": "3",
"second": "foo"
]
_ = try connection.hmset(dataset, in: #function).wait()
let values = try connection.hvals(in: #function).wait().compactMap { String(fromRESP: $0) }
XCTAssertEqual(values.count, 2)
XCTAssertTrue(values.allSatisfy(dataset.values.contains))
}
func test_hincrby() throws {
_ = try connection.hset("first", to: 3, in: #function).wait()
var value = try connection.hincrby(10, field: "first", in: #function).wait()
XCTAssertEqual(value, 13)
value = try connection.hincrby(-15, field: "first", in: #function).wait()
XCTAssertEqual(value, -2)
}
func test_hincrbyfloat() throws {
_ = try connection.hset("first", to: 3.14, in: #function).wait()
let double = try connection.hincrbyfloat(Double(3.14), field: "first", in: #function).wait()
XCTAssertEqual(double, 6.28)
let float = try connection.hincrbyfloat(Float(-10.23523), field: "first", in: #function).wait()
XCTAssertEqual(float, -3.95523)
}
func test_hscan() throws {
var dataset: [String: String] = [:]
for index in 1...15 {
let key = "key\(index)\(index % 2 == 0 ? "_even" : "_odd")"
dataset[key] = "\(index)"
}
_ = try connection.hmset(dataset, in: #function).wait()
var (cursor, fields) = try connection.hscan(#function, count: 5).wait()
XCTAssertGreaterThanOrEqual(cursor, 0)
XCTAssertGreaterThanOrEqual(fields.count, 5)
(_, fields) = try connection.hscan(#function, startingFrom: cursor, count: 8).wait()
XCTAssertGreaterThanOrEqual(fields.count, 8)
(cursor, fields) = try connection.hscan(#function, matching: "*_odd").wait()
XCTAssertGreaterThanOrEqual(cursor, 0)
XCTAssertGreaterThanOrEqual(fields.count, 1)
XCTAssertLessThanOrEqual(fields.count, 8)
(cursor, fields) = try connection.hscan(#function, matching: "*_ev*").wait()
XCTAssertGreaterThanOrEqual(cursor, 0)
XCTAssertGreaterThanOrEqual(fields.count, 1)
XCTAssertLessThanOrEqual(fields.count, 7)
}
}