1+ package io.supabase.postgrest.builder
2+
3+ import assertk.assertThat
4+ import assertk.assertions.isEqualTo
5+ import io.mockk.mockk
6+ import org.apache.hc.core5.http.Method
7+ import org.junit.jupiter.api.BeforeEach
8+ import org.junit.jupiter.api.Nested
9+ import org.junit.jupiter.api.Test
10+ import java.net.URI
11+
12+ internal class PostgrestQueryBuilderTest {
13+
14+ private var queryBuilder: PostgrestQueryBuilder <Any >? = null
15+
16+ @BeforeEach
17+ fun beforeEach () {
18+ queryBuilder = PostgrestQueryBuilder (URI (" 123" ), mockk(), mockk(), emptyMap(), null )
19+ }
20+
21+ @Nested
22+ inner class Select {
23+
24+ @Test
25+ fun `basic select` () {
26+ queryBuilder!! .select(columns = " *" )
27+ assertMethod(Method .GET )
28+ assertSearchParam(" select" , " *" )
29+ }
30+
31+ @Test
32+ fun `select with head` () {
33+ queryBuilder!! .select(head = true )
34+ assertMethod(Method .HEAD )
35+ }
36+
37+ @Test
38+ fun `select with count` () {
39+ queryBuilder!! .select(count = Count .PLANNED )
40+ assertHeader(" Prefer" , " count=planned" )
41+ }
42+ }
43+
44+ @Nested
45+ inner class Insert {
46+
47+ private val value = mapOf (" foo" to " bar" )
48+
49+ @Test
50+ fun `insert single` () {
51+ queryBuilder!! .insert(value = value)
52+ assertMethod(Method .POST )
53+ assertBody(listOf (value))
54+ }
55+
56+ @Test
57+ fun `insert multiple` () {
58+ val values = listOf (value, value)
59+ queryBuilder!! .insert(values = values)
60+ assertBody(values)
61+ }
62+
63+ @Test
64+ fun `insert with count` () {
65+ queryBuilder!! .insert(value = value, count = Count .ESTIMATED )
66+ assertHeader(" Prefer" , " return=representation,count=estimated" )
67+ }
68+
69+ @Test
70+ fun `insert with different returning` () {
71+ queryBuilder!! .insert(value = value, returning = Returning .MINIMAL )
72+ assertHeader(" Prefer" , " return=minimal" )
73+ }
74+
75+ @Test
76+ fun `upsert` () {
77+ queryBuilder!! .insert(value = value, upsert = true )
78+ assertHeader(" Prefer" , " return=representation,resolution=merge-duplicates" )
79+ }
80+
81+ @Test
82+ fun `upsert with count` () {
83+ queryBuilder!! .insert(value = value, upsert = true , count = Count .EXACT )
84+ assertHeader(" Prefer" , " return=representation,resolution=merge-duplicates,count=exact" )
85+ }
86+
87+ @Test
88+ fun `upsert with onconflict` () {
89+ queryBuilder!! .insert(value = value, upsert = true , onConflict = " foobar" )
90+ assertHeader(" Prefer" , " return=representation,resolution=merge-duplicates" )
91+ assertSearchParam(" on_conflict" , " foobar" )
92+ }
93+ }
94+
95+ @Nested
96+ inner class Update {
97+
98+ private val value = mapOf (" foo" to " bar" )
99+
100+ @Test
101+ fun `update` () {
102+ queryBuilder!! .update(value = value)
103+ assertMethod(Method .PATCH )
104+ }
105+
106+ @Test
107+ fun `update with count` () {
108+ queryBuilder!! .update(value = value, count = Count .EXACT )
109+ assertHeader(" Prefer" , " return=representation,count=exact" )
110+ }
111+
112+ @Test
113+ fun `insert with different returning` () {
114+ queryBuilder!! .update(value = value, returning = Returning .MINIMAL )
115+ assertHeader(" Prefer" , " return=minimal" )
116+ }
117+ }
118+
119+ @Nested
120+ inner class Delete {
121+
122+ @Test
123+ fun `delete` () {
124+ queryBuilder!! .delete()
125+ assertMethod(Method .DELETE )
126+ }
127+
128+ @Test
129+ fun `delete with count` () {
130+ queryBuilder!! .delete(count = Count .PLANNED )
131+ assertHeader(" Prefer" , " return=representation,count=planned" )
132+ }
133+
134+ @Test
135+ fun `delete with different returning` () {
136+ queryBuilder!! .delete(returning = Returning .MINIMAL )
137+ assertHeader(" Prefer" , " return=minimal" )
138+ }
139+ }
140+
141+ @Nested
142+ inner class Rpc {
143+
144+ @Test
145+ fun `rpc without body` () {
146+ queryBuilder!! .rpc(null )
147+ assertMethod(Method .POST )
148+ assertBody(null )
149+ }
150+
151+ @Test
152+ fun `rpc with body` () {
153+ val params = mapOf (" foo" to " bar" )
154+ queryBuilder!! .rpc(params)
155+ assertBody(params)
156+ }
157+ }
158+
159+ private fun assertHeader (name : String , value : String ) {
160+ assertThat(queryBuilder!! .getHeaders()[name]).isEqualTo(value)
161+ }
162+
163+ private fun assertMethod (method : Method ) {
164+ assertThat(queryBuilder!! .getMethod()).isEqualTo(method)
165+ }
166+
167+ private fun assertBody (body : Any? ) {
168+ assertThat(queryBuilder!! .getBody()).isEqualTo(body)
169+ }
170+
171+ private fun assertSearchParam (name : String , value : String ) {
172+ val searchParams = queryBuilder!! .getSearchParams()
173+ assertThat(searchParams[name]).isEqualTo(value)
174+ }
175+
176+ }
0 commit comments