@@ -1233,16 +1233,17 @@ void updateLatenessTime(){
12331233 .build ();
12341234
12351235 // when
1236- scheduleService .updateLatenessTime (finishPreparationDto );
1236+ Schedule schedule = scheduleRepository .findById (finishPreparationDto .getScheduleId ()).get ();
1237+ scheduleService .updateLatenessTime (schedule , finishPreparationDto .getLatenessTime ());
12371238
12381239 // then
12391240 assertThat (scheduleRepository .findById (UUID .fromString ("3fa85f64-5717-4562-b3fc-2c963f66afe5" ))
12401241 .get ().getLatenessTime ()).isEqualTo (1 );
12411242 }
12421243
1243- @ DisplayName ("지각 시간 업데이트할 때, 잘못된 schedulId를 DTO에 담아 요청하는 경우 예외가 발생한다." )
1244+ @ DisplayName ("약속 종료할 때, 경로와 본문의 scheduleId가 다르면 예외가 발생한다." )
12441245 @ Test
1245- void updateLatenessTimeWithWrongScheduleId (){
1246+ void finishScheduleWithScheduleIdMismatch (){
12461247 // given
12471248 User addedUser = User .builder ()
12481249 .email ("user@example.com" )
@@ -1269,9 +1270,19 @@ void updateLatenessTimeWithWrongScheduleId(){
12691270 .build ();
12701271
12711272 // when // then
1272- assertThatThrownBy (() -> scheduleService .updateLatenessTime (finishPreparationDto ))
1273+ assertThatThrownBy (() -> scheduleService .finishSchedule (
1274+ addedUser .getId (),
1275+ UUID .fromString ("3fa85f64-5717-4562-b3fc-2c963f66afe5" ),
1276+ finishPreparationDto
1277+ ))
12731278 .isInstanceOf (GeneralException .class )
1274- .hasMessage ("해당 약속이 존재하지 않습니다." );
1279+ .hasMessage (ErrorCode .SCHEDULE_ID_MISMATCH .getMessage ())
1280+ .extracting ("errorCode" )
1281+ .isEqualTo (ErrorCode .SCHEDULE_ID_MISMATCH );
1282+
1283+ assertThat (scheduleRepository .findById (UUID .fromString ("3fa85f64-5717-4562-b3fc-2c963f66afe5" ))
1284+ .get ().getLatenessTime ()).isEqualTo (-1 );
1285+ assertThat (userRepository .findById (addedUser .getId ()).get ().getPunctualityScore ()).isEqualTo (-1f );
12751286 }
12761287
12771288 @ DisplayName ("약속을 종료해 지각시간과 성실도점수 업데이트에 성공한다." )
@@ -1298,12 +1309,11 @@ void finishSchedule(){
12981309 scheduleRepository .save (addedSchedule );
12991310
13001311 FinishPreparationDto finishPreparationDto = FinishPreparationDto .builder ()
1301- .scheduleId (UUID .fromString ("3fa85f64-5717-4562-b3fc-2c963f66afe5" ))
13021312 .latenessTime (1 )
13031313 .build ();
13041314
13051315 // when
1306- scheduleService .finishSchedule (addedUser .getId (), finishPreparationDto );
1316+ scheduleService .finishSchedule (addedUser .getId (), addedSchedule . getScheduleId (), finishPreparationDto );
13071317
13081318 // then
13091319 assertThat (scheduleRepository .findById (UUID .fromString ("3fa85f64-5717-4562-b3fc-2c963f66afe5" ))
@@ -1325,6 +1335,16 @@ void finishScheduleWithWrongUserId(){
13251335 .build ();
13261336 userRepository .save (addedUser );
13271337
1338+ User otherUser = User .builder ()
1339+ .email ("other@example.com" )
1340+ .password (passwordEncoder .encode ("password1234" ))
1341+ .name ("other" )
1342+ .punctualityScore (-1f )
1343+ .scheduleCountAfterReset (0 )
1344+ .latenessCountAfterReset (0 )
1345+ .build ();
1346+ userRepository .save (otherUser );
1347+
13281348 Schedule addedSchedule = Schedule .builder ()
13291349 .scheduleId (UUID .fromString ("3fa85f64-5717-4562-b3fc-2c963f66afe5" ))
13301350 .scheduleName ("을사년 새해" )
@@ -1340,9 +1360,15 @@ void finishScheduleWithWrongUserId(){
13401360 .build ();
13411361
13421362 // when // then
1343- assertThatThrownBy (() -> scheduleService .finishSchedule (addedUser .getId () + 1 , finishPreparationDto ))
1344- .isInstanceOf (IllegalArgumentException .class )
1345- .hasMessage ("존재하지 않는 유저 id입니다." );
1363+ assertThatThrownBy (() -> scheduleService .finishSchedule (otherUser .getId (), addedSchedule .getScheduleId (), finishPreparationDto ))
1364+ .isInstanceOf (GeneralException .class )
1365+ .hasMessage (ErrorCode .UNAUTHORIZED_ACCESS .getMessage ())
1366+ .extracting ("errorCode" )
1367+ .isEqualTo (ErrorCode .UNAUTHORIZED_ACCESS );
1368+
1369+ assertThat (scheduleRepository .findById (addedSchedule .getScheduleId ()).get ().getLatenessTime ()).isEqualTo (-1 );
1370+ assertThat (userRepository .findById (addedUser .getId ()).get ().getPunctualityScore ()).isEqualTo (-1f );
1371+ assertThat (userRepository .findById (otherUser .getId ()).get ().getPunctualityScore ()).isEqualTo (-1f );
13461372 }
13471373
13481374 @ DisplayName ("약속을 종료할 때, 잘못된 scheduleId를 인자로 넘기는 경우 예외가 발생한다." )
@@ -1374,9 +1400,62 @@ void finishScheduleWithWrongScheduleId(){
13741400 .build ();
13751401
13761402 // when // then
1377- assertThatThrownBy (() -> scheduleService .finishSchedule (addedUser .getId (), finishPreparationDto ))
1403+ assertThatThrownBy (() -> scheduleService .finishSchedule (
1404+ addedUser .getId (),
1405+ UUID .fromString ("3fa85f64-5717-4562-b3fc-2c963f66afe6" ),
1406+ finishPreparationDto
1407+ ))
1408+ .isInstanceOf (GeneralException .class )
1409+ .hasMessage (ErrorCode .SCHEDULE_NOT_FOUND .getMessage ())
1410+ .extracting ("errorCode" )
1411+ .isEqualTo (ErrorCode .SCHEDULE_NOT_FOUND );
1412+
1413+ assertThat (scheduleRepository .findById (addedSchedule .getScheduleId ()).get ().getLatenessTime ()).isEqualTo (-1 );
1414+ assertThat (userRepository .findById (addedUser .getId ()).get ().getPunctualityScore ()).isEqualTo (-1f );
1415+ }
1416+
1417+ @ DisplayName ("이미 종료된 약속을 다시 종료하면 예외가 발생하고 성실도점수를 다시 계산하지 않는다." )
1418+ @ Test
1419+ void finishScheduleWithAlreadyFinishedSchedule (){
1420+ // given
1421+ User addedUser = User .builder ()
1422+ .email ("user@example.com" )
1423+ .password (passwordEncoder .encode ("password1234" ))
1424+ .name ("junbeom" )
1425+ .punctualityScore (100f )
1426+ .scheduleCountAfterReset (1 )
1427+ .latenessCountAfterReset (0 )
1428+ .build ();
1429+ userRepository .save (addedUser );
1430+
1431+ Schedule addedSchedule = Schedule .builder ()
1432+ .scheduleId (UUID .fromString ("3fa85f64-5717-4562-b3fc-2c963f66afe5" ))
1433+ .scheduleName ("을사년 새해" )
1434+ .scheduleTime (LocalDateTime .of (2025 , 1 , 1 , 0 , 0 ))
1435+ .latenessTime (0 )
1436+ .doneStatus (DoneStatus .NORMAL )
1437+ .user (addedUser )
1438+ .build ();
1439+ scheduleRepository .save (addedSchedule );
1440+
1441+ FinishPreparationDto finishPreparationDto = FinishPreparationDto .builder ()
1442+ .scheduleId (addedSchedule .getScheduleId ())
1443+ .latenessTime (1 )
1444+ .build ();
1445+
1446+ // when // then
1447+ assertThatThrownBy (() -> scheduleService .finishSchedule (addedUser .getId (), addedSchedule .getScheduleId (), finishPreparationDto ))
13781448 .isInstanceOf (GeneralException .class )
1379- .hasMessage ("해당 약속이 존재하지 않습니다." );
1449+ .hasMessage (ErrorCode .SCHEDULE_ALREADY_FINISHED .getMessage ())
1450+ .extracting ("errorCode" )
1451+ .isEqualTo (ErrorCode .SCHEDULE_ALREADY_FINISHED );
1452+
1453+ User user = userRepository .findById (addedUser .getId ()).get ();
1454+ Schedule schedule = scheduleRepository .findById (addedSchedule .getScheduleId ()).get ();
1455+ assertThat (schedule .getLatenessTime ()).isEqualTo (0 );
1456+ assertThat (user .getPunctualityScore ()).isEqualTo (100f );
1457+ assertThat (user .getScheduleCountAfterReset ()).isEqualTo (1 );
1458+ assertThat (user .getLatenessCountAfterReset ()).isEqualTo (0 );
13801459 }
13811460
13821461 @ Test
0 commit comments