From 978fa09ec366f10752100820450033ada7575e53 Mon Sep 17 00:00:00 2001 From: Devon Hillard Date: Fri, 14 Aug 2026 23:43:46 -0600 Subject: [PATCH 1/4] chore: remove vestigial root test-data.sql The three event rows it inserted are already seeded by src/main/resources/data-local.sql (INSERT IGNORE INTO events), which is what the local and playwright-test profiles actually load. Nothing in the build, application config, workflows, or Playwright suite referenced test-data.sql. --- test-data.sql | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 test-data.sql diff --git a/test-data.sql b/test-data.sql deleted file mode 100644 index d9eec15..0000000 --- a/test-data.sql +++ /dev/null @@ -1,5 +0,0 @@ -INSERT INTO events (name, description, location, date, time) -VALUES - ('Tech Conference 2024', 'A conference about the latest in tech.', 'San Francisco, CA', '2025-06-15', '10:00:00'), - ('Spring Boot Workshop', 'Learn Spring Boot from experts.', 'New York, NY', '2025-07-10', '14:00:00'), - ('AI Symposium', 'Exploring the advancements in AI.', 'Los Angeles, CA', '2026-08-22', '09:30:00'); From b7cde3fe6cae827e3e4783bafbeb895aeab2a88d Mon Sep 17 00:00:00 2001 From: Devon Hillard Date: Fri, 14 Aug 2026 23:43:59 -0600 Subject: [PATCH 2/4] chore: move auxiliary docs under docs/ HELP.md (Spring Initializr boilerplate) and TEST-ANALYSIS.md (a one-off test triage report) are reference material, not entry points, so they move out of the root listing. README.md, CHANGELOG.md, CONFIG.md, CLAUDE.md and LICENSE stay at root: the first three are linked from the README and are the docs external links land on, and Claude Code reads CLAUDE.md at root. The 18 @Disabled annotations in src/test that point readers at TEST-ANALYSIS.md now say docs/TEST-ANALYSIS.md. --- HELP.md => docs/HELP.md | 0 TEST-ANALYSIS.md => docs/TEST-ANALYSIS.md | 0 .../digitalsanctuary/spring/user/api/ApiSecurityTest.java | 2 +- .../user/api/AuthenticatedUserApiTestSimplified.java | 2 +- .../spring/user/api/PasswordResetApiTest.java | 2 +- .../spring/user/api/PasswordResetApiTestSimplified.java | 2 +- .../spring/user/api/PasswordResetCompletionTest.java | 2 +- .../com/digitalsanctuary/spring/user/api/UserApiTest.java | 8 ++++---- .../user/api/UserRegistrationComprehensiveTest.java | 2 +- .../spring/user/api/UserRegistrationCoreTest.java | 2 +- .../spring/user/api/UserRegistrationEdgeCaseTest.java | 2 +- .../spring/user/concurrent/AdminUserManagementTest.java | 2 +- .../user/integration/AuthenticationIntegrationTest.java | 2 +- .../user/integration/SecurityConfigurationTest.java | 2 +- .../spring/user/oauth2/GoogleOAuth2IntegrationTest.java | 2 +- .../spring/user/security/AuditLoggingIntegrationTest.java | 2 +- .../user/security/EmailVerificationEdgeCaseTest.java | 2 +- 17 files changed, 18 insertions(+), 18 deletions(-) rename HELP.md => docs/HELP.md (100%) rename TEST-ANALYSIS.md => docs/TEST-ANALYSIS.md (100%) diff --git a/HELP.md b/docs/HELP.md similarity index 100% rename from HELP.md rename to docs/HELP.md diff --git a/TEST-ANALYSIS.md b/docs/TEST-ANALYSIS.md similarity index 100% rename from TEST-ANALYSIS.md rename to docs/TEST-ANALYSIS.md diff --git a/src/test/java/com/digitalsanctuary/spring/user/api/ApiSecurityTest.java b/src/test/java/com/digitalsanctuary/spring/user/api/ApiSecurityTest.java index 00f67d6..0bdc112 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/api/ApiSecurityTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/api/ApiSecurityTest.java @@ -44,7 +44,7 @@ @ActiveProfiles("test") @Transactional @DisplayName("API Security Tests") -@Disabled("CSRF and authentication setup issues with REST API. See TEST-ANALYSIS.md") +@Disabled("CSRF and authentication setup issues with REST API. See docs/TEST-ANALYSIS.md") class ApiSecurityTest { private static final String API_BASE_PATH = "/user"; diff --git a/src/test/java/com/digitalsanctuary/spring/user/api/AuthenticatedUserApiTestSimplified.java b/src/test/java/com/digitalsanctuary/spring/user/api/AuthenticatedUserApiTestSimplified.java index c8d8790..47e8013 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/api/AuthenticatedUserApiTestSimplified.java +++ b/src/test/java/com/digitalsanctuary/spring/user/api/AuthenticatedUserApiTestSimplified.java @@ -47,7 +47,7 @@ @ActiveProfiles("test") @Transactional @DisplayName("Authenticated User API Tests - Simplified") -@Disabled("Authentication setup issues with DSUserDetails. See TEST-ANALYSIS.md") +@Disabled("Authentication setup issues with DSUserDetails. See docs/TEST-ANALYSIS.md") class AuthenticatedUserApiTestSimplified { private static final String API_BASE_PATH = "/user"; diff --git a/src/test/java/com/digitalsanctuary/spring/user/api/PasswordResetApiTest.java b/src/test/java/com/digitalsanctuary/spring/user/api/PasswordResetApiTest.java index df85c71..af31683 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/api/PasswordResetApiTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/api/PasswordResetApiTest.java @@ -58,7 +58,7 @@ @ActiveProfiles("test") @Transactional @DisplayName("Password Reset API Tests") -@Disabled("Password reset token workflow and email handling issues. See TEST-ANALYSIS.md") +@Disabled("Password reset token workflow and email handling issues. See docs/TEST-ANALYSIS.md") class PasswordResetApiTest { private static final String RESET_PASSWORD_URL = "/user/resetPassword"; diff --git a/src/test/java/com/digitalsanctuary/spring/user/api/PasswordResetApiTestSimplified.java b/src/test/java/com/digitalsanctuary/spring/user/api/PasswordResetApiTestSimplified.java index 9139e9b..d207e46 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/api/PasswordResetApiTestSimplified.java +++ b/src/test/java/com/digitalsanctuary/spring/user/api/PasswordResetApiTestSimplified.java @@ -42,7 +42,7 @@ @ActiveProfiles("test") @Transactional @DisplayName("Password Reset API Tests - Simplified") -@Disabled("Validation expectations don't match API behavior. See TEST-ANALYSIS.md") +@Disabled("Validation expectations don't match API behavior. See docs/TEST-ANALYSIS.md") class PasswordResetApiTestSimplified { private static final String RESET_PASSWORD_URL = "/user/resetPassword"; diff --git a/src/test/java/com/digitalsanctuary/spring/user/api/PasswordResetCompletionTest.java b/src/test/java/com/digitalsanctuary/spring/user/api/PasswordResetCompletionTest.java index 473071e..7c82a58 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/api/PasswordResetCompletionTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/api/PasswordResetCompletionTest.java @@ -40,7 +40,7 @@ @ActiveProfiles("test") @Transactional @DisplayName("Password Reset Completion Tests") -@Disabled("Password reset completion workflow issues. See TEST-ANALYSIS.md") +@Disabled("Password reset completion workflow issues. See docs/TEST-ANALYSIS.md") class PasswordResetCompletionTest { private static final String SAVE_PASSWORD_URL = "/user/savePassword"; diff --git a/src/test/java/com/digitalsanctuary/spring/user/api/UserApiTest.java b/src/test/java/com/digitalsanctuary/spring/user/api/UserApiTest.java index d03f7f0..8223913 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/api/UserApiTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/api/UserApiTest.java @@ -78,7 +78,7 @@ public class UserApiTest { @ParameterizedTest @ArgumentsSource(ApiTestRegistrationArgumentsProvider.class) @Order(1) - @Disabled("Transaction isolation issue - user created in test setup not visible to REST endpoint. See TEST-ANALYSIS.md") + @Disabled("Transaction isolation issue - user created in test setup not visible to REST endpoint. See docs/TEST-ANALYSIS.md") // correctly run separately public void registerUserAccount(ApiTestArgumentsHolder argumentsHolder) throws Exception { UserDto userDto = argumentsHolder.getUserDto(); @@ -138,7 +138,7 @@ public void resetPassword() throws Exception { @ParameterizedTest @ArgumentsSource(ApiTestUpdateUserArgumentsProvider.class) @Order(3) - @Disabled("Spring Security returns empty 401 response instead of JSON error. See TEST-ANALYSIS.md") + @Disabled("Spring Security returns empty 401 response instead of JSON error. See docs/TEST-ANALYSIS.md") public void updateUser(ApiTestArgumentsHolder argumentsHolder) throws Exception { // Ensure user exists if (userService.findUserByEmail(argumentsHolder.getUserDto().getEmail()) == null) { @@ -169,7 +169,7 @@ public void updateUser(ApiTestArgumentsHolder argumentsHolder) throws Exception @ParameterizedTest @ArgumentsSource(ApiTestUpdatePasswordArgumentsProvider.class) @Order(4) - @Disabled("Authentication setup issues with DSUserDetails. See TEST-ANALYSIS.md") + @Disabled("Authentication setup issues with DSUserDetails. See docs/TEST-ANALYSIS.md") public void updatePassword(ApiTestArgumentsHolder argumentsHolder) throws Exception { // Ensure user exists if (userService.findUserByEmail(baseTestUser.getEmail()) == null) { @@ -194,7 +194,7 @@ public void updatePassword(ApiTestArgumentsHolder argumentsHolder) throws Except @ParameterizedTest @ArgumentsSource(ApiTestDeleteAccountArgumentsProvider.class) @Order(5) - @Disabled("Authentication setup issues with DSUserDetails. See TEST-ANALYSIS.md") + @Disabled("Authentication setup issues with DSUserDetails. See docs/TEST-ANALYSIS.md") public void deleteAccount(ApiTestArgumentsHolder argumentsHolder) throws Exception { // Ensure user exists if (userService.findUserByEmail(baseTestUser.getEmail()) == null) { diff --git a/src/test/java/com/digitalsanctuary/spring/user/api/UserRegistrationComprehensiveTest.java b/src/test/java/com/digitalsanctuary/spring/user/api/UserRegistrationComprehensiveTest.java index cf91b27..2dd920d 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/api/UserRegistrationComprehensiveTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/api/UserRegistrationComprehensiveTest.java @@ -48,7 +48,7 @@ @ActiveProfiles("test") @Transactional @DisplayName("Comprehensive User Registration API Tests") -@Disabled("Validation error response expectations don't match API behavior. See TEST-ANALYSIS.md") +@Disabled("Validation error response expectations don't match API behavior. See docs/TEST-ANALYSIS.md") class UserRegistrationComprehensiveTest { private static final String REGISTRATION_URL = "/user/registration"; diff --git a/src/test/java/com/digitalsanctuary/spring/user/api/UserRegistrationCoreTest.java b/src/test/java/com/digitalsanctuary/spring/user/api/UserRegistrationCoreTest.java index ca3d59b..50df7fa 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/api/UserRegistrationCoreTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/api/UserRegistrationCoreTest.java @@ -39,7 +39,7 @@ @ActiveProfiles("test") @Transactional @DisplayName("User Registration Core Tests") -@Disabled("Email normalization expectations don't match API behavior. See TEST-ANALYSIS.md") +@Disabled("Email normalization expectations don't match API behavior. See docs/TEST-ANALYSIS.md") class UserRegistrationCoreTest { private static final String REGISTRATION_URL = "/user/registration"; diff --git a/src/test/java/com/digitalsanctuary/spring/user/api/UserRegistrationEdgeCaseTest.java b/src/test/java/com/digitalsanctuary/spring/user/api/UserRegistrationEdgeCaseTest.java index 5c9479c..61d4011 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/api/UserRegistrationEdgeCaseTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/api/UserRegistrationEdgeCaseTest.java @@ -43,7 +43,7 @@ @ActiveProfiles("test") @Transactional @DisplayName("User Registration Edge Case Tests") -@Disabled("Concurrent registration and null handling expectations don't match API behavior. See TEST-ANALYSIS.md") +@Disabled("Concurrent registration and null handling expectations don't match API behavior. See docs/TEST-ANALYSIS.md") class UserRegistrationEdgeCaseTest { private static final String REGISTRATION_URL = "/user/registration"; diff --git a/src/test/java/com/digitalsanctuary/spring/user/concurrent/AdminUserManagementTest.java b/src/test/java/com/digitalsanctuary/spring/user/concurrent/AdminUserManagementTest.java index f6c52dc..47718ea 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/concurrent/AdminUserManagementTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/concurrent/AdminUserManagementTest.java @@ -42,7 +42,7 @@ @ActiveProfiles("test") @DisplayName("Admin User Management Tests") @Transactional(propagation = Propagation.NOT_SUPPORTED) -@Disabled("Role hierarchy and admin operations configuration issues. See TEST-ANALYSIS.md") +@Disabled("Role hierarchy and admin operations configuration issues. See docs/TEST-ANALYSIS.md") class AdminUserManagementTest { @Autowired diff --git a/src/test/java/com/digitalsanctuary/spring/user/integration/AuthenticationIntegrationTest.java b/src/test/java/com/digitalsanctuary/spring/user/integration/AuthenticationIntegrationTest.java index d8bbf62..8897851 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/integration/AuthenticationIntegrationTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/integration/AuthenticationIntegrationTest.java @@ -46,7 +46,7 @@ @IntegrationTest @AutoConfigureMockMvc @DisplayName("Authentication Integration Tests") -@Disabled("Form-based login expectations don't match REST API architecture. See TEST-ANALYSIS.md") +@Disabled("Form-based login expectations don't match REST API architecture. See docs/TEST-ANALYSIS.md") class AuthenticationIntegrationTest { @Autowired diff --git a/src/test/java/com/digitalsanctuary/spring/user/integration/SecurityConfigurationTest.java b/src/test/java/com/digitalsanctuary/spring/user/integration/SecurityConfigurationTest.java index 3d73501..6158728 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/integration/SecurityConfigurationTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/integration/SecurityConfigurationTest.java @@ -154,7 +154,7 @@ void accessProtectedEndpoint_unauthenticated_redirectsToLogin() throws Exception @Test @WithMockUser(username = "security@test.com", roles = { "USER" }) @DisplayName("Should allow authenticated user to access protected endpoints") - @Disabled("Protected endpoint /protected.html returns 404 - endpoint may not exist. See TEST-ANALYSIS.md") + @Disabled("Protected endpoint /protected.html returns 404 - endpoint may not exist. See docs/TEST-ANALYSIS.md") void accessProtectedEndpoint_authenticated_allowsAccess() throws Exception { // Test that authenticated user is properly authenticated mockMvc.perform(get("/protected.html")).andExpect(status().isOk()).andExpect(authenticated()); diff --git a/src/test/java/com/digitalsanctuary/spring/user/oauth2/GoogleOAuth2IntegrationTest.java b/src/test/java/com/digitalsanctuary/spring/user/oauth2/GoogleOAuth2IntegrationTest.java index 59e750e..cdc09ea 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/oauth2/GoogleOAuth2IntegrationTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/oauth2/GoogleOAuth2IntegrationTest.java @@ -57,7 +57,7 @@ @ExtendWith(OAuth2MockConfiguration.WireMockExtension.class) @Transactional @DisplayName("Google OAuth2 Integration Tests") -@Disabled("Requires OAuth2 mock server infrastructure. See TEST-ANALYSIS.md") +@Disabled("Requires OAuth2 mock server infrastructure. See docs/TEST-ANALYSIS.md") class GoogleOAuth2IntegrationTest { @Autowired diff --git a/src/test/java/com/digitalsanctuary/spring/user/security/AuditLoggingIntegrationTest.java b/src/test/java/com/digitalsanctuary/spring/user/security/AuditLoggingIntegrationTest.java index 394dede..b4ca35a 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/security/AuditLoggingIntegrationTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/security/AuditLoggingIntegrationTest.java @@ -52,7 +52,7 @@ @ActiveProfiles("test") @DisplayName("Audit Logging Integration Tests") @Import(AuditLoggingIntegrationTest.TestConfiguration.class) -@Disabled("Audit logger initialization and async timing issues. See TEST-ANALYSIS.md") +@Disabled("Audit logger initialization and async timing issues. See docs/TEST-ANALYSIS.md") class AuditLoggingIntegrationTest { @org.springframework.boot.test.context.TestConfiguration diff --git a/src/test/java/com/digitalsanctuary/spring/user/security/EmailVerificationEdgeCaseTest.java b/src/test/java/com/digitalsanctuary/spring/user/security/EmailVerificationEdgeCaseTest.java index b9e6923..44f413b 100644 --- a/src/test/java/com/digitalsanctuary/spring/user/security/EmailVerificationEdgeCaseTest.java +++ b/src/test/java/com/digitalsanctuary/spring/user/security/EmailVerificationEdgeCaseTest.java @@ -67,7 +67,7 @@ @ActiveProfiles("test") @Import(EmailVerificationEdgeCaseTest.TestClockConfiguration.class) @DisplayName("Email Verification Edge Cases") -@Disabled("Email verification timing issues and mock email service configuration. See TEST-ANALYSIS.md") +@Disabled("Email verification timing issues and mock email service configuration. See docs/TEST-ANALYSIS.md") class EmailVerificationEdgeCaseTest { @Autowired From 8feb96ed8e550446b7591289e02e0d88ccda65a3 Mon Sep 17 00:00:00 2001 From: Devon Hillard Date: Fri, 14 Aug 2026 23:44:36 -0600 Subject: [PATCH 3/4] chore: move run.sh into scripts/ The only stray helper script at the root. Invocations in README.md and CLAUDE.md now say ./scripts/run.sh. The script gains a shebang, set -euo pipefail, an executable bit (it was mode 644, so the documented ./run.sh would have failed with permission denied), and a cd to the repo root so the relative ./gradlew and build/libs paths resolve from any cwd. --- CLAUDE.md | 2 +- README.md | 2 +- run.sh | 2 -- scripts/run.sh | 8 ++++++++ 4 files changed, 10 insertions(+), 4 deletions(-) delete mode 100644 run.sh create mode 100755 scripts/run.sh diff --git a/CLAUDE.md b/CLAUDE.md index 107ffb3..b9d0ea9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,7 +13,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ./gradlew bootRun --args='--spring.profiles.active=local' # Build and run with debugging -./run.sh +./scripts/run.sh ``` ### Testing diff --git a/README.md b/README.md index 1b2ae9e..308753e 100644 --- a/README.md +++ b/README.md @@ -607,7 +607,7 @@ docker compose -f docker-compose-keycloak.yml up --build ./gradlew bootRun --debug-jvm # Build and run with custom script -./run.sh +./scripts/run.sh # Hot reload with DevTools (automatic) # Just save files and changes will be picked up diff --git a/run.sh b/run.sh deleted file mode 100644 index 8163d1f..0000000 --- a/run.sh +++ /dev/null @@ -1,2 +0,0 @@ -./gradlew bootJar -java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:6332 -jar build/libs/ds-spring-user-framework-demo-1.0.1-SNAPSHOT.jar --spring.profiles.active=local \ No newline at end of file diff --git a/scripts/run.sh b/scripts/run.sh new file mode 100755 index 0000000..85cfcba --- /dev/null +++ b/scripts/run.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Build the boot jar and run it with the JDWP debug agent on port 6332. +set -euo pipefail + +cd "$(dirname "$0")/.." + +./gradlew bootJar +java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:6332 -jar build/libs/ds-spring-user-framework-demo-1.0.1-SNAPSHOT.jar --spring.profiles.active=local From 92df1834239c5c4475365314b8348e20c344dd62 Mon Sep 17 00:00:00 2001 From: Devon Hillard Date: Fri, 14 Aug 2026 23:44:58 -0600 Subject: [PATCH 4/4] chore: make .gitignore state the IDE intent it already had .vscode/tasks.json is tracked and shared, but a blanket .vscode/ rule claimed the opposite; replaced with .vscode/* plus a !.vscode/tasks.json negation so the tracked file matches the rules. Also added .idea/ and *.iml so IntelliJ state cannot get committed by accident. --- .gitignore | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index beca067..2162221 100644 --- a/.gitignore +++ b/.gitignore @@ -134,10 +134,16 @@ application-local.yml /project_concatenated.txt .env -.vscode/settings.json /repomix-output.txt src/main/resources/application-docker-keycloak.yml -.vscode/ + +# VS Code: personal settings stay local, shared tasks.json is tracked +.vscode/* +!.vscode/tasks.json + +# IntelliJ IDEA +.idea/ +*.iml # Playwright playwright/node_modules/