Skip to content

Commit a221767

Browse files
authored
Merge pull request #22 from yeo-li/feat/get-memo
[feat] 메모 조회 기능 구현
2 parents 1feb136 + bd7e8be commit a221767

5 files changed

Lines changed: 99 additions & 9 deletions

File tree

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
- `int visibleStart (nullable)`: 선택한 시작 줄
2222
- 저장은 시간 순서대로 저장이 되어야 한다.
2323

24-
### ⚠️ 메모 저장 기능 제약 상황
24+
### ⚠️ 메모 저장 기능 고려 사항
2525

2626
- 메모의 `content`가 blank라면 저장이 되어선 안된다.
2727
- `selectionStart``selectionEnd`보다 앞에 있어야 한다.
@@ -30,12 +30,14 @@
3030

3131
---
3232

33-
### ☑️ 메모 조회 기능
33+
### 🏁 메모 조회 기능
3434

3535
- 메모의 id를 이용해서 데이터를 조회할 수 있어야 한다.
3636
- 전체 메모를 날짜순으로 조회할 수 있어야 한다.
3737

38-
### ⚠️ 메모 조회 기능 예외 상황
38+
### ⚠️ 메모 조회 기능 고려 사항
39+
40+
- 각 조건마다 조회할 데이터가 없다면 빈 리스트를 반환해야 한다.
3941

4042
---
4143

build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ dependencies {
3737
testImplementation(kotlin("test"))
3838
testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.0")
3939
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.0")
40+
41+
testImplementation("org.mockito:mockito-core:5.12.0")
42+
testImplementation("org.mockito.kotlin:mockito-kotlin:5.2.1")
4043

4144
// IntelliJ Platform Gradle Plugin Dependencies Extension - read more: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-dependencies-extension.html
4245
intellijPlatform {

src/main/kotlin/com/github/yeoli/devlog/domain/memo/repository/MemoRepository.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.yeoli.devlog.domain.memo.repository
22

3+
import com.github.yeoli.devlog.domain.memo.domain.Memo
34
import com.intellij.openapi.components.PersistentStateComponent
45
import com.intellij.openapi.components.Service
56
import com.intellij.openapi.components.State
@@ -19,11 +20,11 @@ class MemoRepository : PersistentStateComponent<MemoStorageState> {
1920
this.state = state
2021
}
2122

22-
fun save(memo: MemoState) {
23-
state.memos.add(memo)
23+
fun save(memo: Memo) {
24+
state.memos.add(memo.toState())
2425
}
2526

26-
fun getAll(): List<MemoState> {
27-
return state.memos
27+
fun getAll(): List<Memo> {
28+
return state.memos.map { it.toDomain() }
2829
}
2930
}

src/main/kotlin/com/github/yeoli/devlog/domain/memo/service/MemoService.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,19 @@ class MemoService(private val project: Project) {
8282

8383
fun saveMemo(memo: Memo) {
8484
try {
85-
memoRepository.save(memo.toState())
85+
memoRepository.save(memo)
8686
} catch (e: Exception) {
8787
logger.warn("[saveMemo] 메모 저장 중 알 수 없는 에러가 발생했습니다. ${e.message}", e)
8888
}
8989
}
90+
91+
fun getAllMemos(): List<Memo> {
92+
try {
93+
return memoRepository.getAll()
94+
} catch (e: Exception) {
95+
logger.warn("[getAllMemos] 메모 조회 중 알 수 없는 에러가 발생했습니다. ${e.message}", e)
96+
}
97+
98+
return mutableListOf()
99+
}
90100
}

src/test/kotlin/com/github/yeoli/devlog/domain/memo/service/MemoServiceTest.kt

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.yeoli.devlog.domain.memo.service
22

33
import com.github.yeoli.devlog.domain.memo.domain.Memo
4+
import com.github.yeoli.devlog.domain.memo.repository.MemoRepository
45
import com.intellij.mock.MockFileDocumentManagerImpl
56
import com.intellij.openapi.application.ApplicationManager
67
import com.intellij.openapi.editor.EditorFactory
@@ -10,10 +11,28 @@ import com.intellij.openapi.util.Disposer
1011
import com.intellij.testFramework.fixtures.BasePlatformTestCase
1112
import com.intellij.testFramework.replaceService
1213
import com.intellij.util.Function
14+
import org.mockito.kotlin.mock
15+
import org.mockito.kotlin.whenever
1316
import java.awt.Point
17+
import kotlin.test.assertTrue
1418

1519
class MemoServiceTest : BasePlatformTestCase() {
1620

21+
private lateinit var memoRepository: MemoRepository
22+
23+
override fun setUp() {
24+
super.setUp()
25+
26+
// mock 생성
27+
memoRepository = mock()
28+
29+
project.replaceService(
30+
MemoRepository::class.java,
31+
memoRepository,
32+
testRootDisposable
33+
)
34+
}
35+
1736
fun `test 메모 생성 성공`() {
1837
// given
1938
val psiFile = myFixture.configureByText(
@@ -132,7 +151,6 @@ class MemoServiceTest : BasePlatformTestCase() {
132151
val document = editor.document
133152
val snippet = "val selected = 42"
134153
val selectionStart = document.text.indexOf(snippet)
135-
assertTrue("선택할 코드 스니펫을 찾지 못했습니다.", selectionStart >= 0)
136154
val selectionEnd = selectionStart + snippet.length
137155
editor.selectionModel.setSelection(selectionStart, selectionEnd)
138156

@@ -167,4 +185,60 @@ class MemoServiceTest : BasePlatformTestCase() {
167185
}
168186
}
169187

188+
// ========= 메모 조회 기능 =========
189+
fun `test 메모 전체 조회 기능 성공`() {
190+
// given
191+
val memo1 = Memo(
192+
id = System.currentTimeMillis(),
193+
createdAt = java.time.LocalDateTime.now(),
194+
updatedAt = java.time.LocalDateTime.now(),
195+
content = "메모1",
196+
commitHash = null,
197+
filePath = "/path/to/file1",
198+
selectedCodeSnippet = "snippet1",
199+
selectionStart = 0,
200+
selectionEnd = 5,
201+
visibleStart = 1,
202+
visibleEnd = 3
203+
)
204+
205+
val memo2 = Memo(
206+
id = System.currentTimeMillis() + 1,
207+
createdAt = java.time.LocalDateTime.now(),
208+
updatedAt = java.time.LocalDateTime.now(),
209+
content = "메모2",
210+
commitHash = null,
211+
filePath = "/path/to/file2",
212+
selectedCodeSnippet = "snippet2",
213+
selectionStart = 10,
214+
selectionEnd = 20,
215+
visibleStart = 4,
216+
visibleEnd = 10
217+
)
218+
219+
whenever(memoRepository.getAll()).thenReturn(listOf(memo1, memo2))
220+
221+
// when
222+
val result = MemoService(project).getAllMemos()
223+
224+
// then
225+
assertEquals(2, result.size)
226+
assertEquals("메모1", result[0].content)
227+
assertEquals("메모2", result[1].content)
228+
assertEquals("/path/to/file1", result[0].filePath)
229+
assertEquals("/path/to/file2", result[1].filePath)
230+
}
231+
232+
fun `test 메모 전체 조회 기능 실패 - 예외 발생시 빈 리스트`() {
233+
// given
234+
whenever(memoRepository.getAll()).thenThrow(RuntimeException("DB error"))
235+
236+
// when
237+
val result = MemoService(project).getAllMemos()
238+
239+
// then
240+
assertTrue(result.isEmpty(), "예외 발생 시 빈 리스트를 반환해야 합니다.")
241+
}
242+
170243
}
244+

0 commit comments

Comments
 (0)