Skip to content

Commit 2b236d2

Browse files
committed
Unit test client initialization
1 parent f77341f commit 2b236d2

File tree

3 files changed

+72
-17
lines changed

3 files changed

+72
-17
lines changed

Sources/Supabase/SupabaseClient.swift

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,24 @@ import SupabaseStorage
88

99
/// Supabase Client.
1010
public class SupabaseClient {
11-
private let supabaseURL: URL
12-
private let supabaseKey: String
13-
private let schema: String
14-
11+
let supabaseURL: URL
12+
let supabaseKey: String
13+
let storageURL: URL
14+
let databaseURL: URL
15+
let realtimeURL: URL
16+
let authURL: URL
1517
let functionsURL: URL
1618

19+
let schema: String
20+
1721
/// Supabase Auth allows you to create and manage user sessions for access to data that is secured
1822
/// by access policies.
1923
public let auth: GoTrueClient
2024

2125
/// Supabase Storage allows you to manage user-generated content, such as photos or videos.
2226
public var storage: SupabaseStorageClient {
2327
SupabaseStorageClient(
24-
url: supabaseURL.appendingPathComponent("/storage/v1").absoluteString,
28+
url: storageURL.absoluteString,
2529
headers: defaultHeaders,
2630
http: self
2731
)
@@ -30,7 +34,7 @@ public class SupabaseClient {
3034
/// Database client for Supabase.
3135
public var database: PostgrestClient {
3236
PostgrestClient(
33-
url: supabaseURL.appendingPathComponent("/rest/v1"),
37+
url: databaseURL,
3438
headers: defaultHeaders,
3539
schema: schema,
3640
apiClientDelegate: self
@@ -40,7 +44,7 @@ public class SupabaseClient {
4044
/// Realtime client for Supabase
4145
public var realtime: RealtimeClient {
4246
RealtimeClient(
43-
endPoint: supabaseURL.appendingPathComponent("/realtime/v1").absoluteString,
47+
endPoint: realtimeURL.absoluteString,
4448
params: defaultHeaders
4549
)
4650
}
@@ -54,7 +58,7 @@ public class SupabaseClient {
5458
)
5559
}
5660

57-
private var defaultHeaders: [String: String]
61+
private(set) var defaultHeaders: [String: String]
5862

5963
/// Create a new client.
6064
public init(
@@ -64,6 +68,11 @@ public class SupabaseClient {
6468
) {
6569
self.supabaseURL = supabaseURL
6670
self.supabaseKey = supabaseKey
71+
authURL = supabaseURL.appendingPathComponent("/auth/v1")
72+
storageURL = supabaseURL.appendingPathComponent("/storage/v1")
73+
databaseURL = supabaseURL.appendingPathComponent("/rest/v1")
74+
realtimeURL = supabaseURL.appendingPathComponent("/realtime/v1")
75+
6776
schema = options.db.schema
6877
httpClient = options.global.httpClient
6978

@@ -73,7 +82,7 @@ public class SupabaseClient {
7382
].merging(options.global.headers) { _, new in new }
7483

7584
auth = GoTrueClient(
76-
url: supabaseURL.appendingPathComponent("/auth/v1"),
85+
url: authURL,
7786
headers: defaultHeaders,
7887
localStorage: options.auth.storage
7988
)

Tests/SupabaseTests/SupabaseClientTests.swift

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,53 @@
1+
import GoTrue
12
@testable import Supabase
23
import XCTest
34

5+
final class GoTrueLocalStorageMock: GoTrueLocalStorage {
6+
func store(key _: String, value _: Data) throws {}
7+
8+
func retrieve(key _: String) throws -> Data? {
9+
nil
10+
}
11+
12+
func remove(key _: String) throws {}
13+
}
14+
415
final class SupabaseClientTests: XCTestCase {
16+
func testClientInitialization() {
17+
let customSchema = "custom_schema"
18+
let localStorage = GoTrueLocalStorageMock()
19+
let customHeaders = ["header_field": "header_value"]
20+
let httpClient = SupabaseClient.HTTPClient(storage: nil)
21+
22+
let client = SupabaseClient(
23+
supabaseURL: URL(string: "https://project-ref.supabase.co")!,
24+
supabaseKey: "ANON_KEY",
25+
options: SupabaseClientOptions(
26+
db: SupabaseClientOptions.DatabaseOptions(schema: customSchema),
27+
auth: SupabaseClientOptions.AuthOptions(storage: localStorage),
28+
global: SupabaseClientOptions.GlobalOptions(
29+
headers: customHeaders,
30+
httpClient: httpClient
31+
)
32+
)
33+
)
34+
35+
XCTAssertEqual(client.supabaseURL.absoluteString, "https://project-ref.supabase.co")
36+
XCTAssertEqual(client.supabaseKey, "ANON_KEY")
37+
XCTAssertEqual(client.authURL.absoluteString, "https://project-ref.supabase.co/auth/v1")
38+
XCTAssertEqual(client.storageURL.absoluteString, "https://project-ref.supabase.co/storage/v1")
39+
XCTAssertEqual(client.databaseURL.absoluteString, "https://project-ref.supabase.co/rest/v1")
40+
XCTAssertEqual(client.realtimeURL.absoluteString, "https://project-ref.supabase.co/realtime/v1")
41+
XCTAssertEqual(
42+
client.defaultHeaders,
43+
[
44+
"X-Client-Info": "supabase-swift/\(Supabase.version)",
45+
"apikey": "ANON_KEY",
46+
"header_field": "header_value",
47+
]
48+
)
49+
}
50+
551
func testFunctionsURL() {
652
var client = SupabaseClient(
753
supabaseURL: URL(string: "https://project-ref.supabase.co")!,

supabase-swift.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)