Skip to content

Commit f2c59ed

Browse files
committed
Add GetObjectApiTest, PutObjectsApiTest, ListKeyVersionsApiTest
1 parent 0f2b242 commit f2c59ed

File tree

4 files changed

+272
-0
lines changed

4 files changed

+272
-0
lines changed

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ buildscript {
44
ext.protobufVersion = '3.21.7'
55
ext.jerseyVersion = '3.1.0'
66
ext.junitVersion = '5.9.0'
7+
ext.mockitoVersion = '5.2.0'
78
ext.postgresVersion = '42.5.1'
89
ext.jooqVersion = '3.17.7'
910
ext.guiceVersion = '5.1.0'
@@ -48,6 +49,8 @@ dependencies {
4849
annotationProcessor 'org.projectlombok:lombok:1.18.24'
4950

5051
testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
52+
testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion"
53+
testImplementation "org.mockito:mockito-core:$mockitoVersion"
5154
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
5255
testImplementation "org.hamcrest:hamcrest-library:2.2"
5356
testImplementation "org.testcontainers:junit-jupiter:1.17.6"
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package org.vss.api;
2+
3+
import com.google.protobuf.ByteString;
4+
import jakarta.ws.rs.core.Response;
5+
import java.nio.charset.StandardCharsets;
6+
import java.util.stream.Stream;
7+
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.Test;
9+
import org.junit.jupiter.params.ParameterizedTest;
10+
import org.junit.jupiter.params.provider.Arguments;
11+
import org.junit.jupiter.params.provider.MethodSource;
12+
import org.vss.ErrorCode;
13+
import org.vss.ErrorResponse;
14+
import org.vss.GetObjectRequest;
15+
import org.vss.GetObjectResponse;
16+
import org.vss.KVStore;
17+
import org.vss.KeyValue;
18+
import org.vss.exception.ConflictException;
19+
20+
import static org.hamcrest.MatcherAssert.assertThat;
21+
import static org.hamcrest.Matchers.is;
22+
import static org.mockito.ArgumentMatchers.any;
23+
import static org.mockito.Mockito.mock;
24+
import static org.mockito.Mockito.verify;
25+
import static org.mockito.Mockito.when;
26+
27+
class GetObjectApiTest {
28+
private GetObjectApi getObjectApi;
29+
private KVStore mockKVStore;
30+
31+
private static String TEST_STORE_ID = "storeId";
32+
private static String TEST_KEY = "key";
33+
private static KeyValue TEST_KV = KeyValue.newBuilder().setKey(TEST_KEY).setValue(
34+
ByteString.copyFrom("test_value", StandardCharsets.UTF_8)).build();
35+
36+
@BeforeEach
37+
void setUp() {
38+
mockKVStore = mock(KVStore.class);
39+
getObjectApi = new GetObjectApi(mockKVStore);
40+
}
41+
42+
@Test
43+
void execute_ValidPayload_ReturnsResponse() {
44+
GetObjectRequest expectedRequest =
45+
GetObjectRequest.newBuilder().setStoreId(TEST_STORE_ID).setKey(TEST_KEY).build();
46+
byte[] payload = expectedRequest.toByteArray();
47+
GetObjectResponse mockResponse = GetObjectResponse.newBuilder().setValue(TEST_KV).build();
48+
when(mockKVStore.get(expectedRequest)).thenReturn(mockResponse);
49+
50+
Response actualResponse = getObjectApi.execute(payload);
51+
52+
assertThat(actualResponse.getStatus(), is(Response.Status.OK.getStatusCode()));
53+
assertThat(actualResponse.getEntity(), is(mockResponse.toByteArray()));
54+
verify(mockKVStore).get(expectedRequest);
55+
}
56+
57+
@ParameterizedTest
58+
@MethodSource("provideErrorTestCases")
59+
void execute_InvalidPayload_ReturnsErrorResponse(Exception exception,
60+
ErrorCode errorCode) {
61+
GetObjectRequest expectedRequest = GetObjectRequest.newBuilder()
62+
.setStoreId(TEST_STORE_ID)
63+
.setKey(TEST_KEY)
64+
.build();
65+
byte[] payload = expectedRequest.toByteArray();
66+
when(mockKVStore.get(any())).thenThrow(exception);
67+
68+
Response response = getObjectApi.execute(payload);
69+
70+
ErrorResponse expectedErrorResponse = ErrorResponse.newBuilder()
71+
.setErrorCode(errorCode)
72+
.setMessage("")
73+
.build();
74+
assertThat(response.getEntity(), is(expectedErrorResponse.toByteArray()));
75+
assertThat(response.getStatus(), is(expectedErrorResponse.getErrorCode().getNumber()));
76+
verify(mockKVStore).get(expectedRequest);
77+
}
78+
79+
private static Stream<Arguments> provideErrorTestCases() {
80+
return Stream.of(
81+
Arguments.of(new ConflictException(""), ErrorCode.CONFLICT_EXCEPTION),
82+
Arguments.of(new IllegalArgumentException(""), ErrorCode.INVALID_REQUEST_EXCEPTION),
83+
Arguments.of(new RuntimeException(""), ErrorCode.INTERNAL_SERVER_EXCEPTION)
84+
);
85+
}
86+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package org.vss.api;
2+
3+
import com.google.protobuf.ByteString;
4+
import jakarta.ws.rs.core.Response;
5+
import java.nio.charset.StandardCharsets;
6+
import java.util.List;
7+
import java.util.stream.Stream;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.params.ParameterizedTest;
11+
import org.junit.jupiter.params.provider.Arguments;
12+
import org.junit.jupiter.params.provider.MethodSource;
13+
import org.vss.ErrorCode;
14+
import org.vss.ErrorResponse;
15+
import org.vss.KVStore;
16+
import org.vss.KeyValue;
17+
import org.vss.ListKeyVersionsRequest;
18+
import org.vss.ListKeyVersionsResponse;
19+
import org.vss.exception.ConflictException;
20+
21+
import static org.hamcrest.MatcherAssert.assertThat;
22+
import static org.hamcrest.Matchers.is;
23+
import static org.mockito.ArgumentMatchers.any;
24+
import static org.mockito.Mockito.mock;
25+
import static org.mockito.Mockito.verify;
26+
import static org.mockito.Mockito.when;
27+
28+
public class ListKeyVersionsApiTest {
29+
private ListKeyVersionsApi listKeyVersionsApi;
30+
private KVStore mockKVStore;
31+
32+
private static String TEST_STORE_ID = "storeId";
33+
private static String TEST_KEY = "key";
34+
private static KeyValue TEST_KV = KeyValue.newBuilder().setKey(TEST_KEY).setValue(
35+
ByteString.copyFrom("test_value", StandardCharsets.UTF_8)).build();
36+
37+
@BeforeEach
38+
void setUp() {
39+
mockKVStore = mock(KVStore.class);
40+
listKeyVersionsApi = new ListKeyVersionsApi(mockKVStore);
41+
}
42+
43+
@Test
44+
void execute_ValidPayload_ReturnsResponse() {
45+
ListKeyVersionsRequest expectedRequest =
46+
ListKeyVersionsRequest.newBuilder()
47+
.setStoreId(TEST_STORE_ID)
48+
.setKeyPrefix(TEST_KEY)
49+
.build();
50+
byte[] payload = expectedRequest.toByteArray();
51+
ListKeyVersionsResponse mockResponse = ListKeyVersionsResponse.newBuilder().addAllKeyVersions(
52+
List.of(TEST_KV)).build();
53+
when(mockKVStore.listKeyVersions(expectedRequest)).thenReturn(mockResponse);
54+
55+
Response actualResponse = listKeyVersionsApi.execute(payload);
56+
57+
assertThat(actualResponse.getStatus(), is(Response.Status.OK.getStatusCode()));
58+
assertThat(actualResponse.getEntity(), is(mockResponse.toByteArray()));
59+
verify(mockKVStore).listKeyVersions(expectedRequest);
60+
}
61+
62+
@ParameterizedTest
63+
@MethodSource("provideErrorTestCases")
64+
void execute_InvalidPayload_ReturnsErrorResponse(Exception exception,
65+
ErrorCode errorCode) {
66+
ListKeyVersionsRequest expectedRequest =
67+
ListKeyVersionsRequest.newBuilder()
68+
.setStoreId(TEST_STORE_ID)
69+
.setKeyPrefix(TEST_KEY)
70+
.build();
71+
byte[] payload = expectedRequest.toByteArray();
72+
when(mockKVStore.listKeyVersions(any())).thenThrow(exception);
73+
74+
Response response = listKeyVersionsApi.execute(payload);
75+
76+
ErrorResponse expectedErrorResponse = ErrorResponse.newBuilder()
77+
.setErrorCode(errorCode)
78+
.setMessage("")
79+
.build();
80+
assertThat(response.getEntity(), is(expectedErrorResponse.toByteArray()));
81+
assertThat(response.getStatus(), is(expectedErrorResponse.getErrorCode().getNumber()));
82+
verify(mockKVStore).listKeyVersions(expectedRequest);
83+
}
84+
85+
private static Stream<Arguments> provideErrorTestCases() {
86+
return Stream.of(
87+
Arguments.of(new ConflictException(""), ErrorCode.CONFLICT_EXCEPTION),
88+
Arguments.of(new IllegalArgumentException(""), ErrorCode.INVALID_REQUEST_EXCEPTION),
89+
Arguments.of(new RuntimeException(""), ErrorCode.INTERNAL_SERVER_EXCEPTION)
90+
);
91+
}
92+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package org.vss.api;
2+
3+
import com.google.protobuf.ByteString;
4+
import jakarta.ws.rs.core.Response;
5+
import java.nio.charset.StandardCharsets;
6+
import java.util.List;
7+
import java.util.stream.Stream;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.params.ParameterizedTest;
11+
import org.junit.jupiter.params.provider.Arguments;
12+
import org.junit.jupiter.params.provider.MethodSource;
13+
import org.vss.ErrorCode;
14+
import org.vss.ErrorResponse;
15+
import org.vss.KVStore;
16+
import org.vss.KeyValue;
17+
import org.vss.PutObjectRequest;
18+
import org.vss.PutObjectResponse;
19+
import org.vss.exception.ConflictException;
20+
21+
import static org.hamcrest.MatcherAssert.assertThat;
22+
import static org.hamcrest.Matchers.is;
23+
import static org.mockito.ArgumentMatchers.any;
24+
import static org.mockito.Mockito.mock;
25+
import static org.mockito.Mockito.verify;
26+
import static org.mockito.Mockito.when;
27+
28+
public class PutObjectsApiTest {
29+
private PutObjectsApi putObjectsApi;
30+
private KVStore mockKVStore;
31+
32+
private static String TEST_STORE_ID = "storeId";
33+
private static String TEST_KEY = "key";
34+
private static KeyValue TEST_KV = KeyValue.newBuilder().setKey(TEST_KEY).setValue(
35+
ByteString.copyFrom("test_value", StandardCharsets.UTF_8)).build();
36+
37+
@BeforeEach
38+
void setUp() {
39+
mockKVStore = mock(KVStore.class);
40+
putObjectsApi = new PutObjectsApi(mockKVStore);
41+
}
42+
43+
@Test
44+
void execute_ValidPayload_ReturnsResponse() {
45+
PutObjectRequest expectedRequest =
46+
PutObjectRequest.newBuilder()
47+
.setStoreId(TEST_STORE_ID)
48+
.addAllTransactionItems(List.of(TEST_KV))
49+
.build();
50+
byte[] payload = expectedRequest.toByteArray();
51+
PutObjectResponse mockResponse = PutObjectResponse.newBuilder().build();
52+
when(mockKVStore.put(expectedRequest)).thenReturn(mockResponse);
53+
54+
Response actualResponse = putObjectsApi.execute(payload);
55+
56+
assertThat(actualResponse.getStatus(), is(Response.Status.OK.getStatusCode()));
57+
assertThat(actualResponse.getEntity(), is(mockResponse.toByteArray()));
58+
verify(mockKVStore).put(expectedRequest);
59+
}
60+
61+
@ParameterizedTest
62+
@MethodSource("provideErrorTestCases")
63+
void execute_InvalidPayload_ReturnsErrorResponse(Exception exception,
64+
ErrorCode errorCode) {
65+
PutObjectRequest expectedRequest =
66+
PutObjectRequest.newBuilder()
67+
.setStoreId(TEST_STORE_ID)
68+
.addAllTransactionItems(List.of(TEST_KV))
69+
.build();
70+
byte[] payload = expectedRequest.toByteArray();
71+
when(mockKVStore.put(any())).thenThrow(exception);
72+
73+
Response response = putObjectsApi.execute(payload);
74+
75+
ErrorResponse expectedErrorResponse = ErrorResponse.newBuilder()
76+
.setErrorCode(errorCode)
77+
.setMessage("")
78+
.build();
79+
assertThat(response.getEntity(), is(expectedErrorResponse.toByteArray()));
80+
assertThat(response.getStatus(), is(expectedErrorResponse.getErrorCode().getNumber()));
81+
verify(mockKVStore).put(expectedRequest);
82+
}
83+
84+
private static Stream<Arguments> provideErrorTestCases() {
85+
return Stream.of(
86+
Arguments.of(new ConflictException(""), ErrorCode.CONFLICT_EXCEPTION),
87+
Arguments.of(new IllegalArgumentException(""), ErrorCode.INVALID_REQUEST_EXCEPTION),
88+
Arguments.of(new RuntimeException(""), ErrorCode.INTERNAL_SERVER_EXCEPTION)
89+
);
90+
}
91+
}

0 commit comments

Comments
 (0)