+}
+
+func TestSubscribeChannelReDBSubscribeAfterUnsubscribe(t *testing.T) {
+ ps, r, db := setup(true)
+ ch := make(chan *redis.Message)
+ msg := redis.Message{
+ Channel: "{prefix}channel",
+ Pattern: "pattern",
+ Payload: "event",
+ }
+ ps.On("Channel").Return(ch)
+ ps.On("Unsubscribe").Return(nil)
+ ps.On("Close").Return(nil)
+ count := 0
+ receivedChannel := ""
+
+ db.SubscribeChannelDB(func(channel string, payload ...string) {
+ count++
+ receivedChannel = channel
+ }, "{prefix}", "---", "{prefix}channel")
+ ch <- &msg
+ db.UnsubscribeChannelDB("{prefix}channel")
+ time.Sleep(1 * time.Second)
+
+ db.SubscribeChannelDB(func(channel string, payload ...string) {
+ count++
+ receivedChannel = channel
+ }, "{prefix}", "---", "{prefix}channel")
+ ch <- &msg
+ db.UnsubscribeChannelDB("{prefix}channel")
+
+ time.Sleep(1 * time.Second)
+ assert.Equal(t, 2, count)
+ assert.Equal(t, "channel", receivedChannel)
+ r.AssertExpectations(t)
+ ps.AssertExpectations(t)
+}
+
+func TestPTTLSuccessfully(t *testing.T) {
+ _, r, db := setup(true)
+ expectedKey := "key"
+ expectedResult := time.Duration(1)
+ r.On("PTTL", expectedKey).Return(redis.NewDurationResult(expectedResult,
+ nil))
+ result, err := db.PTTL("key")
+ assert.Equal(t, result, expectedResult)
+ assert.Nil(t, err)
+ r.AssertExpectations(t)
+}
+
+func TestPTTLFailure(t *testing.T) {
+ _, r, db := setup(true)
+ expectedKey := "key"
+ expectedResult := time.Duration(1)
+ r.On("PTTL", expectedKey).Return(redis.NewDurationResult(expectedResult,
+ errors.New("Some error")))
+ result, err := db.PTTL("key")
+ assert.Equal(t, result, expectedResult)
+ assert.NotNil(t, err)
+ r.AssertExpectations(t)
+}
+
+func TestPExpireIESuccessfully(t *testing.T) {
+ _, r, db := setup(true)
+ expectedKey := "key"
+ expectedData := "data"
+ expectedDuration := strconv.FormatInt(int64(10000), 10)
+
+ r.On("EvalSha", mock.Anything, []string{expectedKey}, []interface{}{expectedData, expectedDuration}).
+ Return(redis.NewCmdResult(int64(1), nil))
+
+ err := db.PExpireIE("key", "data", 10*time.Second)
+ assert.Nil(t, err)
+ r.AssertExpectations(t)
+}
+
+func TestPExpireIEFailure(t *testing.T) {
+ _, r, db := setup(true)
+ expectedKey := "key"
+ expectedData := "data"
+ expectedDuration := strconv.FormatInt(int64(10000), 10)
+
+ r.On("EvalSha", mock.Anything, []string{expectedKey}, []interface{}{expectedData, expectedDuration}).
+ Return(redis.NewCmdResult(int64(1), errors.New("Some error")))
+
+ err := db.PExpireIE("key", "data", 10*time.Second)
+ assert.NotNil(t, err)
+ r.AssertExpectations(t)
+}
+
+func TestPExpireIELockNotHeld(t *testing.T) {
+ _, r, db := setup(true)
+ expectedKey := "key"
+ expectedData := "data"
+ expectedDuration := strconv.FormatInt(int64(10000), 10)
+
+ r.On("EvalSha", mock.Anything, []string{expectedKey}, []interface{}{expectedData, expectedDuration}).
+ Return(redis.NewCmdResult(int64(0), nil))
+
+ err := db.PExpireIE("key", "data", 10*time.Second)
+ assert.NotNil(t, err)
+ r.AssertExpectations(t)
+}