Skip to content

Commit afeec12

Browse files
kangcheolungclaude
andcommitted
test: 컬렉션 읽기 권한 및 오버로드 리팩토링에 대한 테스트 갱신
canReadCollection 케이스와 삭제된 컬렉션 케이스를 추가하고, canWriteCollection/canAdminCollection 호출이 엔티티 버전으로 바뀐 서비스들의 stub을 그에 맞게 수정한다. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1 parent 4cea99b commit afeec12

4 files changed

Lines changed: 164 additions & 9 deletions

File tree

‎src/test/java/com/opensource/docgrid/domain/collection/service/command/CollectionCommandServiceTest.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ void addDocument_succeeds_when_validRequest() {
159159
AddDocumentRequest request = new AddDocumentRequest(CollectionFixture.DOCUMENT_ID);
160160

161161
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.of(collection));
162-
given(permissionQueryService.canWriteCollection(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID)).willReturn(true);
162+
given(permissionQueryService.canWriteCollection(CollectionFixture.USER_ID, collection)).willReturn(true);
163163
given(documentRepository.findById(CollectionFixture.DOCUMENT_ID)).willReturn(Optional.of(document));
164164
given(collectionDocumentRepository.existsByCollectionIdAndDocumentId(
165165
CollectionFixture.COLLECTION_ID, CollectionFixture.DOCUMENT_ID)).willReturn(false);
@@ -204,7 +204,7 @@ void addDocument_throws_when_documentNotFound() {
204204
User owner = CollectionFixture.createOwner();
205205
DocumentCollection collection = CollectionFixture.createCollection(owner);
206206
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.of(collection));
207-
given(permissionQueryService.canWriteCollection(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID)).willReturn(true);
207+
given(permissionQueryService.canWriteCollection(CollectionFixture.USER_ID, collection)).willReturn(true);
208208
given(documentRepository.findById(CollectionFixture.DOCUMENT_ID)).willReturn(Optional.empty());
209209

210210
assertThatThrownBy(() -> collectionCommandService.addDocument(
@@ -220,7 +220,7 @@ void addDocument_throws_when_alreadyExists() {
220220
DocumentCollection collection = CollectionFixture.createCollection(owner);
221221
Document document = CollectionFixture.createDocument(owner);
222222
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.of(collection));
223-
given(permissionQueryService.canWriteCollection(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID)).willReturn(true);
223+
given(permissionQueryService.canWriteCollection(CollectionFixture.USER_ID, collection)).willReturn(true);
224224
given(documentRepository.findById(CollectionFixture.DOCUMENT_ID)).willReturn(Optional.of(document));
225225
given(collectionDocumentRepository.existsByCollectionIdAndDocumentId(
226226
CollectionFixture.COLLECTION_ID, CollectionFixture.DOCUMENT_ID)).willReturn(true);

‎src/test/java/com/opensource/docgrid/domain/collection/service/query/CollectionQueryServiceTest.java‎

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
import com.opensource.docgrid.domain.collection.converter.CollectionConverter;
1818
import com.opensource.docgrid.domain.collection.dto.response.CollectionResponse;
1919
import com.opensource.docgrid.domain.collection.entity.DocumentCollection;
20+
import com.opensource.docgrid.domain.collection.enums.CollectionStatus;
2021
import com.opensource.docgrid.domain.collection.fixture.CollectionFixture;
2122
import com.opensource.docgrid.domain.collection.repository.CollectionRepository;
23+
import com.opensource.docgrid.domain.permission.service.query.PermissionQueryService;
2224
import com.opensource.docgrid.global.exception.DocGridException;
2325
import com.opensource.docgrid.global.exception.ErrorCode;
2426

@@ -35,15 +37,19 @@ class CollectionQueryServiceTest {
3537
@Mock
3638
private CollectionConverter collectionConverter;
3739

40+
@Mock
41+
private PermissionQueryService permissionQueryService;
42+
3843
@Test
39-
@DisplayName("존재하는 컬렉션 ID로 조회하면 CollectionResponse를 반환한다")
44+
@DisplayName("읽기 권한이 있는 사용자가 조회하면 CollectionResponse를 반환한다")
4045
void getCollection_returnsResponse_when_collectionExists() {
4146
DocumentCollection collection = CollectionFixture.createCollection();
4247
CollectionResponse expected = CollectionFixture.createCollectionResponse();
4348
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.of(collection));
49+
given(permissionQueryService.canReadCollection(CollectionFixture.USER_ID, collection)).willReturn(true);
4450
given(collectionConverter.toResponse(collection)).willReturn(expected);
4551

46-
CollectionResponse result = collectionQueryService.getCollection(CollectionFixture.COLLECTION_ID);
52+
CollectionResponse result = collectionQueryService.getCollection(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID);
4753

4854
assertThat(result).isEqualTo(expected);
4955
then(collectionConverter).should().toResponse(collection);
@@ -54,8 +60,33 @@ void getCollection_returnsResponse_when_collectionExists() {
5460
void getCollection_throws_when_collectionNotFound() {
5561
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.empty());
5662

57-
assertThatThrownBy(() -> collectionQueryService.getCollection(CollectionFixture.COLLECTION_ID))
63+
assertThatThrownBy(() -> collectionQueryService.getCollection(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID))
5864
.isInstanceOf(DocGridException.class)
5965
.hasFieldOrPropertyWithValue("errorCode", ErrorCode.COLLECTION_NOT_FOUND);
6066
}
67+
68+
@Test
69+
@DisplayName("삭제된 컬렉션을 조회하면 COLLECTION_NOT_FOUND 예외가 발생한다")
70+
void getCollection_throws_when_collectionDeleted() {
71+
DocumentCollection collection = CollectionFixture.createCollection();
72+
org.springframework.test.util.ReflectionTestUtils.setField(collection, "status", CollectionStatus.DELETED);
73+
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.of(collection));
74+
75+
assertThatThrownBy(() -> collectionQueryService.getCollection(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID))
76+
.isInstanceOf(DocGridException.class)
77+
.hasFieldOrPropertyWithValue("errorCode", ErrorCode.COLLECTION_NOT_FOUND);
78+
}
79+
80+
@Test
81+
@DisplayName("읽기 권한이 없는 사용자가 조회하면 PERMISSION_DENIED 예외가 발생한다")
82+
void getCollection_throws_when_noReadPermission() {
83+
DocumentCollection collection = CollectionFixture.createCollection();
84+
Long otherUserId = 99L;
85+
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.of(collection));
86+
given(permissionQueryService.canReadCollection(otherUserId, collection)).willReturn(false);
87+
88+
assertThatThrownBy(() -> collectionQueryService.getCollection(otherUserId, CollectionFixture.COLLECTION_ID))
89+
.isInstanceOf(DocGridException.class)
90+
.hasFieldOrPropertyWithValue("errorCode", ErrorCode.PERMISSION_DENIED);
91+
}
6192
}

‎src/test/java/com/opensource/docgrid/domain/permission/service/command/CollectionPermissionCommandServiceTest.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ void grantPermission_user_updatesCache() {
7070
PermissionTargetType.USER, CollectionFixture.USER_ID, null, null, PermissionType.READ, null);
7171

7272
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.of(collection));
73-
given(permissionQueryService.canAdminCollection(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID)).willReturn(true);
73+
given(permissionQueryService.canAdminCollection(CollectionFixture.USER_ID, collection)).willReturn(true);
7474
given(userRepository.findById(CollectionFixture.USER_ID)).willReturn(Optional.of(owner));
7575
given(userRepository.getReferenceById(CollectionFixture.USER_ID)).willReturn(owner);
7676
given(collectionDocumentRepository.findAllByCollectionId(CollectionFixture.COLLECTION_ID))
@@ -94,7 +94,7 @@ void grantPermission_role_noCacheUpdate() {
9494
PermissionTargetType.ROLE, null, PermissionFixture.ROLE_ID, null, PermissionType.READ, null);
9595

9696
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.of(collection));
97-
given(permissionQueryService.canAdminCollection(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID)).willReturn(true);
97+
given(permissionQueryService.canAdminCollection(CollectionFixture.USER_ID, collection)).willReturn(true);
9898
given(roleRepository.findById(PermissionFixture.ROLE_ID)).willReturn(Optional.of(role));
9999
given(userRepository.getReferenceById(CollectionFixture.USER_ID)).willReturn(owner);
100100
given(permissionConverter.toCollectionPermissionResponse(any())).willReturn(null);
@@ -145,7 +145,7 @@ void grantPermission_throws_when_invalidTargetType() {
145145
PermissionTargetType.USER, null, null, null, PermissionType.READ, null);
146146

147147
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.of(collection));
148-
given(permissionQueryService.canAdminCollection(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID)).willReturn(true);
148+
given(permissionQueryService.canAdminCollection(CollectionFixture.USER_ID, collection)).willReturn(true);
149149

150150
assertThatThrownBy(() -> service.grantPermission(
151151
CollectionFixture.COLLECTION_ID, CollectionFixture.USER_ID, request))

‎src/test/java/com/opensource/docgrid/domain/permission/service/query/PermissionQueryServiceTest.java‎

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.mockito.Mock;
1616
import org.mockito.junit.jupiter.MockitoExtension;
1717

18+
import com.opensource.docgrid.domain.collection.entity.DocumentCollection;
1819
import com.opensource.docgrid.domain.collection.fixture.CollectionFixture;
1920
import com.opensource.docgrid.domain.collection.repository.CollectionRepository;
2021
import com.opensource.docgrid.domain.document.entity.Document;
@@ -310,6 +311,129 @@ void canAdminDocument_noPermission_returnsFalse() {
310311
assertThat(result).isFalse();
311312
}
312313

314+
// ==================== canReadCollection ====================
315+
316+
@Test
317+
@DisplayName("컬렉션 소유자는 canReadCollection이 true다")
318+
void canReadCollection_owner_returnsTrue() {
319+
User owner = CollectionFixture.createOwner();
320+
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID))
321+
.willReturn(Optional.of(CollectionFixture.createCollection(owner)));
322+
323+
boolean result = service.canReadCollection(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID);
324+
325+
assertThat(result).isTrue();
326+
then(collectionPermissionRepository).should(never()).existsUserReadPermission(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID);
327+
}
328+
329+
@Test
330+
@DisplayName("PUBLIC 컬렉션은 누구나 canReadCollection이 true다")
331+
void canReadCollection_public_returnsTrue() {
332+
User owner = CollectionFixture.createOwner();
333+
DocumentCollection collection = CollectionFixture.createCollection(owner);
334+
org.springframework.test.util.ReflectionTestUtils.setField(collection, "visibility", VisibilityType.PUBLIC);
335+
Long otherUserId = 99L;
336+
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.of(collection));
337+
338+
boolean result = service.canReadCollection(otherUserId, CollectionFixture.COLLECTION_ID);
339+
340+
assertThat(result).isTrue();
341+
then(collectionPermissionRepository).should(never()).existsUserReadPermission(otherUserId, CollectionFixture.COLLECTION_ID);
342+
}
343+
344+
@Test
345+
@DisplayName("USER 권한으로 read가 부여된 경우 canReadCollection이 true다")
346+
void canReadCollection_userPermission_returnsTrue() {
347+
User owner = CollectionFixture.createOwner();
348+
Long otherUserId = 99L;
349+
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID))
350+
.willReturn(Optional.of(CollectionFixture.createCollection(owner)));
351+
given(collectionPermissionRepository.existsUserReadPermission(otherUserId, CollectionFixture.COLLECTION_ID))
352+
.willReturn(true);
353+
354+
boolean result = service.canReadCollection(otherUserId, CollectionFixture.COLLECTION_ID);
355+
356+
assertThat(result).isTrue();
357+
}
358+
359+
@Test
360+
@DisplayName("ROLE live 권한이 있으면 canReadCollection이 true다")
361+
void canReadCollection_roleLive_returnsTrue() {
362+
User owner = CollectionFixture.createOwner();
363+
Long otherUserId = 99L;
364+
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID))
365+
.willReturn(Optional.of(CollectionFixture.createCollection(owner)));
366+
given(collectionPermissionRepository.existsUserReadPermission(otherUserId, CollectionFixture.COLLECTION_ID))
367+
.willReturn(false);
368+
given(collectionPermissionRepository.existsRoleReadPermissionForCollection(otherUserId, CollectionFixture.COLLECTION_ID))
369+
.willReturn(true);
370+
371+
boolean result = service.canReadCollection(otherUserId, CollectionFixture.COLLECTION_ID);
372+
373+
assertThat(result).isTrue();
374+
}
375+
376+
@Test
377+
@DisplayName("DEPARTMENT live 권한이 있으면 canReadCollection이 true다")
378+
void canReadCollection_deptLive_returnsTrue() {
379+
User owner = CollectionFixture.createOwner();
380+
Long otherUserId = 99L;
381+
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID))
382+
.willReturn(Optional.of(CollectionFixture.createCollection(owner)));
383+
given(collectionPermissionRepository.existsUserReadPermission(otherUserId, CollectionFixture.COLLECTION_ID))
384+
.willReturn(false);
385+
given(collectionPermissionRepository.existsRoleReadPermissionForCollection(otherUserId, CollectionFixture.COLLECTION_ID))
386+
.willReturn(false);
387+
given(collectionPermissionRepository.existsDeptReadPermissionForCollection(otherUserId, CollectionFixture.COLLECTION_ID))
388+
.willReturn(true);
389+
390+
boolean result = service.canReadCollection(otherUserId, CollectionFixture.COLLECTION_ID);
391+
392+
assertThat(result).isTrue();
393+
}
394+
395+
@Test
396+
@DisplayName("권한이 없으면 canReadCollection이 false다")
397+
void canReadCollection_noPermission_returnsFalse() {
398+
User owner = CollectionFixture.createOwner();
399+
Long otherUserId = 99L;
400+
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID))
401+
.willReturn(Optional.of(CollectionFixture.createCollection(owner)));
402+
given(collectionPermissionRepository.existsUserReadPermission(otherUserId, CollectionFixture.COLLECTION_ID))
403+
.willReturn(false);
404+
given(collectionPermissionRepository.existsRoleReadPermissionForCollection(otherUserId, CollectionFixture.COLLECTION_ID))
405+
.willReturn(false);
406+
given(collectionPermissionRepository.existsDeptReadPermissionForCollection(otherUserId, CollectionFixture.COLLECTION_ID))
407+
.willReturn(false);
408+
409+
boolean result = service.canReadCollection(otherUserId, CollectionFixture.COLLECTION_ID);
410+
411+
assertThat(result).isFalse();
412+
}
413+
414+
@Test
415+
@DisplayName("컬렉션이 없으면 canReadCollection 호출 시 COLLECTION_NOT_FOUND 예외가 발생한다")
416+
void canReadCollection_collectionNotFound_throwsException() {
417+
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.empty());
418+
419+
assertThatThrownBy(() -> service.canReadCollection(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID))
420+
.isInstanceOf(DocGridException.class)
421+
.hasFieldOrPropertyWithValue("errorCode", ErrorCode.COLLECTION_NOT_FOUND);
422+
}
423+
424+
@Test
425+
@DisplayName("삭제된 컬렉션이면 canReadCollection 호출 시 COLLECTION_NOT_FOUND 예외가 발생한다")
426+
void canReadCollection_collectionDeleted_throwsException() {
427+
User owner = CollectionFixture.createOwner();
428+
DocumentCollection collection = CollectionFixture.createCollection(owner);
429+
org.springframework.test.util.ReflectionTestUtils.setField(collection, "status", com.opensource.docgrid.domain.collection.enums.CollectionStatus.DELETED);
430+
given(collectionRepository.findById(CollectionFixture.COLLECTION_ID)).willReturn(Optional.of(collection));
431+
432+
assertThatThrownBy(() -> service.canReadCollection(CollectionFixture.USER_ID, CollectionFixture.COLLECTION_ID))
433+
.isInstanceOf(DocGridException.class)
434+
.hasFieldOrPropertyWithValue("errorCode", ErrorCode.COLLECTION_NOT_FOUND);
435+
}
436+
313437
// ==================== canWriteCollection ====================
314438

315439
@Test

0 commit comments

Comments
 (0)