Coverage Summary for Class: ApiService (concept.stc.data)

Class Method, % Branch, % Line, %
ApiService 100% (2/2) 100% (7/7)
ApiService$loadMovies$1
ApiService$loadMovies$2 100% (1/1) 100% (6/6) 100% (6/6)
Total 100% (3/3) 100% (6/6) 100% (13/13)


 package concept.stc.data
 
 import concept.stc.coroutines.DispatchersProvider
 import concept.stc.data.local.MovieCrudRepository
 import concept.stc.data.mapper.toEntity
 import concept.stc.data.remote.ApiClient
 import kotlinx.coroutines.withContext
 import org.springframework.stereotype.Service
 
 /**
  * Data service to manage API operations.
  * In opposite to the domain service that operates with pure domain models,
  * this service operates with "raw" data, as API response and database entities.
  *
  * @param apiClient the API client.
  * @param repository the CRUD movie repository.
  * @param dispatchers the dispatcher provider.
  */
 @Service
 class ApiService(
     private val apiClient: ApiClient,
     private val repository: MovieCrudRepository,
     private val dispatchers: DispatchersProvider
 ) {
 
     /**
      * Load movies from the external API and save them to the database.
      *
      * @param title the movie title.
      *
      * @return the list of internal movie IDs.
      */
     suspend fun loadMovies(title: String): List<Int> {
         val result = ArrayList<Int>()
         withContext(dispatchers.io) {
             val movies = apiClient.search(title).movies
             for (movie in movies) {
                 val entity = repository.getMovieByImdbId(movie.imdbID)
                 if (entity == null) {
                     val newEntity = repository.save(movie.toEntity())
                     result.add(newEntity.id ?: 0)
                 }
             }
         }
         return result
     }
 }