From 8bb7f63c62775a79f2509a6a4787076804358c4a Mon Sep 17 00:00:00 2001 From: Vicky <10212746+haifeng-jiang@user.noreply.gitee.com> Date: Wed, 21 Oct 2026 22:48:09 +0800 Subject: [PATCH] =?UTF-8?q?test(content):=20=E8=A6=86=E7=9B=96=E5=85=8D?= =?UTF-8?q?=E8=B4=B9=E9=9B=86=E6=95=B0=E6=9C=AA=E5=8F=98=E4=BD=86=E5=88=86?= =?UTF-8?q?=E9=9B=86=E6=BC=82=E7=A7=BB=E7=9A=84=E4=BF=AE=E5=A4=8D=E5=9C=BA?= =?UTF-8?q?=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/service/DramaServiceTest.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) 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);