-
-
Notifications
You must be signed in to change notification settings - Fork 467
Expand file tree
/
Copy pathSentrySQLiteStatementTest.kt
More file actions
147 lines (121 loc) · 4.19 KB
/
SentrySQLiteStatementTest.kt
File metadata and controls
147 lines (121 loc) · 4.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package io.sentry.android.sqlite
import androidx.sqlite.SQLiteStatement
import io.sentry.IScopes
import io.sentry.ISpan
import io.sentry.SentryOptions
import io.sentry.SentryTracer
import io.sentry.SpanStatus
import io.sentry.TransactionContext
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertFalse
import kotlin.test.assertTrue
import org.mockito.kotlin.inOrder
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
class SentrySQLiteStatementTest {
private class Fixture {
private val scopes = mock<IScopes>()
private val spanManager = SQLiteSpanManager(scopes)
val mockStatement = mock<SQLiteStatement>()
lateinit var sentryTracer: SentryTracer
lateinit var options: SentryOptions
fun getSut(sql: String, isSpanActive: Boolean = true): SentrySQLiteStatement {
options = SentryOptions().apply { dsn = "https://key@sentry.io/proj" }
whenever(scopes.options).thenReturn(options)
sentryTracer = SentryTracer(TransactionContext("name", "op"), scopes)
if (isSpanActive) {
whenever(scopes.span).thenReturn(sentryTracer)
}
return SentrySQLiteStatement(mockStatement, spanManager, sql)
}
}
private val fixture = Fixture()
@Test
fun `all calls are propagated to the delegate`() {
val sql = "SELECT * FROM users"
val statement = fixture.getSut(sql)
whenever(fixture.mockStatement.step()).thenReturn(true)
inOrder(fixture.mockStatement) {
statement.step()
verify(fixture.mockStatement).step()
statement.reset()
verify(fixture.mockStatement).reset()
}
}
@Test
fun `step creates a span if a span is running`() {
val sql = "SELECT * FROM users"
val sut = fixture.getSut(sql)
whenever(fixture.mockStatement.step()).thenReturn(true)
assertEquals(0, fixture.sentryTracer.children.size)
sut.step()
val span = fixture.sentryTracer.children.firstOrNull()
assertSqlSpanCreated(sql, span)
}
@Test
fun `step does not create a span if no span is running`() {
val sql = "SELECT * FROM users"
val sut = fixture.getSut(sql, isSpanActive = false)
whenever(fixture.mockStatement.step()).thenReturn(true)
sut.step()
assertEquals(0, fixture.sentryTracer.children.size)
}
@Test
fun `multiple step calls only create one span`() {
val sql = "SELECT * FROM users"
val sut = fixture.getSut(sql)
whenever(fixture.mockStatement.step()).thenReturn(true, true, false)
assertEquals(0, fixture.sentryTracer.children.size)
// First step creates a span
sut.step()
assertEquals(1, fixture.sentryTracer.children.size)
// Second step doesn't create a new span
sut.step()
assertEquals(1, fixture.sentryTracer.children.size)
// Third step still doesn't create a new span
sut.step()
assertEquals(1, fixture.sentryTracer.children.size)
val span = fixture.sentryTracer.children.firstOrNull()
assertSqlSpanCreated(sql, span)
}
@Test
fun `reset allows step to create a new span`() {
val sql = "SELECT * FROM users"
val sut = fixture.getSut(sql)
whenever(fixture.mockStatement.step()).thenReturn(true)
assertEquals(0, fixture.sentryTracer.children.size)
// First step creates a span
sut.step()
assertEquals(1, fixture.sentryTracer.children.size)
// Reset the statement
sut.reset()
// Next step creates a new span
sut.step()
assertEquals(2, fixture.sentryTracer.children.size)
// Verify both spans were created correctly
fixture.sentryTracer.children.forEach { span ->
assertSqlSpanCreated(sql, span)
}
}
@Test
fun `step returns delegate result`() {
val sql = "SELECT * FROM users"
val sut = fixture.getSut(sql)
whenever(fixture.mockStatement.step()).thenReturn(true, false)
val result1 = sut.step()
assertTrue(result1)
sut.reset()
val result2 = sut.step()
assertFalse(result2)
}
private fun assertSqlSpanCreated(sql: String, span: ISpan?) {
assertNotNull(span)
assertEquals("db.sql.query", span.operation)
assertEquals(sql, span.description)
assertEquals(SpanStatus.OK, span.status)
assertTrue(span.isFinished)
}
}