Skip to content

Commit fca59b2

Browse files
committed
Add notNull constraint when parsing
1 parent e0a3134 commit fca59b2

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

todo-api/src/main/java/lol/maki/dev/todo/TodoController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import java.net.URI;
99
import java.util.List;
1010
import java.util.Map;
11-
import java.util.Set;
1211
import java.util.UUID;
1312
import org.springframework.http.HttpStatus;
1413
import org.springframework.http.ResponseEntity;
@@ -96,7 +95,7 @@ static TodoCreateRequest parse(Map<String, String> map) {
9695

9796
record TodoUpdateRequest(String todoTitle, Boolean finished) {
9897
private static final Arguments1Validator<Map<String, String>, TodoUpdateRequest> validator = Todo.todoTitleValidator
99-
.split(StringValidatorBuilder.of("finished", c -> c.oneOf(Set.of("true", "false")))
98+
.split(StringValidatorBuilder.of("finished", c -> c.notNull().oneOf(List.of("true", "false")))
10099
.build(Boolean::parseBoolean)
101100
.andThen(Todo.finishedValidator))
102101
.apply(TodoUpdateRequest::new)

todo-api/src/test/java/lol/maki/dev/todo/TodoApiApplicationTests.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,31 @@ void shouldReturnBadRequestForInvalidTodoUpdate() {
311311
assertThat(response.getBody().get("violations").get(0).get("defaultMessage")).isEqualTo(
312312
new TextNode("The size of \"todoTitle\" must be less than or equal to 255. The given size is 256"));
313313
assertThat(response.getBody().get("violations").get(1).get("defaultMessage"))
314-
.isEqualTo(new TextNode("\"finished\" must be one of the following values: [false, true]"));
314+
.isEqualTo(new TextNode("\"finished\" must be one of the following values: [true, false]"));
315+
}
316+
317+
@Test
318+
@Order(4)
319+
void shouldReturnBadRequestForNullTodoUpdate() {
320+
String accessToken = this.accessTokenSupplier.apply(Set.of("todo:write"));
321+
ResponseEntity<JsonNode> response = this.restClient.patch()
322+
.uri("/todos/{todoId}", "00000000-0000-0000-0000-000000000001")
323+
.contentType(MediaType.APPLICATION_JSON)
324+
.body("""
325+
{}
326+
""")
327+
.headers(httpHeaders -> httpHeaders.setBearerAuth(accessToken))
328+
.retrieve()
329+
.toEntity(JsonNode.class);
330+
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST);
331+
assertThat(response.getBody()).isNotNull();
332+
assertThat(response.getBody().get("message")).isEqualTo(new TextNode("Validation failed"));
333+
assertThat(response.getBody().has("violations")).isTrue();
334+
assertThat(response.getBody().get("violations").size()).isEqualTo(2);
335+
assertThat(response.getBody().get("violations").get(0).get("defaultMessage"))
336+
.isEqualTo(new TextNode("\"todoTitle\" must not be blank"));
337+
assertThat(response.getBody().get("violations").get(1).get("defaultMessage"))
338+
.isEqualTo(new TextNode("\"finished\" must not be null"));
315339
}
316340

317341
@Test

0 commit comments

Comments
 (0)