diff --git a/fruitshorts-module-content/src/test/java/com/fruitshorts/content/service/DramaServiceTest.java b/fruitshorts-module-content/src/test/java/com/fruitshorts/content/service/DramaServiceTest.java index 4b4baca..47095c2 100644 --- a/fruitshorts-module-content/src/test/java/com/fruitshorts/content/service/DramaServiceTest.java +++ b/fruitshorts-module-content/src/test/java/com/fruitshorts/content/service/DramaServiceTest.java @@ -122,10 +122,30 @@ class DramaServiceTest { dramaService.update(DRAMA_ID, saveReq(3, UNLOCK_COIN)); assertThat(episodeUpdates.get()).isZero(); - verify(dramaEpisodeMapper, never()).selectList(any()); + verify(dramaEpisodeMapper, times(1)).selectList(any()); verify(dramaEpisodeMapper, never()).updateById(any(DramaEpisode.class)); } + /** + * 历史漂移:短剧 freeEpisodes/unlockCoin 已是目标值,但分集 is_free 仍是旧规则。 + * 同值重存必须纠偏,不能因「规则字段未变」短路跳过同步。 + */ + @Test + void should_correct_drifted_episode_is_free_when_free_episodes_and_unlock_coin_unchanged() { + givenExistingDrama(9, UNLOCK_COIN); + // 规则已是免费 9 集,分集仍按旧规则只免费到第 4 集(5~9 仍收费) + seedEpisodesAlignedToFree(4, 9); + + dramaService.update(DRAMA_ID, saveReq(9, UNLOCK_COIN)); + + Map byEpNo = episodeMap(); + for (int epNo = 1; epNo <= 9; epNo++) { + assertThat(byEpNo.get(epNo).getIsFree()).isEqualTo(1); + assertThat(byEpNo.get(epNo).getUnlockCoin()).isZero(); + } + verify(dramaEpisodeMapper, times(5)).updateById(any(DramaEpisode.class)); + } + @Test void should_not_fail_when_drama_has_no_episodes() { givenExistingDrama(3, UNLOCK_COIN);