|
| 1 | +// |
| 2 | +// StorageClientIntegrationTests.swift |
| 3 | +// |
| 4 | +// |
| 5 | +// Created by Guilherme Souza on 04/11/23. |
| 6 | +// |
| 7 | + |
| 8 | +@testable import Storage |
| 9 | +import XCTest |
| 10 | + |
| 11 | +final class StorageClientIntegrationTests: XCTestCase { |
| 12 | + static var apiKey: String { |
| 13 | + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0" |
| 14 | + } |
| 15 | + |
| 16 | + static var supabaseURL: String { |
| 17 | + "http://localhost:54321/storage/v1" |
| 18 | + } |
| 19 | + |
| 20 | + let bucketId = "tests" |
| 21 | + |
| 22 | + let storage = SupabaseStorageClient.test(supabaseURL: supabaseURL, apiKey: apiKey) |
| 23 | + |
| 24 | + let uploadData = try? Data( |
| 25 | + contentsOf: URL( |
| 26 | + string: "https://raw.githubusercontent.com/supabase-community/storage-swift/main/README.md" |
| 27 | + )! |
| 28 | + ) |
| 29 | + |
| 30 | + override func setUp() async throws { |
| 31 | + try await super.setUp() |
| 32 | + |
| 33 | + try XCTSkipUnless( |
| 34 | + ProcessInfo.processInfo.environment["INTEGRATION_TESTS"] != nil, |
| 35 | + "INTEGRATION_TESTS not defined." |
| 36 | + ) |
| 37 | + |
| 38 | + try? await storage.emptyBucket(bucketId) |
| 39 | + try? await storage.deleteBucket(bucketId) |
| 40 | + |
| 41 | + try await storage.createBucket(bucketId, options: BucketOptions(public: true)) |
| 42 | + } |
| 43 | + |
| 44 | + func testUpdateBucket() async throws { |
| 45 | + var bucket = try await storage.getBucket(bucketId) |
| 46 | + XCTAssertTrue(bucket.isPublic) |
| 47 | + |
| 48 | + try await storage.updateBucket(bucketId, options: BucketOptions(public: false)) |
| 49 | + bucket = try await storage.getBucket(bucketId) |
| 50 | + XCTAssertFalse(bucket.isPublic) |
| 51 | + } |
| 52 | + |
| 53 | + func testListBuckets() async throws { |
| 54 | + let buckets = try await storage.listBuckets() |
| 55 | + XCTAssertTrue(buckets.contains { $0.id == bucketId }) |
| 56 | + } |
| 57 | + |
| 58 | + func testFileIntegration() async throws { |
| 59 | + var files = try await storage.from(bucketId).list() |
| 60 | + XCTAssertTrue(files.isEmpty) |
| 61 | + |
| 62 | + try await uploadTestData() |
| 63 | + |
| 64 | + files = try await storage.from(bucketId).list() |
| 65 | + XCTAssertEqual(files.map(\.name), ["README.md"]) |
| 66 | + |
| 67 | + let downloadedData = try await storage.from(bucketId).download(path: "README.md") |
| 68 | + XCTAssertEqual(downloadedData, uploadData) |
| 69 | + |
| 70 | + try await storage.from(bucketId).move(from: "README.md", to: "README_2.md") |
| 71 | + |
| 72 | + var searchedFiles = try await storage.from(bucketId) |
| 73 | + .list(options: .init(search: "README.md")) |
| 74 | + XCTAssertTrue(searchedFiles.isEmpty) |
| 75 | + |
| 76 | + try await storage.from(bucketId).copy(from: "README_2.md", to: "README.md") |
| 77 | + searchedFiles = try await storage.from(bucketId).list(options: .init(search: "README.md")) |
| 78 | + XCTAssertEqual(searchedFiles.map(\.name), ["README.md"]) |
| 79 | + |
| 80 | + let removedFiles = try await storage.from(bucketId).remove(paths: ["README_2.md"]) |
| 81 | + XCTAssertEqual(removedFiles.map(\.name), ["README_2.md"]) |
| 82 | + } |
| 83 | + |
| 84 | + func testGetPublicURL() async throws { |
| 85 | + try await uploadTestData() |
| 86 | + |
| 87 | + let path = "README.md" |
| 88 | + |
| 89 | + let baseUrl = try storage.from(bucketId).getPublicURL(path: path) |
| 90 | + XCTAssertEqual(baseUrl.absoluteString, "\(Self.supabaseURL)/object/public/\(bucketId)/\(path)") |
| 91 | + |
| 92 | + let baseUrlWithDownload = try storage.from(bucketId).getPublicURL( |
| 93 | + path: path, |
| 94 | + download: true |
| 95 | + ) |
| 96 | + XCTAssertEqual( |
| 97 | + baseUrlWithDownload.absoluteString, |
| 98 | + "\(Self.supabaseURL)/object/public/\(bucketId)/\(path)?download=" |
| 99 | + ) |
| 100 | + |
| 101 | + let baseUrlWithDownloadAndFileName = try storage.from(bucketId).getPublicURL( |
| 102 | + path: path, download: "test" |
| 103 | + ) |
| 104 | + XCTAssertEqual( |
| 105 | + baseUrlWithDownloadAndFileName.absoluteString, |
| 106 | + "\(Self.supabaseURL)/object/public/\(bucketId)/\(path)?download=test" |
| 107 | + ) |
| 108 | + |
| 109 | + let baseUrlWithAllOptions = try storage.from(bucketId).getPublicURL( |
| 110 | + path: path, download: "test", |
| 111 | + options: TransformOptions(width: 300, height: 300) |
| 112 | + ) |
| 113 | + XCTAssertEqual( |
| 114 | + baseUrlWithAllOptions.absoluteString, |
| 115 | + "\(Self.supabaseURL)/render/image/public/\(bucketId)/\(path)?download=test&width=300&height=300&resize=cover&quality=80&format=origin" |
| 116 | + ) |
| 117 | + } |
| 118 | + |
| 119 | + func testCreateSignedURL() async throws { |
| 120 | + try await uploadTestData() |
| 121 | + |
| 122 | + let path = "README.md" |
| 123 | + |
| 124 | + let url = try await storage.from(bucketId).createSignedURL( |
| 125 | + path: path, |
| 126 | + expiresIn: 60, |
| 127 | + download: "README_local.md" |
| 128 | + ) |
| 129 | + let components = try XCTUnwrap(URLComponents(url: url, resolvingAgainstBaseURL: true)) |
| 130 | + |
| 131 | + let downloadQuery = components.queryItems?.first(where: { $0.name == "download" }) |
| 132 | + XCTAssertEqual(downloadQuery?.value, "README_local.md") |
| 133 | + XCTAssertEqual(components.path, "/storage/v1/object/sign/\(bucketId)/\(path)") |
| 134 | + } |
| 135 | + |
| 136 | + func testUpdate() async throws { |
| 137 | + try await uploadTestData() |
| 138 | + |
| 139 | + let dataToUpdate = try? Data( |
| 140 | + contentsOf: URL( |
| 141 | + string: "https://raw.githubusercontent.com/supabase-community/supabase-swift/master/README.md" |
| 142 | + )! |
| 143 | + ) |
| 144 | + |
| 145 | + try await storage.from(bucketId).update( |
| 146 | + path: "README.md", |
| 147 | + file: File(name: "README.md", data: dataToUpdate ?? Data(), fileName: nil, contentType: nil) |
| 148 | + ) |
| 149 | + } |
| 150 | + |
| 151 | + private func uploadTestData() async throws { |
| 152 | + let file = File( |
| 153 | + name: "README.md", data: uploadData ?? Data(), fileName: "README.md", contentType: "text/html" |
| 154 | + ) |
| 155 | + _ = try await storage.from(bucketId).upload( |
| 156 | + path: "README.md", file: file, fileOptions: FileOptions(cacheControl: "3600") |
| 157 | + ) |
| 158 | + } |
| 159 | +} |
0 commit comments