-
Notifications
You must be signed in to change notification settings - Fork 9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat : use SQLStatementValidator and ValidationGroups #1593
Conversation
Warning Rate limit exceeded@rajadilipkolli has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 12 minutes and 11 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 📒 Files selected for processing (1)
WalkthroughThis pull request involves a comprehensive refactoring of a Spring Boot JPA project, focusing on package restructuring, validation enhancements, and testing improvements. The changes primarily center around reorganizing configuration classes into a new Changes
Possibly related PRs
Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
🔭 Outside diff range comments (1)
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/services/CustomerServiceTest.java (1)
Line range hint
91-96
: Test needs to verify the returned response from deleteCustomerByIdThe test is not verifying the Optional that is now returned by the deleteCustomerById method. This could hide potential mapping issues.
Here's how to fix it:
// when -customerService.deleteCustomerById("CUS_1"); +Optional<CustomerResponse> response = customerService.deleteCustomerById("CUS_1"); // then +assertThat(response).isPresent(); +assertThat(response.get().id()).isEqualTo("CUS_1"); +assertThat(response.get().text()).isEqualTo("junitTest"); verify(customerRepository, times(1)).deleteById("CUS_1");
🧹 Nitpick comments (19)
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/common/AbstractIntegrationTest.java (1)
26-26
: Great improvement in test infrastructure!The switch from
MockMvc
toMockMvcTester
is a positive change that will:
- Improve test readability through fluent assertions
- Provide more powerful verification capabilities
- Align with modern Spring testing practices
This change will benefit all test classes extending
AbstractIntegrationTest
.jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java (4)
119-120
: Consider updating the test method nameThe test now validates both missing customer text and invalid order data (null customerId), but the method name only reflects the text validation. Consider renaming it to better describe all validation scenarios being tested.
-void shouldReturn400WhenCreateNewCustomerWithoutText() +void shouldReturn400WhenCreateNewCustomerWithInvalidData()
165-166
: Consider adding order-related assertionsWhile the test verifies the customer text update, it doesn't assert the order data in the response. Consider extending the test to verify the complete response structure including orders.
.andExpect(status().isOk()) -.andExpect(jsonPath("$.text", is(customerResponse.text()))); +.andExpect(jsonPath("$.text", is(customerResponse.text()))) +.andExpect(jsonPath("$.orders", hasSize(1))) +.andExpect(jsonPath("$.orders[0].id", is("ORD_1"))) +.andExpect(jsonPath("$.orders[0].customerId", is(customerId)));
179-200
: Consider adding more validation scenariosThe test effectively validates the customerId requirement, but consider adding more scenarios to test the validation groups comprehensively. For example:
- Multiple orders with invalid customerIds
- Orders with mismatched customerIds
- Empty order list
Would you like me to help generate additional test methods for these scenarios?
Line range hint
1-238
: Consider organizing validation tests into a nested test classGiven the increased complexity of validation scenarios with the introduction of OrderRequests and validation groups, consider organizing these tests into a nested test class using JUnit 5's
@Nested
annotation. This would improve test organization and make it easier to add more validation scenarios.Example structure:
@Nested class ValidationTests { @Test void shouldValidateCustomerText() { ... } @Test void shouldValidateOrderCustomerId() { ... } @Test void shouldValidateMultipleOrders() { ... } }jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/services/CustomerServiceTest.java (1)
Line range hint
33-33
: Add test cases for validation and error scenariosGiven that this PR introduces SQLStatementValidator and ValidationGroups, consider adding test cases for:
- Invalid customer requests
- Validation group constraints
- Not found scenarios
Example test case:
@Test void saveCustomer_withInvalidRequest_shouldFail() { // given CustomerRequest invalidRequest = new CustomerRequest("", List.of()); // empty text given(customerMapper.mapToEntity(invalidRequest)) .willThrow(new ValidationException("text cannot be empty")); // when/then assertThatThrownBy(() -> customerService.saveCustomer(invalidRequest)) .isInstanceOf(ValidationException.class) .hasMessage("text cannot be empty"); }jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerIT.java (3)
53-73
: Consider adding test cases for different pagination scenarios.While the current test covers the basic pagination response, consider adding test cases for:
- Different page sizes
- Different page numbers
- Sorting parameters
119-119
: Replace hardcoded customer ID with a constant or meaningful value.The test uses a hardcoded customer ID "CUS_1". Consider using a constant or a more meaningful value that matches your ID generation pattern.
- OrderRequest orderRequest = new OrderRequest(null, "CUS_1"); + OrderRequest orderRequest = new OrderRequest(null, "INVALID_CUSTOMER_ID");
175-186
: Add test case for updating non-existent order.Consider adding a test case to verify the behavior when attempting to update a non-existent order. This would ensure complete coverage of error scenarios.
Example test method:
@Test void shouldReturn404WhenUpdatingNonExistentOrder() throws Exception { OrderRequest orderRequest = new OrderRequest("Updated Order", customer.getId()); this.mockMvcTester .put() .uri("/api/orders/{id}", "NON_EXISTENT_ID") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(orderRequest)) .assertThat() .hasStatus(HttpStatus.NOT_FOUND); }jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerIT.java (2)
72-92
: Potential confusion around 'getFirst()' usage.
The call to 'getFirst()' on a List may rely on custom extensions or libraries. If it's a helper method from the codebase, consider renaming it to avoid confusion with standard Java lists, which typically do not have a 'getFirst()' method.
97-119
: Validation of ID format seems hardcoded.
The test ensures the ID starts with "CUS" and has a set length of 8. This is fine if it's an intentional format. However, if ID generation might change later (e.g., longer IDs or different prefixes), consider a more adaptable check.jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerTest.java (2)
184-190
: Enhance test coverage for non-existing order update scenarioWhile the test correctly verifies the 404 response, it could be more robust by:
- Verifying that
orderService.updateOrderById
is never called- Using
orderService.updateOrderById
mock instead offindOrderById
to match the actual controller implementationConsider updating the test like this:
@Test void shouldReturn404WhenUpdatingNonExistingOrder() throws Exception { String orderId = "1"; - given(orderService.findOrderById(orderId)).willReturn(Optional.empty()); OrderRequest orderRequest = new OrderRequest("Updated text", customer.getId()); + given(orderService.updateOrderById(orderId, orderRequest)).willReturn(Optional.empty()); this.mockMvc .perform( put("/api/orders/{id}", orderId) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(orderRequest))) .andExpect(status().isNotFound()); + verify(orderService, times(1)).updateOrderById(orderId, orderRequest); }
Line range hint
1-220
: Consider adding additional test cases and improving test data managementThe test class is well-structured but could benefit from:
Additional validation test cases:
- Invalid customer ID in OrderRequest
- Maximum length validation for text
- Special character handling in text
Test data management improvements:
- Extract test data creation to builder methods
- Use test data factories for complex objects
Would you like me to provide example implementations for these improvements?
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java (3)
33-35
: Add debug logging for null ordersWhile the null check is a good defensive programming practice, consider adding debug logging to track when orders are null, as this might indicate unexpected scenarios in the request flow.
if (customerRequest.orders() == null) { + log.debug("No orders provided in customer request"); return customer; }
Line range hint
47-83
: Consider extracting order management logicThe order management logic is complex and handles multiple responsibilities:
- Removing orders
- Updating existing orders
- Adding new orders
Consider extracting these into separate methods for better maintainability and testability.
+ private void removeDeletedOrders(Customer customer, List<Order> removedOrders) { + for (Order removedOrder : removedOrders) { + customer.removeOrder(removedOrder); + } + } + + private void updateExistingOrders(Customer customer, List<Order> ordersFromRequest) { + for (Order existingOrder : ordersFromRequest) { + existingOrder.setCustomer(customer); + matchAndUpdateOrderId(customer, existingOrder); + Order mergedOrder = orderRepository.merge(existingOrder); + customer.getOrders().set(customer.getOrders().indexOf(mergedOrder), mergedOrder); + } + } + + private void matchAndUpdateOrderId(Customer customer, Order existingOrder) { + for (Order foundOrder : customer.getOrders()) { + if (foundOrder.getText().equals(existingOrder.getText())) { + existingOrder.setId(foundOrder.getId()); + break; + } + } + }
Line range hint
76-83
: Review concurrent modification safetyThe order repository merge operation could potentially lead to race conditions if multiple threads update the same order simultaneously. Consider:
- Adding appropriate transaction boundaries
- Using optimistic locking with version fields
- Implementing proper error handling for concurrent modifications
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/model/request/CustomerRequest.java (1)
8-9
: LGTM! Consider adding documentation for validation behavior.The validation setup looks good:
- @notblank correctly enforces non-empty, non-whitespace text
- @Valid ensures proper nested validation of OrderRequest objects
Consider adding Javadoc to document the validation behavior, especially how the nested validation works with different validation groups.
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/web/controllers/CustomerController.java (2)
65-66
: Document validation group behavior in createCustomer.The validation setup using {Default.class, ValidationGroups.SkipGroupCheck.class} implies that customerId validation is skipped during creation. Consider adding a comment explaining this behavior.
72-74
: Document validation group behavior in updateCustomer.The validation setup using {Default.class, ValidationGroups.GroupCheck.class} enforces customerId validation during updates. Consider adding a comment explaining why this differs from creation.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (21)
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/db/JpaConfig.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/db/LazyConnectionDataSourceProxyConfig.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/db/StringPrefixedNumberFormattedSequenceIdGenerator.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/db/StringPrefixedSequence.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/entities/Customer.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/entities/Order.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java
(2 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/model/request/CustomerRequest.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/model/request/OrderRequest.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/model/request/ValidationGroups.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/services/CustomerService.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/web/controllers/CustomerController.java
(3 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/web/controllers/OrderController.java
(3 hunks)jpa/boot-data-customsequence/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
(1 hunks)jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/SchemaValidationTest.java
(1 hunks)jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/common/AbstractIntegrationTest.java
(2 hunks)jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/services/CustomerServiceTest.java
(3 hunks)jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerIT.java
(2 hunks)jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java
(5 hunks)jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerIT.java
(2 hunks)jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerTest.java
(1 hunks)
✅ Files skipped from review due to trivial changes (9)
- jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/db/StringPrefixedSequence.java
- jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/model/request/ValidationGroups.java
- jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/entities/Order.java
- jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/SchemaValidationTest.java
- jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/entities/Customer.java
- jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/db/LazyConnectionDataSourceProxyConfig.java
- jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/db/JpaConfig.java
- jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/db/StringPrefixedNumberFormattedSequenceIdGenerator.java
- jpa/boot-data-customsequence/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
🧰 Additional context used
📓 Learnings (5)
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java (2)
Learnt from: rajadilipkolli
PR: rajadilipkolli/my-spring-boot-experiments#1592
File: jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java:51-51
Timestamp: 2024-12-22T12:38:14.485Z
Learning: Integration tests in CustomerControllerIT can showcase handling multiple OrderRequests (new, updated, removed) during customer creation or update scenarios.
Learnt from: rajadilipkolli
PR: rajadilipkolli/my-spring-boot-experiments#1592
File: jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java:51-51
Timestamp: 2024-12-22T12:22:30.684Z
Learning: Integration tests for CustomerController can showcase creation, update, and validation scenarios using "CustomerRequest" and verifying JSON fields in the response.
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/services/CustomerServiceTest.java (2)
Learnt from: rajadilipkolli
PR: rajadilipkolli/my-spring-boot-experiments#1592
File: jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java:51-51
Timestamp: 2024-12-22T12:38:14.485Z
Learning: Integration tests in CustomerControllerIT can showcase handling multiple OrderRequests (new, updated, removed) during customer creation or update scenarios.
Learnt from: rajadilipkolli
PR: rajadilipkolli/my-spring-boot-experiments#1592
File: jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java:51-51
Timestamp: 2024-12-22T12:22:30.684Z
Learning: Integration tests for CustomerController can showcase creation, update, and validation scenarios using "CustomerRequest" and verifying JSON fields in the response.
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/web/controllers/CustomerController.java (1)
Learnt from: rajadilipkolli
PR: rajadilipkolli/my-spring-boot-experiments#1592
File: jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java:51-51
Timestamp: 2024-12-22T12:22:30.684Z
Learning: Integration tests for CustomerController can showcase creation, update, and validation scenarios using "CustomerRequest" and verifying JSON fields in the response.
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java (2)
Learnt from: rajadilipkolli
PR: rajadilipkolli/my-spring-boot-experiments#1592
File: jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java:51-51
Timestamp: 2024-12-22T12:38:14.485Z
Learning: Integration tests in CustomerControllerIT can showcase handling multiple OrderRequests (new, updated, removed) during customer creation or update scenarios.
Learnt from: rajadilipkolli
PR: rajadilipkolli/my-spring-boot-experiments#1592
File: jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java:51-51
Timestamp: 2024-12-22T12:22:30.684Z
Learning: Integration tests for CustomerController can showcase creation, update, and validation scenarios using "CustomerRequest" and verifying JSON fields in the response.
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerIT.java (1)
Learnt from: rajadilipkolli
PR: rajadilipkolli/my-spring-boot-experiments#1592
File: jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java:51-51
Timestamp: 2024-12-22T12:38:14.485Z
Learning: Integration tests in CustomerControllerIT can showcase handling multiple OrderRequests (new, updated, removed) during customer creation or update scenarios.
🔇 Additional comments (19)
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/services/CustomerService.java (1)
80-84
: Well-designed implementation with improved error handling!
The refactored deleteCustomerById
method is a significant improvement:
- Returns customer details before deletion, enabling better client-side handling
- Leverages Optional for null-safe operations
- Maintains transactional integrity
- Follows DRY principle by reusing
findCustomerById
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/common/AbstractIntegrationTest.java (1)
12-12
: LGTM!
The import for MockMvcTester is appropriate for the enhanced testing capabilities being introduced.
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java (2)
19-19
: LGTM!
The import is correctly added to support the new order-related test cases.
219-222
: LGTM!
The test cases have been correctly updated to handle the new response type from deleteCustomerById
. The assertions properly verify both successful and not-found scenarios.
Also applies to: 227-227, 233-233
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerIT.java (1)
53-205
: Well-structured tests with good coverage!
The migration to mockMvcTester
improves test readability and maintainability. The tests cover both success and error scenarios with thorough validation checks. The fluent assertion style makes the test intentions clear.
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerIT.java (6)
3-23
: Imports look consistent and necessary.
No issues found with these imports. They align well with the test context, referencing request/response, SQL validation, and problem detail classes.
40-41
: Resetting SQLStatementCountValidator at setup is a good practice.
Ensures a clean slate for SQL statement validation and avoids cross-contamination across tests.
45-68
: Comprehensive coverage for 'shouldFetchAllCustomers'.
This test verifies the pagination metadata precisely and checks the overall structure. It’s a clear, readable test scenario.
124-164
: Invalid content test is well-structured.
The check for missing 'text' and the resulting ProblemDetail structure is verified thoroughly. This promotes clear validation coverage.
170-256
: Good use of SQLStatementCountValidator for multiple updates and inserts.
The incremental approach of adding orders and testing the sequence of insert/update/delete statements is well-structured. Ensures the correct number of queries are triggered for each bulk operation.
260-282
: Deletion test accurately verifies final repository state.
Ensures the customer is indeed removed and checks the relevant SQL statements (select, delete). Test coverage is robust here.
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/web/controllers/OrderController.java (3)
4-4
: LGTM! Necessary imports for validation groups
The added imports support the enhanced validation mechanism using validation groups.
Also applies to: 9-9
68-70
: Consider if update operations need different validation rules
While the validation is consistent with the create operation, consider if update operations might have different validation requirements (e.g., certain fields that are mandatory during creation might be optional during updates).
Let's check if there are any existing examples of different validation rules for updates:
✅ Verification successful
Based on the analysis of the codebase, I can now generate the final response:
Validation approach is appropriate for both create and update operations
The current validation setup using @Validated(value = {Default.class, ValidationGroups.GroupCheck.class})
is appropriate for both create and update operations because:
-
The
OrderRequest
validation constraints are fundamental data requirements that should be enforced regardless of operation type:text
field must not be blank (Default group)customerId
must not be blank (GroupCheck group)
-
The codebase shows a consistent pattern where both create and update operations require the same level of data integrity, as evidenced by the same validation groups being used in both operations.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for other controllers using different validation groups for updates
rg -A 5 '@PutMapping.*@Validated.*ValidationGroups'
# Search for any validation annotations with groups specifically for updates
rg -A 2 '@.*groups.*Update'
Length of output: 83
Script:
#!/bin/bash
# Let's first check the ValidationGroups class to understand available validation groups
fd -e java ValidationGroups --exec cat {}
# Check all usages of @Validated annotation in the codebase
rg -B 2 -A 2 '@Validated'
# Look for any validation constraints in OrderRequest
fd OrderRequest.java --exec cat {}
Length of output: 37872
58-59
: LGTM! Enhanced validation with validation groups
The addition of validation groups provides more granular control over validation rules during order creation.
Let's verify the implementation of ValidationGroups:
✅ Verification successful
Validation groups implementation is correctly used
The validation setup is properly implemented:
ValidationGroups.GroupCheck
is a marker interface used for group validationOrderRequest
correctly applies the group validation tocustomerId
field- The controller's
@Validated
annotation properly includes bothDefault.class
andValidationGroups.GroupCheck.class
- This ensures
customerId
validation is only enforced whenGroupCheck
is specified, whiletext
field validation remains part of default validation
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for ValidationGroups implementation and usage
ast-grep --pattern 'interface ValidationGroups {
$$$
interface GroupCheck {
$$$
}
$$$
}'
# Search for fields using the GroupCheck validation group
rg -A 2 '@.*groups.*ValidationGroups.GroupCheck'
Length of output: 153
Script:
#!/bin/bash
# Let's first find the ValidationGroups file
fd ValidationGroups
# Search for any interface containing GroupCheck
ast-grep --pattern 'interface $_ {
$$$
interface GroupCheck
$$$
}'
# Search for any class/field annotations with GroupCheck
rg "GroupCheck" -A 2
Length of output: 3101
Script:
#!/bin/bash
# Let's check the OrderRequest class to see how GroupCheck is used in validation
cat "jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/model/request/OrderRequest.java"
# Let's also check the ValidationGroups interface implementation
cat "jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/model/request/ValidationGroups.java"
Length of output: 756
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerTest.java (1)
Line range hint 1-220
: Verify consistency with CustomerControllerTest changes
The AI summary mentions related changes in CustomerControllerTest. Let's ensure consistency in how orders are handled across both test classes.
✅ Verification successful
No inconsistencies found between test classes
After reviewing the CustomerControllerTest, I can confirm that both test classes are consistent in their handling of orders and validation patterns:
- Both use similar validation patterns with
andExpect(status())
assertions - OrderRequest/OrderResponse usage is consistent across both classes
- Error handling and HTTP status codes are aligned
- Both follow the same test structure and patterns for CRUD operations
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check consistency between OrderControllerTest and CustomerControllerTest
# Find and display all test methods in CustomerControllerTest that handle orders
echo "Checking order-related test methods in CustomerControllerTest:"
rg -A 5 "OrderRequest|OrderResponse" "$(dirname "$0")/CustomerControllerTest.java"
# Check for consistent validation patterns
echo "Checking validation patterns:"
rg "\.andExpect\(status\(\)" "$(dirname "$0")/CustomerControllerTest.java"
Length of output: 619
Script:
#!/bin/bash
# Let's first find the correct path to CustomerControllerTest.java
fd -t f "CustomerControllerTest.java"
# Then check for order-related test methods and validation patterns
echo "Checking order-related methods and validation patterns:"
fd -t f "CustomerControllerTest.java" -x rg -A 5 "OrderRequest|OrderResponse|\.andExpect\(status\(\))" {}
Length of output: 2930
Script:
#!/bin/bash
# Let's check the specific CustomerControllerTest in the same module as OrderControllerTest
echo "Checking CustomerControllerTest content:"
rg -A 5 "OrderRequest|OrderResponse" "jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java"
echo -e "\nChecking validation patterns:"
rg "\.andExpect\(status\(\))" "jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java"
Length of output: 1729
Script:
#!/bin/bash
# Let's fix the regex and get a complete view of the CustomerControllerTest
echo "Checking complete CustomerControllerTest content:"
cat "jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java"
Length of output: 11618
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java (1)
44-46
: Clarify behavior for null orders during update
The current implementation silently preserves existing orders when the request contains null orders. This might lead to unexpected behavior. Consider either:
- Explicitly documenting this behavior
- Clearing existing orders when null is provided
- Rejecting updates with null orders
Let's verify the current behavior in tests:
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/model/request/OrderRequest.java (1)
6-10
: Verify ValidationGroups implementation and document validation behavior.
The validation setup looks good, but let's ensure proper implementation:
- The switch from @notempty to @notblank for text is appropriate
- The group-specific validation for customerId aligns with the controller's usage
Let's verify the ValidationGroups implementation:
Consider adding Javadoc to document:
- When GroupCheck validation is applied
- The difference between Default and GroupCheck validation scenarios
✅ Verification successful
ValidationGroups implementation is correct and properly used across the codebase
The validation setup is well-implemented:
- ValidationGroups interface exists with both GroupCheck and SkipGroupCheck interfaces
- The validation groups are consistently used across controllers:
- OrderController uses GroupCheck for create/update operations
- CustomerController uses SkipGroupCheck for creation and GroupCheck for updates
- The @notblank with GroupCheck on customerId in OrderRequest aligns with the controller's validation setup
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check if ValidationGroups interface exists and is properly defined
ast-grep --pattern 'interface ValidationGroups {
$$$
interface GroupCheck {
$$$
}
$$$
}'
Length of output: 102
Script:
#!/bin/bash
# Let's try a broader search for ValidationGroups
rg -l "ValidationGroups"
# If found, let's see the implementation
rg -A 5 "ValidationGroups"
# Also search for group validation usage in controllers
ast-grep --pattern '@$_($$$, groups = ValidationGroups.GroupCheck.class)'
Length of output: 7593
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/web/controllers/CustomerController.java (2)
84-85
: LGTM! Improved error handling for delete operation.
The change to handle Optional response improves the REST API behavior by properly distinguishing between successful deletions and not-found cases.
Line range hint 1-87
: Verify test coverage for validation scenarios.
Based on the retrieved learning about integration tests, let's verify the test coverage:
✅ Verification successful
Test coverage for validation scenarios is adequate
The test file shows comprehensive validation test coverage including:
- Empty/null text field validation (
shouldReturn400WhenCreateNewCustomerWithoutText
,shouldReturn400WhenCreateNewCustomerWithEmptyText
) - Invalid order data validation (
shouldReturn400WhenUpdateCustomerWithEmpty
) - Proper error response structure verification including status codes, content type headers, and detailed violation messages
- Both create and update endpoint validation scenarios
The tests verify the validation groups functionality indirectly through the validation scenarios, checking both the Default group constraints and custom validation groups (SkipGroupCheck, GroupCheck) as defined in the controller.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for test coverage of validation scenarios
rg -A 5 "class.*CustomerControllerIT|class.*CustomerControllerTest"
# Look for validation test cases
ast-grep --pattern '@Test
$$$
void test$_($$) {
$$$
.perform(post("/api/customers")$$$)
$$$
}'
Length of output: 18035
Script:
#!/bin/bash
# Let's check the test file content for validation test cases in the specific module
rg -l "CustomerControllerTest" jpa/boot-data-customsequence/
rg -A 10 "void test.*Customer.*Request" jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java
# Check validation groups usage in tests
rg -A 5 "ValidationGroups" jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/
Length of output: 447
Script:
#!/bin/bash
# Let's check the actual test file content
cat jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java
# Also check for any test data builders or test utilities that might be used for validation tests
rg -l "TestData|Builder" jpa/boot-data-customsequence/src/test/
Length of output: 11899
return new CustomerRequest("junitTest", List.of(new OrderRequest("ORD_1", "junitTest"))); | ||
} | ||
|
||
private CustomerResponse getCustomerResponse() { | ||
return new CustomerResponse("CUS_1", "junitTest", List.of()); | ||
return new CustomerResponse( | ||
"CUS_1", | ||
"junitTest", | ||
List.of(new OrderResponseWithOutCustomer("ORD_1", "junitTest"))); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Enhance test coverage for order-related data
While the helper methods now include order data, the test methods saveCustomer
and findCustomerById
don't verify this data in their assertions. This could miss potential mapping issues with the order-related fields.
Example enhancement for saveCustomer test:
// then
assertThat(persistedCustomer).isNotNull();
assertThat(persistedCustomer.id()).isEqualTo("CUS_1");
assertThat(persistedCustomer.text()).isEqualTo("junitTest");
+assertThat(persistedCustomer.orders())
+ .hasSize(1)
+ .element(0)
+ .satisfies(order -> {
+ assertThat(order.id()).isEqualTo("ORD_1");
+ assertThat(order.text()).isEqualTo("junitTest");
+ });
Similar assertions should be added to the findCustomerById
test.
Committable suggestion skipped: line range outside the PR's diff.
...tomsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerIT.java
Outdated
Show resolved
Hide resolved
Qodana Community for JVM101 new problems were found
☁️ View the detailed Qodana report Contact Qodana teamContact us at [email protected]
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🔭 Outside diff range comments (1)
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/entities/Order.java (1)
Line range hint
67-81
: Review equals and hashCode implementationThe current equals implementation:
- Correctly uses Hibernate.getClass() for proxy handling
- Compares text and customer.getId()
- However, it might throw NPE if customer is null
The hashCode implementation only uses the class hashCode, which might lead to poor hash distribution.
Consider this improved implementation:
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false; Order order = (Order) o; - return Objects.equals(text, order.text) - && Objects.equals(customer.getId(), order.customer.getId()); + return Objects.equals(text, order.text) + && (customer == null ? order.customer == null + : order.customer != null && Objects.equals(customer.getId(), order.customer.getId())); } @Override public int hashCode() { - return getClass().hashCode(); + return Objects.hash(text, customer != null ? customer.getId() : null); }
🧹 Nitpick comments (5)
README.md (1)
40-40
: Approve with minor formatting suggestionsThe updated description accurately reflects the new features. However, consider restructuring it for better readability:
-| [Custom SequenceNumber and LazyConnectionDataSourceProxy for db connection improvement](./jpa/boot-data-customsequence) | This application, demonstrated ability to create custom sequences, using datasource-proxy, LazyConnectionDataSourceProxy for db connection improvement using mariadb, SQLStatementCountValidator for validating SQLCounts and ValidationGroups for dynamic Validation | Completed | +| [Custom SequenceNumber and LazyConnectionDataSourceProxy for db connection improvement](./jpa/boot-data-customsequence) | This application demonstrates: + - Custom sequence generation + - Database connection optimization using datasource-proxy and LazyConnectionDataSourceProxy with MariaDB + - SQL query validation using SQLStatementCountValidator + - Dynamic validation using ValidationGroups | Completed |jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/Initializer.java (1)
14-16
: Consider adding null validation in constructorWhile the constructor implementation is correct, consider adding a null check for the
properties
parameter to fail fast if the dependency is not properly injected.public Initializer(ApplicationProperties properties) { + if (properties == null) { + throw new IllegalArgumentException("ApplicationProperties must not be null"); + } this.properties = properties; }jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/entities/Order.java (2)
44-47
: Consider adding validation in settersThe setters implement the builder pattern correctly by returning 'this'. However, consider adding validation:
setText
: Validate for null/empty text since the column is marked asnullable = false
setCustomer
: Validate customer is not null for the many-to-one relationshipExample implementation:
public Order setText(String text) { + if (text == null || text.trim().isEmpty()) { + throw new IllegalArgumentException("Text cannot be null or empty"); + } this.text = text; return this; } public Order setCustomer(Customer customer) { + if (customer == null) { + throw new IllegalArgumentException("Customer cannot be null"); + } this.customer = customer; return this; }Also applies to: 53-56, 62-65
Line range hint
16-17
: Consider adding class-level documentationSince this is a core domain entity, consider adding Javadoc to document:
- The purpose and responsibility of the Order entity
- The relationship with Customer
- The format and generation strategy of the ID
Example:
/** * Represents an order in the system. * The ID is auto-generated using a custom sequence with a string prefix. * Each order belongs to a {@link Customer} through a many-to-one relationship. */ @Entity @Table(name = "orders")jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/ApplicationProperties.java (1)
11-17
: Consider adding null check in setCorsWhile the getter/setter implementation is correct, consider adding a null check in the setter to prevent potential NPEs:
public void setCors(Cors cors) { + if (cors == null) { + throw new IllegalArgumentException("Cors configuration cannot be null"); + } this.cors = cors; }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (10)
README.md
(1 hunks)jpa/boot-data-customsequence/pom.xml
(0 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/ApplicationProperties.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/Initializer.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/WebMvcConfig.java
(1 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/entities/Customer.java
(2 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/entities/Order.java
(2 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/web/controllers/CustomerController.java
(3 hunks)jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/web/controllers/OrderController.java
(3 hunks)jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerTest.java
(2 hunks)
💤 Files with no reviewable changes (1)
- jpa/boot-data-customsequence/pom.xml
🚧 Files skipped from review as they are similar to previous changes (4)
- jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerTest.java
- jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/web/controllers/OrderController.java
- jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/entities/Customer.java
- jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/web/controllers/CustomerController.java
🔇 Additional comments (7)
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/WebMvcConfig.java (1)
12-14
: LGTM! Good move replacing Lombok with explicit constructor.
The explicit constructor implementation is clean and follows best practices. This change improves code clarity and reduces magic by making the dependency injection more explicit.
Let's verify the ApplicationProperties import after the package restructuring:
✅ Verification successful
Based on the shell script results, I can see that:
- The
ApplicationProperties
class exists in the correct location:jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/ApplicationProperties.java
- The class is properly imported and used in:
CustomSeqApplication.java
with@EnableConfigurationProperties({ApplicationProperties.class})
WebMvcConfig.java
where it's injected via constructorInitializer.java
where it's also used
LGTM! The ApplicationProperties import and usage are correctly maintained after package restructuring.
The explicit constructor implementation is clean and follows best practices. The ApplicationProperties dependency is properly configured and used throughout the application.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify ApplicationProperties import and usage after package restructuring
# Expected: Find ApplicationProperties in new location and any references to it
# Find ApplicationProperties class location
echo "Finding ApplicationProperties class location:"
fd -e java -x grep -l "class ApplicationProperties"
# Find all references to ApplicationProperties
echo -e "\nFinding all references to ApplicationProperties:"
rg "ApplicationProperties" -t java
Length of output: 28709
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/Initializer.java (2)
3-4
: LGTM: Logger initialization follows best practices
The explicit SLF4J logger initialization is correctly implemented, following standard Java practices for logger declaration.
Also applies to: 11-11
1-1
: Verify package location consistency
Given the broader package restructuring effort moving configuration classes to config.db
, verify if this initializer should also be moved to maintain consistency.
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/entities/Order.java (2)
32-38
: LGTM: Well-structured constructors
The constructors are well-implemented:
- Default constructor for JPA
- Parameterized constructor with all fields
3-3
: Verify the impact of package restructuring
The import path change suggests a package restructuring. Let's verify that all references to StringPrefixedSequence
have been updated consistently.
✅ Verification successful
Let me verify the usage of StringPrefixedSequence
in the actual code to ensure complete consistency.
Package restructuring has been consistently applied
The import path change from config.StringPrefixedSequence
to config.db.StringPrefixedSequence
has been properly reflected across all usages in the codebase. Both Order.java
and Customer.java
are using the correct import path, and the annotation is properly defined in its new location under the config.db
package.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify all usages of StringPrefixedSequence are using the new package path
# Search for any old import statements that might have been missed
rg "import.*StringPrefixedSequence" --type java
# Search for any usage of StringPrefixedSequence annotation
ast-grep --pattern '@StringPrefixedSequence'
Length of output: 417
Script:
#!/bin/bash
# Search for any usage of StringPrefixedSequence in code
rg "StringPrefixedSequence" -B 2 -A 2 --type java
Length of output: 4185
jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/config/ApplicationProperties.java (2)
4-4
: LGTM! Good use of @NestedConfigurationProperty
The addition of @NestedConfigurationProperty is appropriate here as it properly indicates to Spring Boot that this is a nested configuration property, enabling proper metadata generation and relaxed binding.
Also applies to: 9-9
26-64
: Review security implications of permissive CORS defaults
While the getter/setter implementations are correct, the default values ("*"
) for allowedMethods
, allowedHeaders
, and allowedOriginPatterns
are very permissive. This could potentially expose your application to security risks if not properly configured in production.
Consider:
- Using more restrictive defaults
- Adding validation in setters to prevent potentially dangerous values
- Adding clear documentation about security implications
- Ensuring different profiles (dev/prod) have appropriate CORS settings
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
🧹 Nitpick comments (7)
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java (3)
119-121
: Consider adding test for multiple orders validationWhile the current test validates a single invalid order, consider adding a test case with multiple orders to ensure the validation works correctly for bulk operations. This aligns with the learning from previous PR that suggests testing multiple OrderRequests scenarios.
Example:
CustomerRequest customerRequest = new CustomerRequest( null, List.of( new OrderRequest("ORD_1", null), new OrderRequest("ORD_2", "") ) );
186-206
: Consider improving test name and adding edge casesThe test effectively validates order constraints, but consider:
- Renaming the test to be more specific, e.g.,
shouldReturn400WhenUpdateCustomerWithEmptyOrderCustomerId
- Adding test cases for other validation scenarios:
- Empty order list
- Order with empty orderId
- Multiple orders with mixed valid/invalid customerIds
226-234
: Consider adding explicit assertion for empty orders listWhile the test correctly validates the basic response, consider adding an explicit assertion for the empty orders list to ensure complete response validation:
this.mockMvc .perform(delete("/api/customers/{id}", customerId)) .andExpect(status().isOk()) - .andExpect(jsonPath("$.text", is(customerResponse.text()))); + .andExpect(jsonPath("$.text", is(customerResponse.text()))) + .andExpect(jsonPath("$.orderResponses", hasSize(0)));jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerIT.java (4)
53-73
: LGTM with a suggestion for enhanced validation!The test provides comprehensive coverage of pagination metadata. Consider adding assertions for the actual content of the orders to ensure the data integrity.
pagedResult -> { assertThat(pagedResult.data()).hasSize(3); + assertThat(pagedResult.data()) + .extracting("text") + .containsExactlyInAnyOrder("First Order", "Second Order", "Third Order"); assertThat(pagedResult.totalElements()).isEqualTo(3);
77-93
: Consider adding a test for non-existent order ID.While the happy path is well tested, consider adding a companion test method to verify 404 response for non-existent order IDs.
@Test void shouldReturn404WhenFetchingNonExistentOrder() { this.mockMvcTester .get() .uri("/api/orders/{id}", "NON_EXISTENT_ID") .assertThat() .hasStatus(HttpStatus.NOT_FOUND); }
118-151
: Consider simplifying validation error assertions.The current implementation uses complex type casting and nested structure validation. Consider creating a custom assertion method or using a more type-safe approach.
// Create a helper method in the test class private void assertValidationError(ProblemDetail problem, String field, String message) { assertThat(problem.getTitle()).isEqualTo("Constraint Violation"); assertThat(problem.getStatus()).isEqualTo(400); List<?> violations = (List<?>) problem.getProperties().get("violations"); assertThat(violations) .hasSize(1) .first() .asInstanceOf(LinkedHashMap.class) .satisfies(violation -> { assertThat(violation.get("field")).isEqualTo(field); assertThat(violation.get("message")).isEqualTo(message); }); }
176-199
: Consider more descriptive test method names.The current method names could better describe the specific scenarios being tested.
- void shouldReturn400WhenUpdatingOrderWithInvalidCustomerId() + void shouldReturn404WhenUpdatingOrderWithNonExistentCustomerId() - void shouldReturn404WhenUpdatingNonExistentOrder() + void shouldReturn404WhenUpdatingOrderWithNonExistentOrderId()
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
README.md
(1 hunks)jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/services/CustomerServiceTest.java
(3 hunks)jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java
(5 hunks)jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerIT.java
(2 hunks)jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerTest.java
(3 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerTest.java
- jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/services/CustomerServiceTest.java
🧰 Additional context used
📓 Learnings (1)
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java (1)
Learnt from: rajadilipkolli
PR: rajadilipkolli/my-spring-boot-experiments#1592
File: jpa/boot-data-customsequence/src/main/java/com/example/custom/sequence/mapper/CustomerMapper.java:51-51
Timestamp: 2024-12-22T12:38:14.485Z
Learning: Integration tests in CustomerControllerIT can showcase handling multiple OrderRequests (new, updated, removed) during customer creation or update scenarios.
🪛 Markdownlint (0.37.0)
README.md
40-40: Expected: leading_and_trailing; Actual: leading_only; Missing trailing pipe
Table pipe style
(MD055, table-pipe-style)
41-41: Expected: leading_and_trailing; Actual: no_leading_or_trailing; Missing leading pipe
Table pipe style
(MD055, table-pipe-style)
41-41: Expected: leading_and_trailing; Actual: no_leading_or_trailing; Missing trailing pipe
Table pipe style
(MD055, table-pipe-style)
42-42: Expected: leading_and_trailing; Actual: no_leading_or_trailing; Missing leading pipe
Table pipe style
(MD055, table-pipe-style)
42-42: Expected: leading_and_trailing; Actual: no_leading_or_trailing; Missing trailing pipe
Table pipe style
(MD055, table-pipe-style)
43-43: Expected: leading_and_trailing; Actual: trailing_only; Missing leading pipe
Table pipe style
(MD055, table-pipe-style)
40-40: Expected: 3; Actual: 2; Too few cells, row will be missing data
Table column count
(MD056, table-column-count)
41-41: Expected: 3; Actual: 1; Too few cells, row will be missing data
Table column count
(MD056, table-column-count)
42-42: Expected: 3; Actual: 1; Too few cells, row will be missing data
Table column count
(MD056, table-column-count)
43-43: Expected: 3; Actual: 2; Too few cells, row will be missing data
Table column count
(MD056, table-column-count)
🔇 Additional comments (5)
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/CustomerControllerTest.java (3)
19-21
: LGTM! Imports align with new order-related functionality
The new imports for OrderRequest and OrderResponseWithOutCustomer support the integration of order validation in customer operations.
Line range hint 165-184
: LGTM! Comprehensive test coverage for customer update with orders
The test effectively validates both customer and order data in the response, with proper assertions for nested order details.
240-240
: LGTM! Properly handles Optional return type
The test correctly adapts to the new service method signature returning Optional.
jpa/boot-data-customsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerIT.java (2)
203-222
: LGTM - Good implementation of database verification!
The test properly verifies both the API response and the database state after deletion.
154-172
: 🛠️ Refactor suggestion
Verify the database update.
The test verifies the response but doesn't confirm that the order was actually updated in the database.
orderResponse -> {
assertThat(orderResponse.id()).isEqualTo(order.getId());
assertThat(orderResponse.text()).isEqualTo(orderRequest.text());
});
+ // Verify order is updated in database
+ Order updatedOrder = orderRepository.findById(order.getId()).orElseThrow();
+ assertThat(updatedOrder.getText()).isEqualTo(orderRequest.text());
Likely invalid or redundant comment.
...tomsequence/src/test/java/com/example/custom/sequence/web/controllers/OrderControllerIT.java
Show resolved
Hide resolved
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Quality Gate failedFailed conditions |
Summary by CodeRabbit
New Features
Bug Fixes
Tests