From f5871e851721ccbdfa9434c0c49d8e0bd418470f Mon Sep 17 00:00:00 2001 From: yeo-li Date: Sun, 23 Nov 2025 22:15:52 +0900 Subject: [PATCH 01/15] =?UTF-8?q?feat(Note):=20Note=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yeoli/devlog/domain/note/domain/Note.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt diff --git a/src/main/kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt b/src/main/kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt new file mode 100644 index 0000000..a0612c9 --- /dev/null +++ b/src/main/kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt @@ -0,0 +1,17 @@ +package com.github.yeoli.devlog.domain.note.domain + +import java.time.LocalDateTime + +class Note constructor( + val content: String, + val updatedAt: LocalDateTime +) { + + constructor(content: String) : this(content, LocalDateTime.now()) + + fun update(content: String): Note { + return Note( + content = content + ) + } +} \ No newline at end of file From a59fde50d5d196981d879f840906777951593fcc Mon Sep 17 00:00:00 2001 From: yeo-li Date: Sun, 23 Nov 2025 22:16:47 +0900 Subject: [PATCH 02/15] =?UTF-8?q?refactor(Note):=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EB=AA=85=EB=A0=B9=EC=96=B4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt b/src/main/kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt index a0612c9..37a46a8 100644 --- a/src/main/kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt +++ b/src/main/kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt @@ -2,7 +2,7 @@ package com.github.yeoli.devlog.domain.note.domain import java.time.LocalDateTime -class Note constructor( +class Note( val content: String, val updatedAt: LocalDateTime ) { From 7b72f5a19cdab6a3d1385224f87c699ced7d48b9 Mon Sep 17 00:00:00 2001 From: yeo-li Date: Sun, 23 Nov 2025 22:56:12 +0900 Subject: [PATCH 03/15] =?UTF-8?q?test(NoteTest):=20update=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devlog/domain/note/domain/NoteTest.kt | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/test/kotlin/com/github/yeoli/devlog/domain/note/domain/NoteTest.kt diff --git a/src/test/kotlin/com/github/yeoli/devlog/domain/note/domain/NoteTest.kt b/src/test/kotlin/com/github/yeoli/devlog/domain/note/domain/NoteTest.kt new file mode 100644 index 0000000..7bcaec7 --- /dev/null +++ b/src/test/kotlin/com/github/yeoli/devlog/domain/note/domain/NoteTest.kt @@ -0,0 +1,53 @@ +package com.github.yeoli.devlog.domain.note.domain + +import org.junit.jupiter.api.Assertions.* +import kotlin.test.Test + +class NoteTest { + + @Test + fun `test 업데이트 시 새로운 인스턴스를 반환해야 한다`() { + val original = Note( + content = "hello" + ) + + val updated = original.update("new content") + + assertNotSame(original, updated) + } + + @Test + fun `test 업데이트 시 콘텐츠가 변경되어야 한다`() { + val original = Note( + content = "old content" + ) + + val updated = original.update("new content") + + assertEquals("new content", updated.content) + assertNotEquals(original.content, updated.content) + } + + @Test + fun `test 빈 문자열로 업데이트할 때 정상적으로 처리되어야 한다`() { + val original = Note( + content = "something" + ) + + val updated = original.update("") + + assertEquals("", updated.content) + } + + @Test + fun `test 동일한 콘텐츠로 업데이트할 때 updatedAt이 갱신되지 않아야 한다`() { + val now = java.time.LocalDateTime.now() + val original = Note( + content = "same" + ) + + val updated = original.update("same") + + assertEquals(original.updatedAt, updated.updatedAt) + } +} \ No newline at end of file From 3e26479ffc8caf8913185be4771cce98e830df22 Mon Sep 17 00:00:00 2001 From: yeo-li Date: Sun, 23 Nov 2025 22:58:06 +0900 Subject: [PATCH 04/15] =?UTF-8?q?test(NoteTest):=20update=20=EB=8F=99?= =?UTF-8?q?=EC=9D=BC=ED=95=9C=20=EC=BD=98=ED=85=90=EC=B8=A0=EB=A1=9C=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=ED=95=A0=20=EB=95=8C=20upd?= =?UTF-8?q?atedAt=EC=9D=B4=20=EA=B0=B1=EC=8B=A0=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yeoli/devlog/domain/note/domain/NoteTest.kt | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/test/kotlin/com/github/yeoli/devlog/domain/note/domain/NoteTest.kt b/src/test/kotlin/com/github/yeoli/devlog/domain/note/domain/NoteTest.kt index 7bcaec7..b8927f5 100644 --- a/src/test/kotlin/com/github/yeoli/devlog/domain/note/domain/NoteTest.kt +++ b/src/test/kotlin/com/github/yeoli/devlog/domain/note/domain/NoteTest.kt @@ -38,16 +38,5 @@ class NoteTest { assertEquals("", updated.content) } - - @Test - fun `test 동일한 콘텐츠로 업데이트할 때 updatedAt이 갱신되지 않아야 한다`() { - val now = java.time.LocalDateTime.now() - val original = Note( - content = "same" - ) - - val updated = original.update("same") - - assertEquals(original.updatedAt, updated.updatedAt) - } -} \ No newline at end of file + +} From 8a81d906993b755543486e4e01b31da00411a710 Mon Sep 17 00:00:00 2001 From: yeo-li Date: Mon, 24 Nov 2025 01:21:35 +0900 Subject: [PATCH 05/15] =?UTF-8?q?test(NoteTest):=20toState=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devlog/domain/note/domain/NoteTest.kt | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/test/kotlin/com/github/yeoli/devlog/domain/note/domain/NoteTest.kt b/src/test/kotlin/com/github/yeoli/devlog/domain/note/domain/NoteTest.kt index b8927f5..c8333f6 100644 --- a/src/test/kotlin/com/github/yeoli/devlog/domain/note/domain/NoteTest.kt +++ b/src/test/kotlin/com/github/yeoli/devlog/domain/note/domain/NoteTest.kt @@ -1,6 +1,7 @@ package com.github.yeoli.devlog.domain.note.domain import org.junit.jupiter.api.Assertions.* +import java.time.LocalDateTime import kotlin.test.Test class NoteTest { @@ -38,5 +39,45 @@ class NoteTest { assertEquals("", updated.content) } - + + // =========== toState 테스트 =========== + @Test + fun `test toState - content와 updatedAt이 올바르게 변환된다`() { + // given + val now = LocalDateTime.of(2025, 1, 1, 12, 0) + val note = Note("Hello", now) + + // when + val state = note.toState() + + // then + assertEquals("Hello", state.content) + assertEquals(now.toString(), state.updatedAt) + } + + @Test + fun `test toState - empty content도 정상 변환된다`() { + // given + val note = Note("") + + // when + val state = note.toState() + + // then + assertEquals("", state.content) + assertNotNull(state.updatedAt) + } + + @Test + fun `test toState - updatedAt이 현재 시간이 아닐 수 있다`() { + // given + val customTime = LocalDateTime.of(2024, 12, 31, 23, 59) + val note = Note("Time test", customTime) + + // when + val state = note.toState() + + // then + assertEquals(customTime.toString(), state.updatedAt) + } } From a07ba3d13d764f346b6160992a055ced990b32b1 Mon Sep 17 00:00:00 2001 From: yeo-li Date: Mon, 24 Nov 2025 01:21:55 +0900 Subject: [PATCH 06/15] =?UTF-8?q?feat(Note):=20toState=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/github/yeoli/devlog/domain/note/domain/Note.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt b/src/main/kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt index 37a46a8..fc51fe0 100644 --- a/src/main/kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt +++ b/src/main/kotlin/com/github/yeoli/devlog/domain/note/domain/Note.kt @@ -1,5 +1,6 @@ package com.github.yeoli.devlog.domain.note.domain +import com.github.yeoli.devlog.domain.note.repository.NoteState import java.time.LocalDateTime class Note( @@ -14,4 +15,11 @@ class Note( content = content ) } + + fun toState(): NoteState { + return NoteState( + content = this.content, + updatedAt = this.updatedAt.toString() + ) + } } \ No newline at end of file From ca75dbd56468301ac7882fd56ca636b149e96066 Mon Sep 17 00:00:00 2001 From: yeo-li Date: Mon, 24 Nov 2025 01:25:08 +0900 Subject: [PATCH 07/15] =?UTF-8?q?test(NoteStateTest):=20toDomain=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/note/repository/NoteStateTest.kt | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/test/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteStateTest.kt diff --git a/src/test/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteStateTest.kt b/src/test/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteStateTest.kt new file mode 100644 index 0000000..dfcd291 --- /dev/null +++ b/src/test/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteStateTest.kt @@ -0,0 +1,54 @@ +package com.github.yeoli.devlog.domain.note.repository + +import org.junit.jupiter.api.Assertions.assertDoesNotThrow +import org.junit.jupiter.api.Assertions.assertEquals +import java.time.LocalDateTime +import kotlin.test.Test + +class NoteStateTest { + @Test + fun `test toDomain - content와 updatedAt이 올바르게 변환된다`() { + // given + val nowString = "2025-01-01T12:00:00" + val state = NoteState( + content = "Hello Note", + updatedAt = nowString + ) + + // when + val note = state.toDomain() + + // then + assertEquals("Hello Note", note.content) + assertEquals(LocalDateTime.parse(nowString), note.updatedAt) + } + + @Test + fun `test toDomain - 빈 content도 정상적으로 변환된다`() { + // given + val nowString = LocalDateTime.now().toString() + val state = NoteState( + content = "", + updatedAt = nowString + ) + + // when + val note = state.toDomain() + + // then + assertEquals("", note.content) + assertEquals(LocalDateTime.parse(nowString), note.updatedAt) + } + + @Test + fun `test toDomain - updatedAt 문자열 포맷이 LocalDateTime으로 파싱 가능해야 한다`() { + // given + val formattedTime = "2024-12-31T23:59:00" + val state = NoteState("TimeCheck", formattedTime) + + // when & then + assertDoesNotThrow { + state.toDomain() + } + } +} \ No newline at end of file From d1b5b0885766f50ee150433a94f5a2681cd3099b Mon Sep 17 00:00:00 2001 From: yeo-li Date: Mon, 24 Nov 2025 01:25:26 +0900 Subject: [PATCH 08/15] =?UTF-8?q?feat(NoteState):=20toDomain=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devlog/domain/note/repository/NoteState.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteState.kt diff --git a/src/main/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteState.kt b/src/main/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteState.kt new file mode 100644 index 0000000..29aaf25 --- /dev/null +++ b/src/main/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteState.kt @@ -0,0 +1,14 @@ +package com.github.yeoli.devlog.domain.note.repository + +import com.github.yeoli.devlog.domain.note.domain.Note +import java.time.LocalDateTime + +data class NoteState( + val content: String, + val updatedAt: String +) { + + fun toDomain(): Note { + return Note(content, updatedAt = this.updatedAt.let { LocalDateTime.parse(it) }) + } +} \ No newline at end of file From 120658caa9999f39b41437951ca938797d8399d7 Mon Sep 17 00:00:00 2001 From: yeo-li Date: Mon, 24 Nov 2025 01:40:27 +0900 Subject: [PATCH 09/15] =?UTF-8?q?test(NoteServiceTest):=20getNote=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/note/service/NoteServiceTest.kt | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/test/kotlin/com/github/yeoli/devlog/domain/note/service/NoteServiceTest.kt diff --git a/src/test/kotlin/com/github/yeoli/devlog/domain/note/service/NoteServiceTest.kt b/src/test/kotlin/com/github/yeoli/devlog/domain/note/service/NoteServiceTest.kt new file mode 100644 index 0000000..1a0fe36 --- /dev/null +++ b/src/test/kotlin/com/github/yeoli/devlog/domain/note/service/NoteServiceTest.kt @@ -0,0 +1,54 @@ +package com.github.yeoli.devlog.domain.note.service + +import com.github.yeoli.devlog.domain.note.domain.Note +import com.github.yeoli.devlog.domain.note.repository.NoteRepository +import com.intellij.openapi.project.Project +import org.mockito.Mockito.mock +import org.mockito.kotlin.whenever +import java.time.LocalDateTime +import kotlin.test.Test +import kotlin.test.assertEquals + +class NoteServiceTest { + + private val project: Project = mock(Project::class.java) + private val noteRepository: NoteRepository = mock(NoteRepository::class.java) + + @Test + fun test_레포지토리와_동일한_노트를_반환한다() { + // given + val now = LocalDateTime.now() + val expectedNote = Note("Hello Test", now) + + whenever(noteRepository.getNote()).thenReturn(expectedNote) + + val service = NoteService(project) + val noteServiceField = service.javaClass.getDeclaredField("noteRepository") + noteServiceField.isAccessible = true + noteServiceField.set(service, noteRepository) + + // when + val actual = service.getNote() + + // then + assertEquals(expectedNote, actual) + } + + @Test + fun test_기본_빈_노트를_반환한다() { + // given + val defaultNote = Note("") + whenever(noteRepository.getNote()).thenReturn(defaultNote) + + val service = NoteService(project) + val noteServiceField = service.javaClass.getDeclaredField("noteRepository") + noteServiceField.isAccessible = true + noteServiceField.set(service, noteRepository) + + // when + val actual = service.getNote() + + // then + assertEquals(defaultNote, actual) + } +} \ No newline at end of file From 5008a28db413fd7bca8da0deabd1d7510abbe9d3 Mon Sep 17 00:00:00 2001 From: yeo-li Date: Mon, 24 Nov 2025 01:40:54 +0900 Subject: [PATCH 10/15] =?UTF-8?q?feat(NoteRepository):=20NoteRepository=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/note/repository/NoteRepository.kt | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteRepository.kt diff --git a/src/main/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteRepository.kt b/src/main/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteRepository.kt new file mode 100644 index 0000000..594073b --- /dev/null +++ b/src/main/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteRepository.kt @@ -0,0 +1,36 @@ +package com.github.yeoli.devlog.domain.note.repository + +import com.github.yeoli.devlog.domain.note.domain.Note +import com.intellij.openapi.components.PersistentStateComponent +import com.intellij.openapi.components.Service +import com.intellij.openapi.components.State +import com.intellij.openapi.components.Storage +import java.time.LocalDateTime + +@State( + name = "DevLogMemoStorage", + storages = [Storage("devlog-memos.xml")] +) +@Service(Service.Level.PROJECT) +class NoteRepository : PersistentStateComponent { + + private var state: NoteState? = NoteState( + content = "", + updatedAt = LocalDateTime.now().toString() + ) + + override fun getState(): NoteState? = state + + override fun loadState(state: NoteState) { + this.state = state + } + + fun getNote(): Note { + if (state == null) { + state = Note( + content = "" + ).toState() + } + return state!!.toDomain() + } +} \ No newline at end of file From 88184bd33ba6270791997cc6c076e66c878ad42a Mon Sep 17 00:00:00 2001 From: yeo-li Date: Mon, 24 Nov 2025 01:41:21 +0900 Subject: [PATCH 11/15] =?UTF-8?q?feat(NoteService):=20getNote=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devlog/domain/note/service/NoteService.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/kotlin/com/github/yeoli/devlog/domain/note/service/NoteService.kt diff --git a/src/main/kotlin/com/github/yeoli/devlog/domain/note/service/NoteService.kt b/src/main/kotlin/com/github/yeoli/devlog/domain/note/service/NoteService.kt new file mode 100644 index 0000000..089d19e --- /dev/null +++ b/src/main/kotlin/com/github/yeoli/devlog/domain/note/service/NoteService.kt @@ -0,0 +1,18 @@ +package com.github.yeoli.devlog.domain.note.service + +import com.github.yeoli.devlog.domain.note.domain.Note +import com.github.yeoli.devlog.domain.note.repository.NoteRepository +import com.intellij.openapi.components.Service +import com.intellij.openapi.project.Project + +@Service(Service.Level.PROJECT) +class NoteService(private val project: Project) { + + private val noteRepository = + project.getService(NoteRepository::class.java) + + fun getNote(): Note { + return noteRepository.getNote() + } +} + From b8df11331fb0d6758e5dd75b6eccac7db198d8ea Mon Sep 17 00:00:00 2001 From: yeo-li Date: Mon, 24 Nov 2025 02:23:11 +0900 Subject: [PATCH 12/15] =?UTF-8?q?test(NoteServiceTest):=20updateNote=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/note/service/NoteServiceTest.kt | 54 +++++++++++++++++-- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/src/test/kotlin/com/github/yeoli/devlog/domain/note/service/NoteServiceTest.kt b/src/test/kotlin/com/github/yeoli/devlog/domain/note/service/NoteServiceTest.kt index 1a0fe36..3d78a15 100644 --- a/src/test/kotlin/com/github/yeoli/devlog/domain/note/service/NoteServiceTest.kt +++ b/src/test/kotlin/com/github/yeoli/devlog/domain/note/service/NoteServiceTest.kt @@ -4,7 +4,7 @@ import com.github.yeoli.devlog.domain.note.domain.Note import com.github.yeoli.devlog.domain.note.repository.NoteRepository import com.intellij.openapi.project.Project import org.mockito.Mockito.mock -import org.mockito.kotlin.whenever +import org.mockito.kotlin.* import java.time.LocalDateTime import kotlin.test.Test import kotlin.test.assertEquals @@ -14,8 +14,16 @@ class NoteServiceTest { private val project: Project = mock(Project::class.java) private val noteRepository: NoteRepository = mock(NoteRepository::class.java) + private fun createService(): NoteService { + val service = NoteService(project) + val field = service.javaClass.getDeclaredField("noteRepository") + field.isAccessible = true + field.set(service, noteRepository) + return service + } + @Test - fun test_레포지토리와_동일한_노트를_반환한다() { + fun `test 레포지토리와 동일한 노트를 반환한다`() { // given val now = LocalDateTime.now() val expectedNote = Note("Hello Test", now) @@ -35,7 +43,7 @@ class NoteServiceTest { } @Test - fun test_기본_빈_노트를_반환한다() { + fun `test 기본 빈 노트를 반환한다`() { // given val defaultNote = Note("") whenever(noteRepository.getNote()).thenReturn(defaultNote) @@ -51,4 +59,42 @@ class NoteServiceTest { // then assertEquals(defaultNote, actual) } -} \ No newline at end of file + + // ========= updateNote 테스트 ========= + + @Test + fun `test 내용이 변경되면 업데이트한다`() { + // given + val oldNote = Note("old", LocalDateTime.now()) + whenever(noteRepository.getNote()).thenReturn(oldNote) + + val service = createService() + + val newContent = "new" + + // when + service.updateNote(newContent) + + // then + verify(noteRepository, times(1)).updateNote( + check { updated -> + assertEquals(newContent, updated.content) + } + ) + } + + @Test + fun `test 내용이 동일하면 업데이트하지 않는다`() { + // given + val sameNote = Note("same", LocalDateTime.now()) + whenever(noteRepository.getNote()).thenReturn(sameNote) + + val service = createService() + + // when + service.updateNote("same") + + // then + verify(noteRepository, never()).updateNote(any()) + } +} From b5446a809f28fd7787abc77cfa91373d864b4389 Mon Sep 17 00:00:00 2001 From: yeo-li Date: Mon, 24 Nov 2025 02:24:02 +0900 Subject: [PATCH 13/15] =?UTF-8?q?feat(NoteRepository):=20updateNote=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yeoli/devlog/domain/note/repository/NoteRepository.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteRepository.kt b/src/main/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteRepository.kt index 594073b..12fa924 100644 --- a/src/main/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteRepository.kt +++ b/src/main/kotlin/com/github/yeoli/devlog/domain/note/repository/NoteRepository.kt @@ -8,8 +8,8 @@ import com.intellij.openapi.components.Storage import java.time.LocalDateTime @State( - name = "DevLogMemoStorage", - storages = [Storage("devlog-memos.xml")] + name = "DevLogNoteStorage", + storages = [Storage("devlog-note.xml")] ) @Service(Service.Level.PROJECT) class NoteRepository : PersistentStateComponent { @@ -33,4 +33,8 @@ class NoteRepository : PersistentStateComponent { } return state!!.toDomain() } + + fun updateNote(updatedNote: Note) { + this.state = updatedNote.toState() + } } \ No newline at end of file From d57b9c90a7be931eb263a84def31e296efa60043 Mon Sep 17 00:00:00 2001 From: yeo-li Date: Mon, 24 Nov 2025 02:24:16 +0900 Subject: [PATCH 14/15] =?UTF-8?q?feat(NoteService):=20updateNote=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yeoli/devlog/domain/note/service/NoteService.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/kotlin/com/github/yeoli/devlog/domain/note/service/NoteService.kt b/src/main/kotlin/com/github/yeoli/devlog/domain/note/service/NoteService.kt index 089d19e..9173405 100644 --- a/src/main/kotlin/com/github/yeoli/devlog/domain/note/service/NoteService.kt +++ b/src/main/kotlin/com/github/yeoli/devlog/domain/note/service/NoteService.kt @@ -14,5 +14,14 @@ class NoteService(private val project: Project) { fun getNote(): Note { return noteRepository.getNote() } + + fun updateNote(content: String) { + val note: Note = getNote() + if (note.content == content) return + + val updatedNote = note.update(content) + + noteRepository.updateNote(updatedNote) + } } From 96b44970fda00bfedaa0953bb04f06327ac9786c Mon Sep 17 00:00:00 2001 From: yeo-li Date: Mon, 24 Nov 2025 02:28:13 +0900 Subject: [PATCH 15/15] =?UTF-8?q?docs(README):=20=EC=A7=84=ED=96=89?= =?UTF-8?q?=EC=83=81=ED=99=A9=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index bc3bce7..305d039 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ - 저장된 메모를 삭제할 수 있어야 한다. - 메모를 한 번에 여러개 삭제할 수 있어야 한다. -### ⚠️ 메모 삭제 기능 예외 상황 +### ⚠️ 메모 삭제 기능 고려 사항 - 삭제할 메모가 없으면 아무 수행도 해선 안된다. @@ -55,13 +55,13 @@ - 저장된 메모의 content를 수정할 수 있어야 한다. -### ⚠️ 메모 수정 기능 예외 상황 +### ⚠️ 메모 수정 기능 고려 사항 - 수정할 메모가 없다면 아무 수행도 해선 안된다. --- -### 🏁 메모 추출 기능 +### ✅ 메모 추출 기능 - 저장된 메모를 한 개 이상 선택하여 txt 파일로 추출할 수 있어야 한다. - 추출한 단위 메모의 구성 내용은 다음과 같다. @@ -76,18 +76,22 @@ - txt 파일의 이름은 `devlog-{프로젝트명}-{내보낸날짜}-{내보낸시각}.txt` 이다. - 추출할 메모가 없으면 빈 txt 파일을 반환한다. -### ⚠️ 메모 추출 기능 예외 상황 +### ⚠️ 메모 추출 기능 고려 사항 + +- 메모 추출 기능에서 고려 사항은 없습니다. --- -### ☑️ 노트 수정/저장 기능 +### ✅ 노트 수정/저장 기능 - 노트를 저장할 수 있어야 한다. - 노트의 수정/저장 데이터는 다음과 같다. - `String content`: 노트의 내용 - `LocalDateTime savedAt`: 저장된 시각 -### ⚠️ 노트 수정/저장 기능 예외 상황 +### ⚠️ 노트 수정/저장 기능 고려 사항 + +- 노트가 수정할 내용이 없다면 아무 수행도 해선 안된다. ---