/* * Copyright 2016-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.data.redis.connection.lettuce; import static org.hamcrest.collection.IsIterableContainingInOrder.*; import static org.hamcrest.core.Is.*; import static org.hamcrest.core.IsEqual.*; import static org.hamcrest.core.IsNull.*; import static org.junit.Assert.*; import reactor.test.StepVerifier; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import org.junit.Test; /** * @author Christoph Strobl * @author Mark Paluch */ public class LettuceReactiveHashCommandsTests extends LettuceReactiveCommandsTestsBase { static final String FIELD_1 = "field-1"; static final String FIELD_2 = "field-2"; static final String FIELD_3 = "field-3"; static final byte[] FIELD_1_BYTES = FIELD_1.getBytes(Charset.forName("UTF-8")); static final byte[] FIELD_2_BYTES = FIELD_2.getBytes(Charset.forName("UTF-8")); static final byte[] FIELD_3_BYTES = FIELD_3.getBytes(Charset.forName("UTF-8")); static final ByteBuffer FIELD_1_BBUFFER = ByteBuffer.wrap(FIELD_1_BYTES); static final ByteBuffer FIELD_2_BBUFFER = ByteBuffer.wrap(FIELD_2_BYTES); static final ByteBuffer FIELD_3_BBUFFER = ByteBuffer.wrap(FIELD_3_BYTES); @Test // DATAREDIS-525 public void hSetShouldOperateCorrectly() { assertThat(connection.hashCommands().hSet(KEY_1_BBUFFER, FIELD_1_BBUFFER, VALUE_1_BBUFFER).block(), is(true)); } @Test // DATAREDIS-525 public void hSetNxShouldOperateCorrectly() { assertThat(connection.hashCommands().hSetNX(KEY_1_BBUFFER, FIELD_1_BBUFFER, VALUE_1_BBUFFER).block(), is(true)); } @Test // DATAREDIS-525 public void hSetNxShouldReturnFalseIfFieldAlreadyExists() { nativeCommands.hset(KEY_1, FIELD_1, VALUE_1); assertThat(connection.hashCommands().hSetNX(KEY_1_BBUFFER, FIELD_1_BBUFFER, VALUE_1_BBUFFER).block(), is(false)); } @Test // DATAREDIS-525 public void hGetShouldReturnValueForExistingField() { nativeCommands.hset(KEY_1, FIELD_1, VALUE_1); nativeCommands.hset(KEY_1, FIELD_2, VALUE_2); nativeCommands.hset(KEY_1, FIELD_3, VALUE_3); assertThat(connection.hashCommands().hGet(KEY_1_BBUFFER, FIELD_1_BBUFFER).block(), is(equalTo(VALUE_1_BBUFFER))); } @Test // DATAREDIS-525 public void hGetShouldReturnNullForNotExistingField() { nativeCommands.hset(KEY_1, FIELD_1, VALUE_1); assertThat(connection.hashCommands().hGet(KEY_1_BBUFFER, FIELD_2_BBUFFER).block(), is(nullValue())); } @Test // DATAREDIS-525 public void hMGetShouldReturnValueForFields() { nativeCommands.hset(KEY_1, FIELD_1, VALUE_1); nativeCommands.hset(KEY_1, FIELD_2, VALUE_2); nativeCommands.hset(KEY_1, FIELD_3, VALUE_3); assertThat(connection.hashCommands().hMGet(KEY_1_BBUFFER, Arrays.asList(FIELD_1_BBUFFER, FIELD_3_BBUFFER)).block(), contains(VALUE_1_BBUFFER, VALUE_3_BBUFFER)); } @Test // DATAREDIS-525 public void hMGetShouldReturnNullValueForFieldsThatHaveNoValue() { nativeCommands.hset(KEY_1, FIELD_1, VALUE_1); nativeCommands.hset(KEY_1, FIELD_3, VALUE_3); assertThat(connection.hashCommands() .hMGet(KEY_1_BBUFFER, Arrays.asList(FIELD_1_BBUFFER, FIELD_2_BBUFFER, FIELD_3_BBUFFER)).block(), contains(VALUE_1_BBUFFER, null, VALUE_3_BBUFFER)); } @Test // DATAREDIS-525 public void hMSetSouldSetValuesCorrectly() { Map<ByteBuffer, ByteBuffer> fieldValues = new LinkedHashMap<>(); fieldValues.put(FIELD_1_BBUFFER, VALUE_1_BBUFFER); fieldValues.put(FIELD_2_BBUFFER, VALUE_2_BBUFFER); assertThat(connection.hashCommands().hMSet(KEY_1_BBUFFER, fieldValues).block(), is(true)); assertThat(nativeCommands.hget(KEY_1, FIELD_1), is(equalTo(VALUE_1))); assertThat(nativeCommands.hget(KEY_1, FIELD_2), is(equalTo(VALUE_2))); } @Test // DATAREDIS-525 public void hExistsShouldReturnTrueForExistingField() { nativeCommands.hset(KEY_1, FIELD_1, VALUE_1); assertThat(connection.hashCommands().hExists(KEY_1_BBUFFER, FIELD_1_BBUFFER).block(), is(true)); } @Test // DATAREDIS-525 public void hExistsShouldReturnFalseForNonExistingField() { assertThat(connection.hashCommands().hExists(KEY_1_BBUFFER, FIELD_1_BBUFFER).block(), is(false)); } @Test // DATAREDIS-525 public void hDelShouldRemoveSingleFieldsCorrectly() { nativeCommands.hset(KEY_1, FIELD_1, VALUE_1); nativeCommands.hset(KEY_1, FIELD_2, VALUE_2); nativeCommands.hset(KEY_1, FIELD_3, VALUE_3); assertThat(connection.hashCommands().hDel(KEY_1_BBUFFER, FIELD_2_BBUFFER).block(), is(true)); } @Test // DATAREDIS-525 public void hDelShouldRemoveMultipleFieldsCorrectly() { nativeCommands.hset(KEY_1, FIELD_1, VALUE_1); nativeCommands.hset(KEY_1, FIELD_2, VALUE_2); nativeCommands.hset(KEY_1, FIELD_3, VALUE_3); assertThat(connection.hashCommands().hDel(KEY_1_BBUFFER, Arrays.asList(FIELD_1_BBUFFER, FIELD_3_BBUFFER)).block(), is(2L)); } @Test // DATAREDIS-525 public void hLenShouldReturnSizeCorrectly() { nativeCommands.hset(KEY_1, FIELD_1, VALUE_1); nativeCommands.hset(KEY_1, FIELD_2, VALUE_2); nativeCommands.hset(KEY_1, FIELD_3, VALUE_3); assertThat(connection.hashCommands().hLen(KEY_1_BBUFFER).block(), is(3L)); } @Test // DATAREDIS-525 public void hKeysShouldReturnFieldsCorrectly() { nativeCommands.hset(KEY_1, FIELD_1, VALUE_1); nativeCommands.hset(KEY_1, FIELD_2, VALUE_2); nativeCommands.hset(KEY_1, FIELD_3, VALUE_3); StepVerifier.create(connection.hashCommands().hKeys(KEY_1_BBUFFER)) // .expectNext(FIELD_1_BBUFFER, FIELD_2_BBUFFER, FIELD_3_BBUFFER) // .verifyComplete(); } @Test // DATAREDIS-525 public void hValsShouldReturnValuesCorrectly() { nativeCommands.hset(KEY_1, FIELD_1, VALUE_1); nativeCommands.hset(KEY_1, FIELD_2, VALUE_2); nativeCommands.hset(KEY_1, FIELD_3, VALUE_3); StepVerifier.create(connection.hashCommands().hVals(KEY_1_BBUFFER)) .expectNext(VALUE_1_BBUFFER, VALUE_2_BBUFFER, VALUE_3_BBUFFER) // .verifyComplete(); } @Test // DATAREDIS-525 public void hGetAllShouldReturnEntriesCorrectly() { nativeCommands.hset(KEY_1, FIELD_1, VALUE_1); nativeCommands.hset(KEY_1, FIELD_2, VALUE_2); nativeCommands.hset(KEY_1, FIELD_3, VALUE_3); Map<ByteBuffer, ByteBuffer> expected = new HashMap<>(); expected.put(FIELD_1_BBUFFER, VALUE_1_BBUFFER); expected.put(FIELD_2_BBUFFER, VALUE_2_BBUFFER); expected.put(FIELD_3_BBUFFER, VALUE_3_BBUFFER); StepVerifier.create(connection.hashCommands().hGetAll(KEY_1_BBUFFER).buffer(3)) // .consumeNextWith(list -> { assertTrue(list.containsAll(expected.entrySet())); }) // .verifyComplete(); } }