feat: spring tests #17

Closed
glashark wants to merge 0 commits from feat/spring-tests into main
glashark commented 2026-04-20 21:20:19 +00:00 (Migrated from github.com)

Summary by CodeRabbit

  • New Features

    • Search films by title using the new search endpoint
    • View available films to add to your library (excludes films already in your collection)
  • Tests

    • Added comprehensive test coverage for film search, creation, and deletion operations
    • Added test coverage for library management functionality
    • Added test coverage for user management operations
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Search films by title using the new search endpoint * View available films to add to your library (excludes films already in your collection) * **Tests** * Added comprehensive test coverage for film search, creation, and deletion operations * Added test coverage for library management functionality * Added test coverage for user management operations <!-- end of auto-generated comment: release notes by coderabbit.ai -->
coderabbitai[bot] commented 2026-04-20 21:20:27 +00:00 (Migrated from github.com)
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Free

Run ID: d85b1be3-bbb9-4c2e-b718-e5ceacbd6726

📥 Commits

Reviewing files that changed from the base of the PR and between 482b282dd5 and 8926e5b08c.

📒 Files selected for processing (8)
  • src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt
  • src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt
  • src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt
  • src/main/kotlin/com/project/movienight/application/ports/output/FilmRepositoryPort.kt
  • src/main/kotlin/com/project/movienight/application/services/FilmService.kt
  • src/test/kotlin/com/project/movienight/controllers/FilmControllerTest.kt
  • src/test/kotlin/com/project/movienight/controllers/FilmLibraryControllerTest.kt
  • src/test/kotlin/com/project/movienight/controllers/UserControllerTest.kt

📝 Walkthrough

Walkthrough

This PR implements a title-based film search feature across the persistence, service, and web layers. It adds a findByTitle method to the repository port and implementation, exposes findByTitle and findAll methods through FilmService, and introduces two new HTTP GET endpoints: /api/films/search for searching films by title and /api/users/{userId}/library/available-films for retrieving available films in a user's library. Comprehensive integration tests are included.

Changes

Cohort / File(s) Summary
Persistence Layer
src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt, src/main/kotlin/com/project/movienight/application/ports/output/FilmRepositoryPort.kt
Added findByTitle(title: String): Film? method to repository port interface and implemented with parameterized SQL query against the films table filtering by title and returning first match or null.
Service Layer
src/main/kotlin/com/project/movienight/application/services/FilmService.kt
Added two delegation methods: findByTitle(title: String): Film? and findAll(): List<Film>, both passing through to the repository layer.
Web Layer
src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt, src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt
Introduced GET /api/films/search endpoint accepting title query parameter with optional result. Added GET /api/users/{userId}/library/available-films endpoint retrieving available films for user's library by filtering out already-added films. Both controllers now depend on FilmService.
Integration Tests
src/test/kotlin/com/project/movienight/controllers/FilmControllerTest.kt, src/test/kotlin/com/project/movienight/controllers/FilmLibraryControllerTest.kt, src/test/kotlin/com/project/movienight/controllers/UserControllerTest.kt
Added comprehensive Spring Boot integration test classes covering film CRUD operations, title-based search with existing and non-existent films, user CRUD operations, and film library management operations (add/remove films).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 Whiskers twitch with search delight,
Films by title, shining bright,
Libraries find what's free to claim,
New endpoints dance with test acclaim,
Delegation flows from depth to height! 🎬


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

<!-- This is an auto-generated comment: summarize by coderabbit.ai --> <details> <summary>ℹ️ Recent review info</summary> <details> <summary>⚙️ Run configuration</summary> **Configuration used**: Organization UI **Review profile**: ASSERTIVE **Plan**: Free **Run ID**: `d85b1be3-bbb9-4c2e-b718-e5ceacbd6726` </details> <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between 482b282dd5c1498f488fdcca1d46ec45a22bcbb6 and 8926e5b08c95fc5a475d5143988d92bff4188c7a. </details> <details> <summary>📒 Files selected for processing (8)</summary> * `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt` * `src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt` * `src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt` * `src/main/kotlin/com/project/movienight/application/ports/output/FilmRepositoryPort.kt` * `src/main/kotlin/com/project/movienight/application/services/FilmService.kt` * `src/test/kotlin/com/project/movienight/controllers/FilmControllerTest.kt` * `src/test/kotlin/com/project/movienight/controllers/FilmLibraryControllerTest.kt` * `src/test/kotlin/com/project/movienight/controllers/UserControllerTest.kt` </details> </details> --- <!-- walkthrough_start --> <details> <summary>📝 Walkthrough</summary> ## Walkthrough This PR implements a title-based film search feature across the persistence, service, and web layers. It adds a `findByTitle` method to the repository port and implementation, exposes `findByTitle` and `findAll` methods through `FilmService`, and introduces two new HTTP GET endpoints: `/api/films/search` for searching films by title and `/api/users/{userId}/library/available-films` for retrieving available films in a user's library. Comprehensive integration tests are included. ## Changes |Cohort / File(s)|Summary| |---|---| |**Persistence Layer** <br> `src/main/kotlin/com/project/movienight/adapters/persistence/jdbc/FilmRepository.kt`, `src/main/kotlin/com/project/movienight/application/ports/output/FilmRepositoryPort.kt`|Added `findByTitle(title: String): Film?` method to repository port interface and implemented with parameterized SQL query against the `films` table filtering by title and returning first match or null.| |**Service Layer** <br> `src/main/kotlin/com/project/movienight/application/services/FilmService.kt`|Added two delegation methods: `findByTitle(title: String): Film?` and `findAll(): List<Film>`, both passing through to the repository layer.| |**Web Layer** <br> `src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt`, `src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt`|Introduced `GET /api/films/search` endpoint accepting `title` query parameter with optional result. Added `GET /api/users/{userId}/library/available-films` endpoint retrieving available films for user's library by filtering out already-added films. Both controllers now depend on `FilmService`.| |**Integration Tests** <br> `src/test/kotlin/com/project/movienight/controllers/FilmControllerTest.kt`, `src/test/kotlin/com/project/movienight/controllers/FilmLibraryControllerTest.kt`, `src/test/kotlin/com/project/movienight/controllers/UserControllerTest.kt`|Added comprehensive Spring Boot integration test classes covering film CRUD operations, title-based search with existing and non-existent films, user CRUD operations, and film library management operations (add/remove films).| ## Estimated code review effort 🎯 3 (Moderate) | ⏱️ ~25 minutes ## Poem > 🐰 Whiskers twitch with search delight, > Films by title, shining bright, > Libraries find what's free to claim, > New endpoints dance with test acclaim, > Delegation flows from depth to height! 🎬 </details> <!-- walkthrough_end --> <!-- tips_start --> --- > [!NOTE] > <details> > <summary>🎁 Summarized by CodeRabbit Free</summary> > > Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting <https://app.coderabbit.ai/login>. > > </details> <sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub> <!-- tips_end --> <!-- internal state start --> <!-- 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= --> <!-- internal state end -->

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.