diff --git a/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QChildProblemStatistic.java b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QChildProblemStatistic.java new file mode 100644 index 00000000..a77720c4 --- /dev/null +++ b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QChildProblemStatistic.java @@ -0,0 +1,53 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QChildProblemStatistic is a Querydsl query type for ChildProblemStatistic + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QChildProblemStatistic extends EntityPathBase { + + private static final long serialVersionUID = 1136828573L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QChildProblemStatistic childProblemStatistic = new QChildProblemStatistic("childProblemStatistic"); + + public final NumberPath childProblemId = createNumber("childProblemId", Long.class); + + public final QCountStatistic countStatistic; + + public final NumberPath id = createNumber("id", Long.class); + + public QChildProblemStatistic(String variable) { + this(ChildProblemStatistic.class, forVariable(variable), INITS); + } + + public QChildProblemStatistic(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QChildProblemStatistic(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QChildProblemStatistic(PathMetadata metadata, PathInits inits) { + this(ChildProblemStatistic.class, metadata, inits); + } + + public QChildProblemStatistic(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.countStatistic = inits.isInitialized("countStatistic") ? new QCountStatistic(forProperty("countStatistic")) : null; + } + +} + diff --git a/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QCountStatistic.java b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QCountStatistic.java new file mode 100644 index 00000000..5b0ba49d --- /dev/null +++ b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QCountStatistic.java @@ -0,0 +1,39 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QCountStatistic is a Querydsl query type for CountStatistic + */ +@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") +public class QCountStatistic extends BeanPath { + + private static final long serialVersionUID = 1047466257L; + + public static final QCountStatistic countStatistic = new QCountStatistic("countStatistic"); + + public final NumberPath submitCount = createNumber("submitCount", Long.class); + + public final NumberPath viewCount = createNumber("viewCount", Long.class); + + public QCountStatistic(String variable) { + super(CountStatistic.class, forVariable(variable)); + } + + public QCountStatistic(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QCountStatistic(PathMetadata metadata) { + super(CountStatistic.class, metadata); + } + +} + diff --git a/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemSetStatistic.java b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemSetStatistic.java new file mode 100644 index 00000000..6d992ad2 --- /dev/null +++ b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemSetStatistic.java @@ -0,0 +1,53 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QProblemSetStatistic is a Querydsl query type for ProblemSetStatistic + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QProblemSetStatistic extends EntityPathBase { + + private static final long serialVersionUID = -1319940803L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QProblemSetStatistic problemSetStatistic = new QProblemSetStatistic("problemSetStatistic"); + + public final QCountStatistic countStatistic; + + public final NumberPath id = createNumber("id", Long.class); + + public final NumberPath problemSetId = createNumber("problemSetId", Long.class); + + public QProblemSetStatistic(String variable) { + this(ProblemSetStatistic.class, forVariable(variable), INITS); + } + + public QProblemSetStatistic(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QProblemSetStatistic(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QProblemSetStatistic(PathMetadata metadata, PathInits inits) { + this(ProblemSetStatistic.class, metadata, inits); + } + + public QProblemSetStatistic(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.countStatistic = inits.isInitialized("countStatistic") ? new QCountStatistic(forProperty("countStatistic")) : null; + } + +} + diff --git a/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemStatistic.java b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemStatistic.java new file mode 100644 index 00000000..8eae98c4 --- /dev/null +++ b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemStatistic.java @@ -0,0 +1,53 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QProblemStatistic is a Querydsl query type for ProblemStatistic + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QProblemStatistic extends EntityPathBase { + + private static final long serialVersionUID = 843488641L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QProblemStatistic problemStatistic = new QProblemStatistic("problemStatistic"); + + public final QCountStatistic countStatistic; + + public final NumberPath id = createNumber("id", Long.class); + + public final NumberPath problemId = createNumber("problemId", Long.class); + + public QProblemStatistic(String variable) { + this(ProblemStatistic.class, forVariable(variable), INITS); + } + + public QProblemStatistic(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QProblemStatistic(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QProblemStatistic(PathMetadata metadata, PathInits inits) { + this(ProblemStatistic.class, metadata, inits); + } + + public QProblemStatistic(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.countStatistic = inits.isInitialized("countStatistic") ? new QCountStatistic(forProperty("countStatistic")) : null; + } + +} + diff --git a/src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java b/src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java index 9f7f67a8..c005c57a 100644 --- a/src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java +++ b/src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java @@ -77,6 +77,11 @@ public enum ErrorCode { ALREADY_PUBLISHED_ERROR(HttpStatus.BAD_REQUEST, "이미 발행된 문항세트는 컨펌해제할 수 없습니다."), PROBLEM_SET_DELETED(HttpStatus.BAD_REQUEST, "삭제된 문항세트는 발행할 수 없습니다"), PROBLEM_SET_NOT_CONFIRMED(HttpStatus.BAD_REQUEST, "컨펌되지 않은 문항세트는 발행할 수 없습니다"), + + // 통계 + PROBLEM_STATISTIC_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 문항의 통계 정보를 찾을 수 없습니다"), + PROBLEM_SET_STATISTIC_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 문항세트의 통계 정보를 찾을 수 없습니다"), + CHILD_PROBLEM_STATISTIC_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 새끼 문항의 통계 정보를 찾을 수 없습니다"), FUTURE_PUBLISH_NOT_ACCESSIBLE(HttpStatus.BAD_REQUEST, "오늘 이후의 발행을 조회할 수 없습니다."), // 문항 제출 diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java new file mode 100644 index 00000000..9740c72c --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java @@ -0,0 +1,50 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ChildProblemStatistic implements StatisticCounter { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "child_problem_statistic_id") + private Long id; + + private Long childProblemId; + + @Embedded + private CountStatistic countStatistic; + + public ChildProblemStatistic(Long childProblemId) { + this.childProblemId = childProblemId; + this.countStatistic = new CountStatistic(); + } + + @Override + public void addViewCount() { + this.countStatistic.addViewCount(); + } + + @Override + public void addSubmitCount() { + this.countStatistic.addSubmitCount(); + } + + public Long getViewCount() { + return this.countStatistic.getViewCount(); + } + + public Long getSubmitCount() { + return this.countStatistic.getSubmitCount(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java new file mode 100644 index 00000000..91e1f0c6 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java @@ -0,0 +1,26 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import jakarta.persistence.Embeddable; +import lombok.Getter; + +@Getter +@Embeddable +public class CountStatistic implements StatisticCounter { + private Long viewCount; + private Long submitCount; + + public CountStatistic() { + this.viewCount = 0L; + this.submitCount = 0L; + } + + @Override + public void addViewCount() { + this.viewCount++; + } + + @Override + public void addSubmitCount() { + this.submitCount++; + } +} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java new file mode 100644 index 00000000..92db7f42 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java @@ -0,0 +1,50 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ProblemSetStatistic implements StatisticCounter { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "problem_set_statistic_id") + private Long id; + + private Long problemSetId; + + @Embedded + private CountStatistic countStatistic; + + public ProblemSetStatistic(Long problemSetId) { + this.problemSetId = problemSetId; + this.countStatistic = new CountStatistic(); + } + + @Override + public void addViewCount() { + this.countStatistic.addViewCount(); + } + + @Override + public void addSubmitCount() { + this.countStatistic.addSubmitCount(); + } + + public Long getViewCount() { + return this.countStatistic.getViewCount(); + } + + public Long getSubmitCount() { + return this.countStatistic.getSubmitCount(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java new file mode 100644 index 00000000..0ab5c68e --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java @@ -0,0 +1,52 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ProblemStatistic implements StatisticCounter { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "problem_statistic_id") + private Long id; + + private Long problemId; + + @Embedded + private CountStatistic countStatistic; + + @Builder + public ProblemStatistic(Long problemId) { + this.problemId = problemId; + this.countStatistic = new CountStatistic(); + } + + @Override + public void addViewCount() { + this.countStatistic.addViewCount(); + } + + @Override + public void addSubmitCount() { + this.countStatistic.addSubmitCount(); + } + + public Long getViewCount() { + return this.countStatistic.getViewCount(); + } + + public Long getSubmitCount() { + return this.countStatistic.getSubmitCount(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticCounter.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticCounter.java new file mode 100644 index 00000000..3c8b309d --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticCounter.java @@ -0,0 +1,11 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +public interface StatisticCounter { + void addSubmitCount(); + + void addViewCount(); + + default void updateCount(StatisticFieldType type) { + type.updateCount(this); + } +} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticEntityTarget.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticEntityTarget.java new file mode 100644 index 00000000..d66eba95 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticEntityTarget.java @@ -0,0 +1,5 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +public enum StatisticEntityTarget { + PROBLEM, PROBLEM_SET, CHILD_PROBLEM +} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticFieldType.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticFieldType.java new file mode 100644 index 00000000..771214d7 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticFieldType.java @@ -0,0 +1,16 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import java.util.function.Consumer; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum StatisticFieldType { + VIEW(StatisticCounter::addViewCount), + SUBMIT(StatisticCounter::addSubmitCount); + + private final Consumer countUpdater; + + public void updateCount(StatisticCounter counter) { + countUpdater.accept(counter); + } +} \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ChildProblemStatisticRepository.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ChildProblemStatisticRepository.java new file mode 100644 index 00000000..31f10665 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ChildProblemStatisticRepository.java @@ -0,0 +1,13 @@ +package com.moplus.moplus_server.statistic.Problem.repository; + +import com.moplus.moplus_server.global.error.exception.ErrorCode; +import com.moplus.moplus_server.global.error.exception.NotFoundException; +import com.moplus.moplus_server.statistic.Problem.domain.ChildProblemStatistic; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ChildProblemStatisticRepository extends JpaRepository { + default ChildProblemStatistic findByIdElseThrow(Long id) { + return findById(id) + .orElseThrow(() -> new NotFoundException(ErrorCode.CHILD_PROBLEM_STATISTIC_NOT_FOUND)); + } +} \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemSetStatisticRepository.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemSetStatisticRepository.java new file mode 100644 index 00000000..349d6d6f --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemSetStatisticRepository.java @@ -0,0 +1,13 @@ +package com.moplus.moplus_server.statistic.Problem.repository; + +import com.moplus.moplus_server.global.error.exception.ErrorCode; +import com.moplus.moplus_server.global.error.exception.NotFoundException; +import com.moplus.moplus_server.statistic.Problem.domain.ProblemSetStatistic; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProblemSetStatisticRepository extends JpaRepository { + default ProblemSetStatistic findByIdElseThrow(Long id) { + return findById(id) + .orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_SET_STATISTIC_NOT_FOUND)); + } +} \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemStatisticRepository.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemStatisticRepository.java new file mode 100644 index 00000000..59bbfcc5 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemStatisticRepository.java @@ -0,0 +1,13 @@ +package com.moplus.moplus_server.statistic.Problem.repository; + +import com.moplus.moplus_server.global.error.exception.ErrorCode; +import com.moplus.moplus_server.global.error.exception.NotFoundException; +import com.moplus.moplus_server.statistic.Problem.domain.ProblemStatistic; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProblemStatisticRepository extends JpaRepository { + default ProblemStatistic findByIdElseThrow(Long id) { + return findById(id) + .orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_STATISTIC_NOT_FOUND)); + } +} \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateService.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateService.java new file mode 100644 index 00000000..29801647 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateService.java @@ -0,0 +1,33 @@ +package com.moplus.moplus_server.statistic.Problem.service; + +import com.moplus.moplus_server.statistic.Problem.domain.StatisticCounter; +import com.moplus.moplus_server.statistic.Problem.domain.StatisticEntityTarget; +import com.moplus.moplus_server.statistic.Problem.domain.StatisticFieldType; +import com.moplus.moplus_server.statistic.Problem.repository.ChildProblemStatisticRepository; +import com.moplus.moplus_server.statistic.Problem.repository.ProblemSetStatisticRepository; +import com.moplus.moplus_server.statistic.Problem.repository.ProblemStatisticRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class CountStatisticsUpdateService { + private final ProblemStatisticRepository problemStatisticRepository; + private final ProblemSetStatisticRepository problemSetStatisticRepository; + private final ChildProblemStatisticRepository childProblemStatisticRepository; + + @Transactional + public void updateStatistics(Long id, StatisticFieldType type, StatisticEntityTarget target) { + StatisticCounter statistic = findStatistic(id, target); + statistic.updateCount(type); + } + + private StatisticCounter findStatistic(Long id, StatisticEntityTarget target) { + return switch (target) { + case PROBLEM -> problemStatisticRepository.findByIdElseThrow(id); + case PROBLEM_SET -> problemSetStatisticRepository.findByIdElseThrow(id); + case CHILD_PROBLEM -> childProblemStatisticRepository.findByIdElseThrow(id); + }; + } +} diff --git a/src/test/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateServiceTest.java b/src/test/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateServiceTest.java new file mode 100644 index 00000000..94e133e3 --- /dev/null +++ b/src/test/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateServiceTest.java @@ -0,0 +1,87 @@ +package com.moplus.moplus_server.statistic.Problem.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; + +import com.moplus.moplus_server.statistic.Problem.domain.ChildProblemStatistic; +import com.moplus.moplus_server.statistic.Problem.domain.ProblemSetStatistic; +import com.moplus.moplus_server.statistic.Problem.domain.ProblemStatistic; +import com.moplus.moplus_server.statistic.Problem.domain.StatisticEntityTarget; +import com.moplus.moplus_server.statistic.Problem.domain.StatisticFieldType; +import com.moplus.moplus_server.statistic.Problem.repository.ChildProblemStatisticRepository; +import com.moplus.moplus_server.statistic.Problem.repository.ProblemSetStatisticRepository; +import com.moplus.moplus_server.statistic.Problem.repository.ProblemStatisticRepository; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class CountStatisticsUpdateServiceTest { + + @InjectMocks + private CountStatisticsUpdateService countStatisticsUpdateService; + + @Mock + private ProblemStatisticRepository problemStatisticRepository; + @Mock + private ProblemSetStatisticRepository problemSetStatisticRepository; + @Mock + private ChildProblemStatisticRepository childProblemStatisticRepository; + + @Test + void 문항_조회수_증가() { + // given + Long problemId = 1L; + ProblemStatistic problemStatistic = new ProblemStatistic(problemId); + given(problemStatisticRepository.findByIdElseThrow(problemId)) + .willReturn(problemStatistic); + + // when + countStatisticsUpdateService.updateStatistics(problemId, StatisticFieldType.VIEW, + StatisticEntityTarget.PROBLEM); + + // then + verify(problemStatisticRepository).findByIdElseThrow(problemId); + assertThat(problemStatistic.getViewCount()).isEqualTo(1L); + assertThat(problemStatistic.getSubmitCount()).isEqualTo(0L); + } + + @Test + void 문항세트_풀이수_증가() { + // given + Long problemSetId = 1L; + ProblemSetStatistic problemSetStatistic = new ProblemSetStatistic(problemSetId); + given(problemSetStatisticRepository.findByIdElseThrow(problemSetId)) + .willReturn(problemSetStatistic); + + // when + countStatisticsUpdateService.updateStatistics(problemSetId, StatisticFieldType.SUBMIT, + StatisticEntityTarget.PROBLEM_SET); + + // then + verify(problemSetStatisticRepository).findByIdElseThrow(problemSetId); + assertThat(problemSetStatistic.getSubmitCount()).isEqualTo(1L); + assertThat(problemSetStatistic.getViewCount()).isEqualTo(0L); + } + + @Test + void 새끼문항_조회수_증가() { + // given + Long childProblemId = 1L; + ChildProblemStatistic childProblemStatistic = new ChildProblemStatistic(childProblemId); + given(childProblemStatisticRepository.findByIdElseThrow(childProblemId)) + .willReturn(childProblemStatistic); + + // when + countStatisticsUpdateService.updateStatistics(childProblemId, StatisticFieldType.VIEW, + StatisticEntityTarget.CHILD_PROBLEM); + + // then + verify(childProblemStatisticRepository).findByIdElseThrow(childProblemId); + assertThat(childProblemStatistic.getViewCount()).isEqualTo(1L); + assertThat(childProblemStatistic.getSubmitCount()).isEqualTo(0L); + } +} \ No newline at end of file