package io.delphiplatform.api.v3.rdb.service.apple.music import io.delphiplatform.api.v3.model.apple.music.AppleMusicTrackChartsSearchResult import io.delphiplatform.api.v3.model.spotify.ChartTrackMetricsDimension import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicChartDateTrackKey import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicChartTrackEntity import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicChartTrackId import io.delphiplatform.api.v3.view.util.Params import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever import java.time.LocalDate internal class AppleMusicTracksChartsChangesServiceTest { private val chartTrackService: AppleMusicChartTrackService = mock() private val trackService: AppleMusicTrackService = mock() private val tracksChartsService: AppleMusicTracksChartsService = mock() private val service = AppleMusicTracksChartsChangesService( chartTrackService, trackService, tracksChartsService ) private val date1 = LocalDate.of(2020, 1, 1) private val date2 = LocalDate.of(2020, 1, 2) private val chart1 = "chart1" private val us = "US" private val isrc1 = "isrc1" private val isrc2 = "isrc2" private val track1 = "track1" private val track2 = "track2" private val track3 = "track3" @Test fun test_spotifyChartTracksAdditions_metricsTrackId() { val inputParams = Params.builder() .chartTrackMetricsDimension(ChartTrackMetricsDimension.TRACK_ID) .trackId(mutableListOf(track1)) .date(date2) .previousDate(date1) .build() val chartTrack1 = createChartTrack(date1, track1, chart1, isrc1) val excludedCharTrack = AppleMusicChartDateTrackKey() excludedCharTrack.chartDate = date2 excludedCharTrack.appleMusicChartId = chartTrack1.appleMusicChartId excludedCharTrack.appleMusicTrackId = chartTrack1.appleMusicTrackId whenever(trackService.findAppleMusicTrackIds(inputParams.trackId, null)) .thenReturn(mutableSetOf(track1)) whenever( chartTrackService.findChartTracks( inputParams.trackIdSet, inputParams.isrcSet, date1, inputParams.minPosition, inputParams.maxPosition, inputParams.minRank, inputParams.maxRank, inputParams.countryCode, inputParams.chartTrackMetricsDimension ) ).thenReturn( mutableListOf( chartTrack1 ) ) val delta = mutableListOf( createChartTrack(date2, track2, chart1, isrc1) ) whenever( chartTrackService.findChartTracks( mutableSetOf(excludedCharTrack), HashSet(inputParams.trackId), inputParams.isrcSet, date2, inputParams.minPosition, inputParams.maxPosition, inputParams.minRank, inputParams.maxRank, inputParams.countryCode, inputParams.chartTrackMetricsDimension ) ).thenReturn(delta) val searchResults = mutableListOf(AppleMusicTrackChartsSearchResult.builder().build()) whenever( tracksChartsService.getAppleTrackChartsSearchResults( inputParams.trackStateIncludes, inputParams.chartTrackMetricsDimension, delta ) ).thenReturn(searchResults) val additions = service.getAdditions(inputParams) verify(trackService).findAppleMusicTrackIds(inputParams.trackId, null) verify(chartTrackService).findChartTracks( inputParams.trackIdSet, inputParams.isrcSet, date1, inputParams.minPosition, inputParams.maxPosition, inputParams.minRank, inputParams.maxRank, inputParams.countryCode, inputParams.chartTrackMetricsDimension ) verify(chartTrackService).findChartTracks( mutableSetOf(excludedCharTrack), inputParams.trackIdSet, inputParams.isrcSet, date2, inputParams.minPosition, inputParams.maxPosition, inputParams.minRank, inputParams.maxRank, inputParams.countryCode, inputParams.chartTrackMetricsDimension ) verify(tracksChartsService).getAppleTrackChartsSearchResults( inputParams.trackStateIncludes, inputParams.chartTrackMetricsDimension, delta ) Assertions.assertEquals(searchResults, additions) verifyNoMoreInteractions(trackService, chartTrackService, tracksChartsService) } /** * date1 - t1 - isrc1 * date2 - t2 - isrc1 * date2 - t3 - isrc2 * * expected addition - only t3 for metrics dimension - ISRC */ @Test fun test_spotifyChartTracksAdditions_metricsIsrc() { val inputParams = Params.builder() .isrc(mutableListOf(isrc1)) .date(date2) .previousDate(date1) .chartTrackMetricsDimension(ChartTrackMetricsDimension.ISRC) .build() val chartTrack1 = createChartTrack(date1, track1, chart1, isrc1) val excludedCharTrack1 = AppleMusicChartDateTrackKey() excludedCharTrack1.chartDate = date2 excludedCharTrack1.appleMusicChartId = chartTrack1.appleMusicChartId excludedCharTrack1.appleMusicTrackId = chartTrack1.appleMusicTrackId val excludedCharTrack2 = AppleMusicChartDateTrackKey() excludedCharTrack2.chartDate = date2 excludedCharTrack2.appleMusicChartId = chartTrack1.appleMusicChartId excludedCharTrack2.appleMusicTrackId = track2 val delta = mutableListOf(createChartTrack(date2, track3, chart1, isrc2)) val excludedChartTrackKeys = mutableSetOf(excludedCharTrack1, excludedCharTrack2) whenever(trackService.findAppleMusicTrackIds(null, inputParams.isrc)) .thenReturn(mutableSetOf(track1)) whenever( chartTrackService.findChartTracks( inputParams.trackIdSet, inputParams.isrcSet, date1, inputParams.minPosition, inputParams.maxPosition, inputParams.minRank, inputParams.maxRank, inputParams.countryCode, inputParams.chartTrackMetricsDimension ) ).thenReturn(mutableListOf(chartTrack1)) whenever(chartTrackService.findTrackWithSameIsrcForDateByKey(mutableSetOf(chartTrack1.chartDateTrackKey), date2)) .thenReturn(mutableSetOf(excludedCharTrack2)) whenever( chartTrackService.findChartTracks( excludedChartTrackKeys, inputParams.trackIdSet, inputParams.isrcSet, date2, inputParams.minPosition, inputParams.maxPosition, inputParams.minRank, inputParams.maxRank, inputParams.countryCode, inputParams.chartTrackMetricsDimension ) ).thenReturn(delta) val searchResults = mutableListOf(AppleMusicTrackChartsSearchResult.builder().build()) whenever( tracksChartsService.getAppleTrackChartsSearchResults( inputParams.trackStateIncludes, inputParams.chartTrackMetricsDimension, delta ) ).thenReturn(searchResults) val additions = service.getAdditions(inputParams) verify(trackService).findAppleMusicTrackIds(null, inputParams.isrc) verify(chartTrackService).findChartTracks( inputParams.trackIdSet, inputParams.isrcSet, date1, inputParams.minPosition, inputParams.maxPosition, inputParams.minRank, inputParams.maxRank, inputParams.countryCode, inputParams.chartTrackMetricsDimension ) verify(chartTrackService).findTrackWithSameIsrcForDateByKey(mutableSetOf(chartTrack1.chartDateTrackKey), date2) verify(chartTrackService).findChartTracks( excludedChartTrackKeys, inputParams.trackIdSet, inputParams.isrcSet, date2, inputParams.minPosition, inputParams.maxPosition, inputParams.minRank, inputParams.maxRank, inputParams.countryCode, inputParams.chartTrackMetricsDimension ) verify(tracksChartsService).getAppleTrackChartsSearchResults( inputParams.trackStateIncludes, inputParams.chartTrackMetricsDimension, delta ) Assertions.assertEquals(searchResults, additions) verifyNoMoreInteractions(tracksChartsService, chartTrackService, trackService) } private fun createChartTrack( chartDate: LocalDate, trackId: String, chartId: String = chart1, isrc: String = isrc1 ): AppleMusicChartTrackEntity { val spotifyChartTrackEntity = AppleMusicChartTrackEntity() val appleMusicChartTrackId = AppleMusicChartTrackId() appleMusicChartTrackId.chartDate = chartDate appleMusicChartTrackId.appleMusicChartId = chartId appleMusicChartTrackId.currentPosition = 10 val appleMusicChartTrackKey = AppleMusicChartDateTrackKey() appleMusicChartTrackKey.chartDate = chartDate appleMusicChartTrackKey.appleMusicChartId = chartId appleMusicChartTrackKey.appleMusicTrackId = trackId spotifyChartTrackEntity.id = appleMusicChartTrackId spotifyChartTrackEntity.chartDateTrackKey = appleMusicChartTrackKey spotifyChartTrackEntity.appleMusicChartId = chartId spotifyChartTrackEntity.appleMusicTrackId = trackId spotifyChartTrackEntity.chartDate = chartDate spotifyChartTrackEntity.currentPosition = 10 spotifyChartTrackEntity.isExit = false spotifyChartTrackEntity.isEntry = false spotifyChartTrackEntity.isReentry = false spotifyChartTrackEntity.prevPosition = 20 spotifyChartTrackEntity.isrc = isrc spotifyChartTrackEntity.isrcPrevPosition = 15 return spotifyChartTrackEntity } }