Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
202 changes: 202 additions & 0 deletions src/test/java/com/example/udtbe/batch/config/BatchConfigTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
package com.example.udtbe.batch.config;

import static org.assertj.core.api.Assertions.assertThat;

import com.example.udtbe.common.fixture.AdminContentDeleteJobFixture;
import com.example.udtbe.common.fixture.AdminContentRegisterJobFixture;
import com.example.udtbe.common.fixture.AdminContentUpdateJobFixture;
import com.example.udtbe.common.fixture.ContentFixture;
import com.example.udtbe.common.fixture.ContentMetadataFixture;
import com.example.udtbe.common.support.ApiSupport;
import com.example.udtbe.domain.batch.entity.AdminContentDeleteJob;
import com.example.udtbe.domain.batch.entity.AdminContentRegisterJob;
import com.example.udtbe.domain.batch.entity.AdminContentUpdateJob;
import com.example.udtbe.domain.batch.entity.enums.BatchStatus;
import com.example.udtbe.domain.batch.repository.AdminContentDeleteJobRepository;
import com.example.udtbe.domain.batch.repository.AdminContentRegisterJobRepository;
import com.example.udtbe.domain.batch.repository.AdminContentUpdateJobRepository;
import com.example.udtbe.domain.content.entity.Content;
import com.example.udtbe.domain.content.entity.ContentMetadata;
import com.example.udtbe.domain.content.repository.ContentMetadataRepository;
import com.example.udtbe.domain.content.repository.ContentRepository;
import java.time.LocalDateTime;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.test.JobLauncherTestUtils;
import org.springframework.batch.test.context.SpringBatchTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.jdbc.Sql;

@Sql(
scripts = "classpath:data-test.sql",
executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS
)
@SpringBatchTest
class BatchConfigTest extends ApiSupport {

@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;

@Autowired
private AdminContentRegisterJobRepository adminContentRegisterJobRepository;

@Autowired
private AdminContentUpdateJobRepository adminContentUpdateJobRepository;

@Autowired
private AdminContentDeleteJobRepository adminContentDeleteJobRepository;

@Autowired
private ContentRepository contentRepository;

@Autowired
private ContentMetadataRepository contentMetadataRepository;

@BeforeEach
void setUp() {
adminContentRegisterJobRepository.deleteAllInBatch();
adminContentUpdateJobRepository.deleteAllInBatch();
adminContentDeleteJobRepository.deleteAllInBatch();
contentMetadataRepository.deleteAllInBatch();
contentRepository.deleteAllInBatch();
}

@DisplayName("contentRegisterStep을 성공할 수 있다.")
@Test
void contentRegisterStep() {
// given
AdminContentRegisterJob pendingJob = AdminContentRegisterJobFixture.createPendingJob(1L,
"체인소 맨", "레제");
adminContentRegisterJobRepository.save(pendingJob);

JobParameters jobParameters = new JobParametersBuilder()
.addString("type", "all")
.addString("date", LocalDateTime.now().toString())
.toJobParameters();

// when
JobExecution jobExecution = jobLauncherTestUtils.launchStep("contentRegisterStep",
jobParameters);

// then
assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED);

AdminContentRegisterJob completedJob = adminContentRegisterJobRepository.findAll().get(0);
assertThat(completedJob.getStatus()).isEqualTo(BatchStatus.COMPLETED);

long contentCount = contentRepository.count();
assertThat(contentCount).isEqualTo(1);
}

@DisplayName("contentUpdateStep을 성공할 수 있다.")
@Test
void contentUpdateStep() {
// given
Content content = ContentFixture.content("체인소 맨", "레제");
ContentMetadata contentMetadata = ContentMetadataFixture.dramaMetadata(content);

contentRepository.save(content);
contentMetadataRepository.save(contentMetadata);

String updatedTitle = "체인소 맨 극장판";
String updatedDesc = "지배의 악마";

AdminContentUpdateJob pendingJob = AdminContentUpdateJobFixture.createPendingJob(1L,
content.getId(), updatedTitle, updatedDesc);
adminContentUpdateJobRepository.save(pendingJob);

JobParameters jobParameters = new JobParametersBuilder()
.addString("type", "all")
.addString("date", LocalDateTime.now().toString())
.toJobParameters();

// when
JobExecution jobExecution = jobLauncherTestUtils.launchStep("contentUpdateStep",
jobParameters);

// then
assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED);

AdminContentUpdateJob completedJob = adminContentUpdateJobRepository.findAll().get(0);
assertThat(completedJob.getStatus()).isEqualTo(BatchStatus.COMPLETED);

Content updatedContent = contentRepository.findById(content.getId()).get();
assertThat(updatedContent.getTitle()).isEqualTo(updatedTitle);
assertThat(updatedContent.getDescription()).isEqualTo(updatedDesc);
}

@DisplayName("contentUpdateStep에서 예외 발생 시 스킵 처리될 수 있다.")
@Test
void contentUpdateStepWhenExceptionThenSkipHandled() throws Exception {

Content content = ContentFixture.content("체인소 맨", "레제");
ContentMetadata contentMetadata = ContentMetadataFixture.dramaMetadata(content);
contentRepository.save(content);
contentMetadataRepository.save(contentMetadata);

// given
AdminContentUpdateJob pendingJob = AdminContentUpdateJobFixture.createPendingJob(
1L,
100L,
"체인소 맨 극장판",
"마키마 씨는 어떤 맛일까?"
);
adminContentUpdateJobRepository.save(pendingJob);

JobParameters jobParameters = new JobParametersBuilder()
.addString("type", "all")
.addString("date", LocalDateTime.now().toString())
.toJobParameters();

// when
JobExecution jobExecution = jobLauncherTestUtils.launchStep("contentUpdateStep",
jobParameters);

assertThat(jobExecution.getExitStatus().getExitCode())
.isIn(ExitStatus.COMPLETED.getExitCode(), ExitStatus.FAILED.getExitCode());

Comment on lines +160 to +162
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

스프링배치입장에서는 COMPLETED가 나와요!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아마 job 상태는 INVALID일 것 같아요!
image

AdminContentUpdateJob failedJob = adminContentUpdateJobRepository.findAll().get(0);
assertThat(failedJob.getStatus()).isEqualTo(BatchStatus.INVALID);

Content unUpdatedContent = contentRepository.findById(content.getId()).get();
assertThat(unUpdatedContent.getTitle()).isEqualTo(content.getTitle());
}

@DisplayName("contentDeleteStep을 성공할 수 있다.")
@Test
void contentDeleteStep() {
// given
Content content = ContentFixture.content("체인소 맨", "덴지");
ContentMetadata contentMetadata = ContentMetadataFixture.deletedMetadata(content);
contentRepository.save(content);
contentMetadataRepository.save(contentMetadata);

AdminContentDeleteJob pendingJob = AdminContentDeleteJobFixture.createPendingJob(1L,
content.getId());
adminContentDeleteJobRepository.save(pendingJob);

JobParameters jobParameters = new JobParametersBuilder()
.addString("type", "all")
.addString("date", LocalDateTime.now().toString())
.toJobParameters();

// when
JobExecution jobExecution = jobLauncherTestUtils.launchStep("contentDeleteStep",
jobParameters);

// then
assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED);

AdminContentDeleteJob completedJob = adminContentDeleteJobRepository.findAll().get(0);
assertThat(completedJob.getStatus()).isEqualTo(BatchStatus.COMPLETED);

Content deletedContent = contentRepository.findById(content.getId()).get();
assertThat(deletedContent.isDeleted()).isEqualTo(true);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.example.udtbe.domain.batch.entity.enums.BatchJobType;
import com.example.udtbe.domain.batch.repository.BatchJobMetricRepository;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -17,6 +18,11 @@ class BatchJobMetricRepositoryTest extends DataJpaSupport {
@Autowired
private BatchJobMetricRepository batchJobMetricRepository;

@BeforeEach
void cleanUp() {
batchJobMetricRepository.deleteAllInBatch();
}

@DisplayName("배치 작업 메트릭을 저장하고 조회할 수 있다.")
@Test
void saveAndFindAll() {
Expand Down