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
Original file line number Diff line number Diff line change
Expand Up @@ -332,20 +332,11 @@ public boolean accept(File dir, String name) {

// (+1) 옵션이고 기존 파일이 없는 경우 초기 파일명을 생성한다.
private String generateInitialIndexFilename(String resourceFileName) {
// 파일명에서 확장자 추출 (괄호 이전 부분에서)
String baseFileName = resourceFileName;
int parenIndex = resourceFileName.indexOf('(');
if (parenIndex > 0) {
baseFileName = resourceFileName.substring(0, parenIndex);
}

// 파일명 규칙("파일명" + "_NDX" + "(순번)" + ".확장자")에 따라 (순번) 뒷부분을 확장자로 사용한다.
String extension = "";
int lastDotIndex = baseFileName.lastIndexOf('.');
if (lastDotIndex > 0) {
extension = baseFileName.substring(lastDotIndex);
} else {
// 확장자가 없으면 기본적으로 .csv 사용
extension = ".csv";
int closeParenIndex = resourceFileName.indexOf(')');
if (closeParenIndex > 0) {
extension = resourceFileName.substring(closeParenIndex + 1);
}

// 현재 시간을 기반으로 초기 인덱스 생성 (YYYYMMDDhhmmss 형식)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package org.egovframe.rte.bat.core.item.file;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

/**
* {@link EgovIndexFileWriter}가 (+1) 옵션으로 초기 파일명을 만들 때
* indexResource에 지정된 확장자를 그대로 사용하는지 검증한다.
*
* <p>configureWriterIndexResouce()가 검증하는 파일명 규칙은
* "파일명" + "_NDX" + "(순번)" + ".확장자"이고, (순번) 앞부분은 {@code [a-zA-Z0-9_]+}로
* 제한되어 점을 포함할 수 없다. 기존 파일이 있을 때 쓰이는 generateNewIndexFilename()은
* (순번) 뒷부분을 확장자로 보존하므로, 초기 파일명도 같은 자리에서 확장자를 가져와야
* 디렉토리 상태와 무관하게 같은 확장자가 나온다.</p>
*/
class EgovIndexFileWriterInitialExtensionTest {

@TempDir
Path tempDir;

/** beforeStep() 공개 진입점으로 인덱스 리소스를 구성하고 확정된 파일명을 돌려준다. */
private String resolveFilename(String indexResource) throws Exception {
EgovIndexFileWriter<Object> writer = new EgovIndexFileWriter<>();
writer.setIndexResource(indexResource);
writer.beforeStep(new StepExecution("indexFileWriterStep", new JobExecution(1L)));

assertNotNull(writer.getResource(), "resource가 설정되어야 한다");
return writer.getResource().getFilename();
}

@Test
@DisplayName("기존 파일이 없어도 지정한 확장자(.txt)로 초기 파일명을 만든다")
void initialFilenameKeepsConfiguredExtension() throws Exception {
String filename = resolveFilename(tempDir.toString() + "/DATA_NDX(1).txt");

assertEquals(".txt", filename.substring(filename.lastIndexOf('.')),
"indexResource에 지정한 확장자를 그대로 사용해야 한다 : " + filename);
}

@Test
@DisplayName("확장자를 생략하면 초기 파일명에도 확장자가 붙지 않는다")
void initialFilenameKeepsOmittedExtension() throws Exception {
// 파일명 규칙 4) ".확장자" 생략 가능
String filename = resolveFilename(tempDir.toString() + "/DATA_NDX(1)");

assertEquals("DATA_NDX_", filename.substring(0, "DATA_NDX_".length()));
assertEquals(-1, filename.indexOf('.'),
"확장자를 지정하지 않았으므로 확장자가 붙지 않아야 한다 : " + filename);
}

@Test
@DisplayName("기존 파일이 있으면 확장자가 보존된다(형제 경로 기준)")
void nextFilenameKeepsExtension() throws Exception {
Files.createFile(new File(tempDir.toFile(), "DATA_NDX_20260101000000.txt").toPath());

assertEquals("DATA_NDX_20260101000001.txt",
resolveFilename(tempDir.toString() + "/DATA_NDX(1).txt"));
}
}