Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion flowvault/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
</parent>

<artifactId>skyflow-flowvault-java</artifactId>
<version>3.0.0-beta.13-dev.962614b1</version>
<version>3.0.0-beta.13-dev.7c0fb7be</version>
<packaging>jar</packaging>
<name>${project.groupId}:${project.artifactId}</name>
<description>Skyflow V3 SDK for the Java programming language</description>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,37 @@ public static void validateInsertRequest(InsertRequest insertRequest) throws Sky
}
}
}
validateInsertRecordTokens(record.getTokens());
}
}

// Tokens are optional on an insert record, but when supplied the map must not be empty and
// every entry must have a non-blank key and value — mirroring the checks on data above.
private static void validateInsertRecordTokens(Map<String, Object> tokens) throws SkyflowException {
if (tokens == null) {
return;
}
if (tokens.isEmpty()) {
LogUtil.printErrorLog(Utils.parameterizedString(
ErrorLogs.EMPTY_TOKENS.getLog(), InterfaceName.INSERT.getName()
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokens.getMessage());
}
for (String key : tokens.keySet()) {
if (key == null || key.trim().isEmpty()) {
LogUtil.printErrorLog(Utils.parameterizedString(
ErrorLogs.EMPTY_OR_NULL_KEY_IN_TOKENS.getLog(), InterfaceName.INSERT.getName()
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyKeyInTokens.getMessage());
}
Object value = tokens.get(key);
if (value == null || value.toString().trim().isEmpty()) {
LogUtil.printErrorLog(Utils.parameterizedString(
ErrorLogs.EMPTY_OR_NULL_VALUE_IN_TOKENS.getLog(),
InterfaceName.INSERT.getName(), key
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyValueInTokens.getMessage());
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -528,9 +528,9 @@ private static com.skyflow.generated.rest.types.V1Upsert upsertWire(String updat
// ── insert: tokens map ───────────────────────────────────────────────────

@Test
public void testBulkInsert_emptyTokensMapIsOmittedFromWire_knownGap() {
// KNOWN GAP: an explicitly-set-but-empty tokens map is dropped rather than sent as {}.
// Pinning current behavior — a caller cannot distinguish "no tokens" from "empty tokens".
public void testBulkInsert_emptyTokensMapIsOmittedFromWire() {
// Validations.validateInsertRequest rejects an explicitly-set-but-empty tokens map before
// the body builder runs; this pins the builder's own behavior when called directly.
Map<String, Object> data = new HashMap<>();
data.put("name", "john");
BulkInsertRequestRecord record = BulkInsertRequestRecord.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -568,6 +568,79 @@ public void testValidateInsertRequest_validRequestWithTokens() {
}
}

@Test
public void testValidateInsertRequest_emptyTokensMapThrows() {
ArrayList<InsertRequestRecord> records = new ArrayList<>();
records.add(InsertRequestRecord.builder().tableName("table1").tokens(new HashMap<>()).build());
InsertRequest request = InsertRequest.builder().records(records).build();
try {
Validations.validateInsertRequest(request);
Assert.fail(EXCEPTION_NOT_THROWN);
} catch (SkyflowException e) {
Assert.assertEquals(ErrorMessage.EmptyTokens.getMessage(), e.getMessage());
}
}

@Test
public void testValidateInsertRequest_nullKeyInTokensThrows() {
Map<String, Object> tokens = new HashMap<>();
tokens.put(null, "tok-abc");
ArrayList<InsertRequestRecord> records = new ArrayList<>();
records.add(InsertRequestRecord.builder().tableName("table1").tokens(tokens).build());
InsertRequest request = InsertRequest.builder().records(records).build();
try {
Validations.validateInsertRequest(request);
Assert.fail(EXCEPTION_NOT_THROWN);
} catch (SkyflowException e) {
Assert.assertEquals(ErrorMessage.EmptyKeyInTokens.getMessage(), e.getMessage());
}
}

@Test
public void testValidateInsertRequest_blankKeyInTokensThrows() {
Map<String, Object> tokens = new HashMap<>();
tokens.put(" ", "tok-abc");
ArrayList<InsertRequestRecord> records = new ArrayList<>();
records.add(InsertRequestRecord.builder().tableName("table1").tokens(tokens).build());
InsertRequest request = InsertRequest.builder().records(records).build();
try {
Validations.validateInsertRequest(request);
Assert.fail(EXCEPTION_NOT_THROWN);
} catch (SkyflowException e) {
Assert.assertEquals(ErrorMessage.EmptyKeyInTokens.getMessage(), e.getMessage());
}
}

@Test
public void testValidateInsertRequest_nullValueInTokensThrows() {
Map<String, Object> tokens = new HashMap<>();
tokens.put("name", null);
ArrayList<InsertRequestRecord> records = new ArrayList<>();
records.add(InsertRequestRecord.builder().tableName("table1").tokens(tokens).build());
InsertRequest request = InsertRequest.builder().records(records).build();
try {
Validations.validateInsertRequest(request);
Assert.fail(EXCEPTION_NOT_THROWN);
} catch (SkyflowException e) {
Assert.assertEquals(ErrorMessage.EmptyValueInTokens.getMessage(), e.getMessage());
}
}

@Test
public void testValidateInsertRequest_blankValueInTokensThrows() {
Map<String, Object> tokens = new HashMap<>();
tokens.put("name", " ");
ArrayList<InsertRequestRecord> records = new ArrayList<>();
records.add(InsertRequestRecord.builder().tableName("table1").tokens(tokens).build());
InsertRequest request = InsertRequest.builder().records(records).build();
try {
Validations.validateInsertRequest(request);
Assert.fail(EXCEPTION_NOT_THROWN);
} catch (SkyflowException e) {
Assert.assertEquals(ErrorMessage.EmptyValueInTokens.getMessage(), e.getMessage());
}
}

// ── validateDetokenizeRequest ─────────────────────────────────────────────

@Test
Expand Down
Loading