Skip to content

Commit 75caf23

Browse files
jpicklykclaude
andcommitted
test: add ResultTest covering all Result utility methods
Adds direct unit tests for getOrElse, getOrNull, map, isSuccess, isError, onSuccess, and onError — previously only exercised indirectly through tool integration tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent f70f9e1 commit 75caf23

File tree

1 file changed

+141
-0
lines changed
  • current/src/test/kotlin/io/github/jpicklyk/mcptask/current/domain/repository

1 file changed

+141
-0
lines changed
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package io.github.jpicklyk.mcptask.current.domain.repository
2+
3+
import org.junit.jupiter.api.Assertions.*
4+
import org.junit.jupiter.api.Test
5+
import java.util.UUID
6+
7+
class ResultTest {
8+
9+
private val testError = RepositoryError.NotFound(UUID.randomUUID(), "Not found")
10+
11+
// ──────────────────────────────────────────────
12+
// getOrElse
13+
// ──────────────────────────────────────────────
14+
15+
@Test
16+
fun `getOrElse returns data on success`() {
17+
val result: Result<String> = Result.Success("hello")
18+
assertEquals("hello", result.getOrElse("default"))
19+
}
20+
21+
@Test
22+
fun `getOrElse returns default on error`() {
23+
val result: Result<String> = Result.Error(testError)
24+
assertEquals("default", result.getOrElse("default"))
25+
}
26+
27+
@Test
28+
fun `getOrElse returns empty list on error for list types`() {
29+
val result: Result<List<Int>> = Result.Error(testError)
30+
assertEquals(emptyList<Int>(), result.getOrElse(emptyList()))
31+
}
32+
33+
@Test
34+
fun `getOrElse returns populated list on success`() {
35+
val result: Result<List<Int>> = Result.Success(listOf(1, 2, 3))
36+
assertEquals(listOf(1, 2, 3), result.getOrElse(emptyList()))
37+
}
38+
39+
// ──────────────────────────────────────────────
40+
// getOrNull
41+
// ──────────────────────────────────────────────
42+
43+
@Test
44+
fun `getOrNull returns data on success`() {
45+
val result: Result<String> = Result.Success("hello")
46+
assertEquals("hello", result.getOrNull())
47+
}
48+
49+
@Test
50+
fun `getOrNull returns null on error`() {
51+
val result: Result<String> = Result.Error(testError)
52+
assertNull(result.getOrNull())
53+
}
54+
55+
// ──────────────────────────────────────────────
56+
// map
57+
// ──────────────────────────────────────────────
58+
59+
@Test
60+
fun `map transforms success data`() {
61+
val result: Result<Int> = Result.Success(5)
62+
val mapped = result.map { it * 2 }
63+
assertEquals(10, (mapped as Result.Success).data)
64+
}
65+
66+
@Test
67+
fun `map passes error through unchanged`() {
68+
val result: Result<Int> = Result.Error(testError)
69+
val mapped = result.map { it * 2 }
70+
assertTrue(mapped.isError())
71+
assertEquals(testError, (mapped as Result.Error).error)
72+
}
73+
74+
// ──────────────────────────────────────────────
75+
// isSuccess / isError
76+
// ──────────────────────────────────────────────
77+
78+
@Test
79+
fun `isSuccess returns true for success`() {
80+
assertTrue(Result.Success("data").isSuccess())
81+
}
82+
83+
@Test
84+
fun `isSuccess returns false for error`() {
85+
assertFalse(Result.Error(testError).isSuccess())
86+
}
87+
88+
@Test
89+
fun `isError returns true for error`() {
90+
assertTrue(Result.Error(testError).isError())
91+
}
92+
93+
@Test
94+
fun `isError returns false for success`() {
95+
assertFalse(Result.Success("data").isError())
96+
}
97+
98+
// ──────────────────────────────────────────────
99+
// onSuccess / onError callbacks
100+
// ──────────────────────────────────────────────
101+
102+
@Test
103+
fun `onSuccess executes block for success`() {
104+
var captured: String? = null
105+
Result.Success("hello").onSuccess { captured = it }
106+
assertEquals("hello", captured)
107+
}
108+
109+
@Test
110+
fun `onSuccess does not execute block for error`() {
111+
var executed = false
112+
Result.Error(testError).onSuccess { executed = true }
113+
assertFalse(executed)
114+
}
115+
116+
@Test
117+
fun `onError executes block for error`() {
118+
var captured: RepositoryError? = null
119+
Result.Error(testError).onError { captured = it }
120+
assertEquals(testError, captured)
121+
}
122+
123+
@Test
124+
fun `onError does not execute block for success`() {
125+
var executed = false
126+
Result.Success("hello").onError { executed = true }
127+
assertFalse(executed)
128+
}
129+
130+
@Test
131+
fun `onSuccess returns same result for chaining`() {
132+
val result = Result.Success("hello")
133+
assertSame(result, result.onSuccess { })
134+
}
135+
136+
@Test
137+
fun `onError returns same result for chaining`() {
138+
val result: Result<String> = Result.Error(testError)
139+
assertSame(result, result.onError { })
140+
}
141+
}

0 commit comments

Comments
 (0)