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 @@ -2,9 +2,9 @@

import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.c4marathon.assignment.file.application.service.component.FileFactory;
import org.c4marathon.assignment.folder.application.port.in.RenameFolderUseCase;
import org.c4marathon.assignment.folder.application.port.in.UpdateSummaryUseCase;
import org.c4marathon.assignment.folder.application.port.out.FolderCommandPort;
import org.c4marathon.assignment.folder.application.port.out.FolderQueryPort;
import org.c4marathon.assignment.folder.domain.entity.Folder;
import org.c4marathon.assignment.user.domain.entity.User;
Expand All @@ -21,15 +21,15 @@ public class RenameFolderService implements RenameFolderUseCase {

private final FolderQueryPort folderQueryPort;

private final FolderCommandPort folderCommandPort;

private final UpdatePathService updatePathService;

private final UpdateSummaryUseCase updateSummaryUseCase;

private final FileFactory fileFactory;

private String renameActualFolder(Folder folder, String newFolderName) {
File file = new File(folder.getPath());
File existingFolder = new File(file.getParent() + File.separator + newFolderName);
File file = fileFactory.createFile(folder.getPath());
File existingFolder = fileFactory.createFile(file.getParent() + File.separator + newFolderName);

if (existingFolder.exists()) {
throw new IllegalArgumentException("Folder already exists");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ private FolderSummaryResponseDto getRootFolderSummary(User user) {
}
}

return FolderSummaryResponseDto.of(null, (long)folders.size(), (long)files.size(), size, MAX_USER_FILE_SIZE - size, null, updatedAt);
return FolderSummaryResponseDto.of(null, (long)folders.size(), (long)files.size(), size, MAX_USER_FILE_SIZE != null ? MAX_USER_FILE_SIZE - size : null, null, updatedAt);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.c4marathon.assignment.folder.application.service;

import lombok.RequiredArgsConstructor;
import org.c4marathon.assignment.file.application.service.component.FileFactory;
import org.springframework.stereotype.Service;

import java.io.File;
Expand All @@ -9,12 +10,14 @@
@RequiredArgsConstructor
public class WriteFolderService {

private final FileFactory fileFactory;

public String writeFolder(String email, String folderName, String parentFolderPath) {
File file;
if (parentFolderPath == null) {
file = new File("src/main/resources/upload/" + email + "/" + folderName);
file = fileFactory.createFile("src/main/resources/upload/" + email + "/" + folderName);
} else {
file = new File(parentFolderPath + "/" + folderName);
file = fileFactory.createFile(parentFolderPath + "/" + folderName);
}

// 폴더가 이미 존재하는지 확인한다.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package org.c4marathon.assignment.folder.application.service;

import org.c4marathon.assignment.file.application.service.component.FileFactory;
import org.c4marathon.assignment.folder.application.port.in.UpdateSummaryUseCase;
import org.c4marathon.assignment.folder.application.port.out.FolderQueryPort;
import org.c4marathon.assignment.folder.domain.entity.Folder;
import org.c4marathon.assignment.user.domain.entity.User;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import java.io.File;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@ExtendWith(SpringExtension.class)
class RenameFolderServiceTest {

@Mock
private FolderSearchService folderSearchService;

@Mock
private FolderQueryPort folderQueryPort;

@Mock
private UpdatePathService updatePathService;

@Mock
private UpdateSummaryUseCase updateSummaryUseCase;

@Mock
private FileFactory fileFactory;

@InjectMocks
private RenameFolderService renameFolderService;

@Test
@DisplayName("유저는 본인이 소유한 폴더의 이름을 변경할 수 있다.")
void userCanRenameOwnFolder() {
// given
User user = mock(User.class);
Folder folder = mock(Folder.class);
Long folderId = 1L;
String newFolderName = "newFolderName";
when(folderQueryPort.findByUserAndName(user, newFolderName)).thenReturn(Optional.empty());
when(folderSearchService.findById(user, folderId)).thenReturn(folder);
File file = mock(File.class);
when(folder.getPath()).thenReturn("path");
when(fileFactory.createFile(folder.getPath())).thenReturn(file);
File existingFolder = mock(File.class);
when(file.getParent()).thenReturn("parent");
when(fileFactory.createFile("parent" + File.separator + newFolderName)).thenReturn(existingFolder);
when(existingFolder.exists()).thenReturn(false);
when(file.renameTo(existingFolder)).thenReturn(true);

// when & then
assertDoesNotThrow(() -> renameFolderService.renameFolder(user, folderId, newFolderName));
}

@Test
@DisplayName("이미 유저가 소유한 폴더 중 같은 이름의 폴더가 존재한다면 IllegalArgumentException을 던진다.")
void userCanNotRenameIfExistSameFolderName() {
// given
User user = mock(User.class);
Folder folder = mock(Folder.class);
Long folderId = 1L;
String newFolderName = "newFolderName";
when(folderQueryPort.findByUserAndName(user, newFolderName)).thenReturn(Optional.of(folder));

// when & then
assertThrows(IllegalArgumentException.class, () -> renameFolderService.renameFolder(user, folderId, newFolderName));
}

@Test
@DisplayName("파일 시스템에 이미 유저가 소유한 폴더 중 같은 이름의 폴더가 존재한다면 IllegalArgumentException을 던진다.")
void userCanNotRenameIfExistSameFolderNameInFileSystem() {
// given
User user = mock(User.class);
Folder folder = mock(Folder.class);
Long folderId = 1L;
String newFolderName = "newFolderName";
when(folderQueryPort.findByUserAndName(user, newFolderName)).thenReturn(Optional.empty());
when(folderSearchService.findById(user, folderId)).thenReturn(folder);
File file = mock(File.class);
when(folder.getPath()).thenReturn("path");
when(fileFactory.createFile(folder.getPath())).thenReturn(file);
File existingFolder = mock(File.class);
when(file.getParent()).thenReturn("parent");
when(fileFactory.createFile("parent" + File.separator + newFolderName)).thenReturn(existingFolder);
when(existingFolder.exists()).thenReturn(true);

// when & then
assertThrows(IllegalArgumentException.class, () -> renameFolderService.renameFolder(user, folderId, newFolderName));
}

@Test
@DisplayName("파일 시스템에서 폴더의 이름을 변경하는 것에 실패했다면 IllegalArgumentException을 던진다.")
void userCanNotRenameIfFailToRenameAtFileSystem() {
// given
User user = mock(User.class);
Folder folder = mock(Folder.class);
Long folderId = 1L;
String newFolderName = "newFolderName";
when(folderQueryPort.findByUserAndName(user, newFolderName)).thenReturn(Optional.empty());
when(folderSearchService.findById(user, folderId)).thenReturn(folder);
File file = mock(File.class);
when(folder.getPath()).thenReturn("path");
when(fileFactory.createFile(folder.getPath())).thenReturn(file);
File existingFolder = mock(File.class);
when(file.getParent()).thenReturn("parent");
when(fileFactory.createFile("parent" + File.separator + newFolderName)).thenReturn(existingFolder);
when(existingFolder.exists()).thenReturn(false);
when(file.renameTo(existingFolder)).thenReturn(false);

// when & then
assertThrows(IllegalArgumentException.class, () -> renameFolderService.renameFolder(user, folderId, newFolderName));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package org.c4marathon.assignment.folder.application.service;

import org.c4marathon.assignment.file.application.service.FileSearchService;
import org.c4marathon.assignment.file.domain.entity.File;
import org.c4marathon.assignment.folder.adapter.in.dto.FolderSummaryResponseDto;
import org.c4marathon.assignment.folder.domain.entity.Folder;
import org.c4marathon.assignment.user.domain.entity.User;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@ExtendWith(SpringExtension.class)
class SummaryServiceTest {

@Mock
private FolderSearchService folderSearchService;

@Mock
private FileSearchService fileSearchService;

@InjectMocks
private SummaryService summaryService;

@Test
@DisplayName("루트 폴더의 요약 정보를 조회할 수 있다.")
void getFolderSummaryOfRootFolder() {
// given
User user = mock(User.class);
Folder targetFolder = null;
Folder innerFolder = Folder.of(1L, user, targetFolder, "folderName", "path", 2L, 1L, 200L);
File innerFile = File.of(1L, user, targetFolder, "path", "uuid", "fileName", "txt", 100L);

// mock
when(folderSearchService.findAllSubElementsById(user, null)).thenReturn(List.of(innerFolder));
when(fileSearchService.getFileListByFolder(user, null)).thenReturn(List.of(innerFile));

// when
FolderSummaryResponseDto folderSummary = summaryService.getFolderSummary(user, null);

// then
assertEquals(1, folderSummary.getTotalFolders());
assertEquals(1, folderSummary.getTotalFiles());
assertEquals(300L, folderSummary.getTotalSize());
}

@Test
@DisplayName("루트 폴더가 아닌 폴더의 요약 정보를 조회할 수 있다.")
void getFolderSummaryOfNotARootFolder() {
// given
User user = mock(User.class);
Folder targetFolder = Folder.of(1L, user, null, "folderName", "path", 1L, 1L, 300L);

// mock
when(folderSearchService.findById(user, 1L)).thenReturn(targetFolder);

// when
FolderSummaryResponseDto folderSummary = summaryService.getFolderSummary(user, targetFolder.getId());

// then
assertEquals(1, folderSummary.getTotalFolders());
assertEquals(1, folderSummary.getTotalFiles());
assertEquals(300L, folderSummary.getTotalSize());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package org.c4marathon.assignment.folder.application.service;

import org.c4marathon.assignment.file.application.service.FileSearchService;
import org.c4marathon.assignment.file.domain.entity.File;
import org.c4marathon.assignment.folder.domain.entity.Folder;
import org.c4marathon.assignment.user.domain.entity.User;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

@ExtendWith(SpringExtension.class)
class UpdatePathServiceTest {

@Mock
private FolderSearchService folderSearchService;

@Mock
private FileSearchService fileSearchService;

@InjectMocks
private UpdatePathService updatePathService;

@Test
@DisplayName("부모 폴더의 변경된 이름/경로를 모든 자식 폴더와 파일에 재귀적으로 반영할 수 있다.")
void updatePathInternal() {
// given
User user = mock(User.class);
Folder folder1 = Folder.of(1L, user, null, "renamed", "src/test/resources/renamed", 1L, 0L, 1234L);
Folder folder2 = Folder.of(2L, user, folder1,"folder2", "src/test/resources/folder1", 0L, 1L, 1234L);
File file = File.of(1L, user, folder2, "src/test/resources/folder1/folder2/uuid.txt", "uuid", "fileName", "txt", 22L);

when(folderSearchService.findAllSubElementsById(user, 1L)).thenReturn(List.of(folder2));
when(fileSearchService.getFileListByFolder(user, 1L)).thenReturn(List.of());
when(folderSearchService.findAllSubElementsById(user, 2L)).thenReturn(List.of());
when(fileSearchService.getFileListByFolder(user, 2L)).thenReturn(List.of(file));

// when
updatePathService.updatePathInternal(folder1);

// then
verify(folderSearchService, times(1)).findAllSubElementsById(user, 1L);
verify(folderSearchService, times(1)).findAllSubElementsById(user, 2L);
verify(fileSearchService, times(1)).getFileListByFolder(user, 1L);
verify(fileSearchService, times(1)).getFileListByFolder(user, 2L);
assertEquals("src/test/resources/renamed/folder2", folder2.getPath());
assertEquals("src/test/resources/renamed/folder2/uuid.txt", file.getPath());
}

}
Loading