Skip to content
This repository was archived by the owner on Nov 7, 2023. It is now read-only.

Commit 4e98662

Browse files
committedFeb 3, 2021
Tests for query builder, fix count
1 parent d986e94 commit 4e98662

File tree

4 files changed

+205
-13
lines changed

4 files changed

+205
-13
lines changed
 

‎build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ plugins {
1212
id "com.jfrog.bintray" version "1.8.5"
1313
}
1414

15-
String currentVersion = '0.1.0'
15+
String currentVersion = '0.2.0'
1616

1717
group = 'io.supabase'
1818
version = currentVersion

‎src/main/kotlin/io/supabase/postgrest/builder/PostgrestBuilder.kt

+12
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,18 @@ open class PostgrestBuilder<T : Any> {
6161
return searchParams
6262
}
6363

64+
fun getBody(): Any? {
65+
return this.body
66+
}
67+
68+
fun getHeaders(): Map<String, String> {
69+
return this.headers
70+
}
71+
72+
fun getMethod(): Method? {
73+
return this.method
74+
}
75+
6476
fun execute(): PostgrestHttpResponse {
6577
checkNotNull(method) { "Method cannot be null" }
6678

‎src/main/kotlin/io/supabase/postgrest/builder/PostgrestQueryBuilder.kt

+16-12
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import java.net.URI
88
class PostgrestQueryBuilder<T : Any>(url: URI, postgrestHttpClient: PostgrestHttpClient, jsonConverter: PostgrestJsonConverter, defaultHeaders: Map<String, String>, schema: String?)
99
: PostgrestBuilder<T>(url, postgrestHttpClient, jsonConverter, defaultHeaders, schema) {
1010

11+
companion object {
12+
const val HEADER_PREFER = "Prefer"
13+
}
14+
1115
/**
1216
* Performs vertical filtering with SELECT.
1317
*
@@ -20,18 +24,18 @@ class PostgrestQueryBuilder<T : Any>(url: URI, postgrestHttpClient: PostgrestHtt
2024
head: Boolean = false,
2125
count: Count? = null
2226
): PostgrestFilterBuilder<T> {
23-
setMethod(Method.GET)
27+
if (head) {
28+
setMethod(Method.HEAD)
29+
} else {
30+
setMethod(Method.GET)
31+
}
2432

2533
val cleanedColumns = cleanColumns(columns)
2634

2735
setSearchParam("select", cleanedColumns)
2836

2937
if (count != null) {
30-
setHeader("Prefer", "count=${count.identifier}")
31-
}
32-
33-
if (head) {
34-
setMethod(Method.HEAD)
38+
setHeader(HEADER_PREFER, "count=${count.identifier}")
3539
}
3640

3741
return PostgrestFilterBuilder(this)
@@ -55,10 +59,10 @@ class PostgrestQueryBuilder<T : Any>(url: URI, postgrestHttpClient: PostgrestHtt
5559
setBody(values)
5660

5761
if (count != null) {
58-
preferHeaders.add("count=${count}")
62+
preferHeaders.add("count=${count.identifier}")
5963
}
6064

61-
setHeader("Prefer", preferHeaders.joinToString(","))
65+
setHeader(HEADER_PREFER, preferHeaders.joinToString(","))
6266

6367
return PostgrestFilterBuilder(this)
6468
}
@@ -88,9 +92,9 @@ class PostgrestQueryBuilder<T : Any>(url: URI, postgrestHttpClient: PostgrestHtt
8892
val prefersHeaders = mutableListOf("return=${returning.identifier}")
8993

9094
if (count != null) {
91-
prefersHeaders.add("count=${count}")
95+
prefersHeaders.add("count=${count.identifier}")
9296
}
93-
setHeader("Prefer", prefersHeaders.joinToString(","))
97+
setHeader(HEADER_PREFER, prefersHeaders.joinToString(","))
9498

9599
return PostgrestFilterBuilder(this)
96100
}
@@ -105,9 +109,9 @@ class PostgrestQueryBuilder<T : Any>(url: URI, postgrestHttpClient: PostgrestHtt
105109

106110
val prefersHeaders = mutableListOf("return=${returning.identifier}")
107111
if (count != null) {
108-
prefersHeaders.add("count=${count}")
112+
prefersHeaders.add("count=${count.identifier}")
109113
}
110-
setHeader("Prefer", prefersHeaders.joinToString(","))
114+
setHeader(HEADER_PREFER, prefersHeaders.joinToString(","))
111115

112116
return PostgrestFilterBuilder(this)
113117
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
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

Comments
 (0)
This repository has been archived.