diff --git a/Sources/App/Commands/Analyze.swift b/Sources/App/Commands/Analyze.swift index b9da6ab41..1b7378a49 100644 --- a/Sources/App/Commands/Analyze.swift +++ b/Sources/App/Commands/Analyze.swift @@ -196,7 +196,7 @@ extension Analyze { } for (version, pkgInfo) in versionsPkgInfo { - try await updateVersion(on: tx, version: version, packageInfo: pkgInfo).get() + try await updateVersion(on: tx, version: version, packageInfo: pkgInfo) try await recreateProducts(on: tx, version: version, manifest: pkgInfo.packageManifest) try await recreateTargets(on: tx, version: version, manifest: pkgInfo.packageManifest) } @@ -567,7 +567,7 @@ extension Analyze { /// - Returns: future static func updateVersion(on database: Database, version: Version, - packageInfo: PackageInfo) -> EventLoopFuture { + packageInfo: PackageInfo) async throws { let manifest = packageInfo.packageManifest version.packageName = manifest.name version.swiftVersions = manifest.swiftLanguageVersions?.compactMap(SwiftVersion.init) ?? [] @@ -576,13 +576,13 @@ extension Analyze { version.spiManifest = packageInfo.spiManifest version.hasBinaryTargets = packageInfo.packageManifest.targets.contains { $0.type == .binary } - return version.save(on: database) + try await version.save(on: database) } static func recreateProducts(on database: Database, version: Version, manifest: Manifest) async throws { - try await deleteProducts(on: database, version: version).get() - try await createProducts(on: database, version: version, manifest: manifest).get() + try await deleteProducts(on: database, version: version) + try await createProducts(on: database, version: version, manifest: manifest) } @@ -591,11 +591,9 @@ extension Analyze { /// - database: database connection /// - version: parent model object /// - Returns: future - static func deleteProducts(on database: Database, version: Version) -> EventLoopFuture { - guard let versionId = version.id else { - return database.eventLoop.future() - } - return Product.query(on: database) + static func deleteProducts(on database: Database, version: Version) async throws { + guard let versionId = version.id else { return } + try await Product.query(on: database) .filter(\.$version.$id == versionId) .delete() } @@ -607,8 +605,8 @@ extension Analyze { /// - version: version to update /// - manifest: `Manifest` data /// - Returns: future - static func createProducts(on database: Database, version: Version, manifest: Manifest) -> EventLoopFuture { - manifest.products.compactMap { manifestProduct in + static func createProducts(on database: Database, version: Version, manifest: Manifest) async throws { + try await manifest.products.compactMap { manifestProduct in try? Product(version: version, type: .init(manifestProductType: manifestProduct.type), name: manifestProduct.name, @@ -619,8 +617,8 @@ extension Analyze { static func recreateTargets(on database: Database, version: Version, manifest: Manifest) async throws { - try await deleteTargets(on: database, version: version).get() - try await createTargets(on: database, version: version, manifest: manifest).get() + try await deleteTargets(on: database, version: version) + try await createTargets(on: database, version: version, manifest: manifest) } @@ -629,11 +627,9 @@ extension Analyze { /// - database: database connection /// - version: parent model object /// - Returns: future - static func deleteTargets(on database: Database, version: Version) -> EventLoopFuture { - guard let versionId = version.id else { - return database.eventLoop.future() - } - return Target.query(on: database) + static func deleteTargets(on database: Database, version: Version) async throws { + guard let versionId = version.id else { return } + try await Target.query(on: database) .filter(\.$version.$id == versionId) .delete() } @@ -645,8 +641,8 @@ extension Analyze { /// - version: version to update /// - manifest: `Manifest` data /// - Returns: future - static func createTargets(on database: Database, version: Version, manifest: Manifest) -> EventLoopFuture { - manifest.targets.compactMap { + static func createTargets(on database: Database, version: Version, manifest: Manifest) async throws { + try await manifest.targets.compactMap { try? Target(version: version, name: $0.name, type: .init(manifestTargetType: $0.type)) } .create(on: database) diff --git a/Sources/App/Commands/Common.swift b/Sources/App/Commands/Common.swift index d9039dbb2..a8aabea88 100644 --- a/Sources/App/Commands/Common.swift +++ b/Sources/App/Commands/Common.swift @@ -19,8 +19,6 @@ import Vapor /// Update packages (in the `[Result, Error>]` array). /// -/// Unlike the overload with a result parameter `Result<(Joined, [Version])` this will not use `Version` information to update the package. -/// /// - Parameters: /// - client: `Client` object /// - database: `Database` object diff --git a/Sources/App/Commands/ReAnalyzeVersions.swift b/Sources/App/Commands/ReAnalyzeVersions.swift index 9461f6d5d..c5315af89 100644 --- a/Sources/App/Commands/ReAnalyzeVersions.swift +++ b/Sources/App/Commands/ReAnalyzeVersions.swift @@ -201,15 +201,9 @@ enum ReAnalyzeVersions { continue } - try await Analyze.updateVersion(on: tx, - version: version, - packageInfo: pkgInfo).get() - try await Analyze.recreateProducts(on: tx, - version: version, - manifest: pkgInfo.packageManifest) - try await Analyze.recreateTargets(on: tx, - version: version, - manifest: pkgInfo.packageManifest) + try await Analyze.updateVersion(on: tx, version: version, packageInfo: pkgInfo) + try await Analyze.recreateProducts(on: tx, version: version, manifest: pkgInfo.packageManifest) + try await Analyze.recreateTargets(on: tx, version: version, manifest: pkgInfo.packageManifest) } // No need to run `updateLatestVersions` because we're only operating on existing versions, diff --git a/Sources/App/Core/Extensions/Array+ext.swift b/Sources/App/Core/Extensions/Array+ext.swift deleted file mode 100644 index d8782bbf9..000000000 --- a/Sources/App/Core/Extensions/Array+ext.swift +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright Dave Verwer, Sven A. Schmidt, and other contributors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import NIO - - -extension Array { - - /// Map `Result` elements with the given `transform` to `EventLoopFuture`by transforming the sucess case and passing through the error `E` in case of failures. - /// - Parameters: - /// - eventLoop: event loop - /// - transform: transformation - /// - Returns: array of futures - func map(on eventLoop: EventLoop, - transform: (T) -> EventLoopFuture) -> [EventLoopFuture] where Element == Result { - map { result in - switch result { - case .success(let v): return transform(v) - case .failure(let e): return eventLoop.future(error: e) - } - } - } - - /// Returns a new `EventLoopFuture` that succeeds when all `Result` elements transformed into `EventLoopFuture` elements have completed. - /// - Parameters: - /// - eventLoop: The `EventLoop` on which the new `EventLoopFuture` callbacks will fire. - /// - transform: The transformation to be applied to the `Array`'s elements - /// - Returns: A new `Array` with the results of the transformation, wrapped in `Result`s. - func whenAllComplete(on eventLoop: EventLoop, - transform: (T) -> EventLoopFuture) -> EventLoopFuture<[Result]> where Element == Result { - EventLoopFuture.whenAllComplete( - map(on: eventLoop, transform: transform), - on: eventLoop - ) - } - -} diff --git a/Sources/App/Core/Extensions/Model+ext.swift b/Sources/App/Core/Extensions/Model+ext.swift index 15d3c5880..36e41d7ad 100644 --- a/Sources/App/Core/Extensions/Model+ext.swift +++ b/Sources/App/Core/Extensions/Model+ext.swift @@ -16,12 +16,6 @@ import Fluent extension Array where Element: FluentKit.Model { - public func save(on database: Database) -> EventLoopFuture { - map { - $0.save(on: database) - }.flatten(on: database.eventLoop) - } - public func save(on database: Database) async throws -> Void { for element in self { try await element.save(on: database) diff --git a/Tests/AppTests/AnalyzerTests.swift b/Tests/AppTests/AnalyzerTests.swift index 51b171ca5..0dc9d9056 100644 --- a/Tests/AppTests/AnalyzerTests.swift +++ b/Tests/AppTests/AnalyzerTests.swift @@ -746,10 +746,10 @@ class AnalyzerTests: AppTestCase { XCTAssertEqual(info.packageManifest.name, "SPI-Server") } - func test_updateVersion() throws { + func test_updateVersion() async throws { // setup let pkg = Package(id: UUID(), url: "1") - try pkg.save(on: app.db).wait() + try await pkg.save(on: app.db) let version = try Version(package: pkg, reference: .branch("main")) let manifest = Manifest(name: "foo", platforms: [.init(platformName: .ios, version: "11.0"), @@ -767,13 +767,12 @@ class AnalyzerTests: AppTestCase { """) // MUT - _ = try Analyze.updateVersion(on: app.db, - version: version, - packageInfo: .init(packageManifest: manifest, - spiManifest: spiManifest)).wait() + _ = try await Analyze.updateVersion(on: app.db, + version: version, + packageInfo: .init(packageManifest: manifest, spiManifest: spiManifest)) // read back and validate - let v = try Version.query(on: app.db).first().wait()! + let v = try await XCTUnwrapAsync(await Version.query(on: app.db).first()) XCTAssertEqual(v.packageName, "foo") XCTAssertEqual(v.resolvedDependencies?.map(\.packageName), nil) XCTAssertEqual(v.swiftVersions, ["1", "2", "3.0.0"].asSwiftVersions) @@ -782,7 +781,7 @@ class AnalyzerTests: AppTestCase { XCTAssertEqual(v.spiManifest, spiManifest) } - func test_createProducts() throws { + func test_createProducts() async throws { // setup let p = Package(id: UUID(), url: "1") let v = try Version(id: UUID(), package: p, packageName: "1", reference: .tag(.init(1, 0, 0))) @@ -795,20 +794,20 @@ class AnalyzerTests: AppTestCase { type: .executable)], targets: [], toolsVersion: .init(version: "5.0.0")) - try p.save(on: app.db).wait() - try v.save(on: app.db).wait() + try await p.save(on: app.db) + try await v.save(on: app.db) // MUT - try Analyze.createProducts(on: app.db, version: v, manifest: m).wait() + try await Analyze.createProducts(on: app.db, version: v, manifest: m) // validation - let products = try Product.query(on: app.db).sort(\.$createdAt).all().wait() + let products = try await Product.query(on: app.db).sort(\.$createdAt).all() XCTAssertEqual(products.map(\.name), ["p1", "p2"]) XCTAssertEqual(products.map(\.targets), [["t1", "t2"], ["t3", "t4"]]) XCTAssertEqual(products.map(\.type), [.library(.automatic), .executable]) } - func test_createTargets() throws { + func test_createTargets() async throws { // setup let p = Package(id: UUID(), url: "1") let v = try Version(id: UUID(), package: p, packageName: "1", reference: .tag(.init(1, 0, 0))) @@ -816,14 +815,14 @@ class AnalyzerTests: AppTestCase { products: [], targets: [.init(name: "t1", type: .regular), .init(name: "t2", type: .executable)], toolsVersion: .init(version: "5.0.0")) - try p.save(on: app.db).wait() - try v.save(on: app.db).wait() + try await p.save(on: app.db) + try await v.save(on: app.db) // MUT - try Analyze.createTargets(on: app.db, version: v, manifest: m).wait() + try await Analyze.createTargets(on: app.db, version: v, manifest: m) // validation - let targets = try Target.query(on: app.db).sort(\.$createdAt).all().wait() + let targets = try await Target.query(on: app.db).sort(\.$createdAt).all() XCTAssertEqual(targets.map(\.name), ["t1", "t2"]) XCTAssertEqual(targets.map(\.type), [.regular, .executable]) } diff --git a/Tests/AppTests/ArrayExtensionTests.swift b/Tests/AppTests/ArrayExtensionTests.swift index 157201d39..0c7152c5d 100644 --- a/Tests/AppTests/ArrayExtensionTests.swift +++ b/Tests/AppTests/ArrayExtensionTests.swift @@ -22,77 +22,6 @@ import SPIManifest class ArrayExtensionTests: XCTestCase { - func test_map_Result_to_EventLoopFuture() throws { - // setup - let elg = MultiThreadedEventLoopGroup(numberOfThreads: 1) - let results = [0, 1, 2].map { Result.success($0) } - - // MUT - let mapped = results.map(on: elg.next()) { - elg.future(String($0)) - } - - // validate - let res = try mapped.flatten(on: elg.next()).wait() - XCTAssertEqual(res, ["0", "1", "2"]) - } - - func test_map_Result_to_EventLoopFuture_with_errors() throws { - // setup - enum MyError: Error, Equatable { case failed } - let elg = MultiThreadedEventLoopGroup(numberOfThreads: 1) - let results: [Result] = [ - .success(0), - .failure(MyError.failed), - .success(2) - ] - - // MUT - let mapped = results.map(on: elg.next()) { - elg.future(String($0)) - } - - // validate - XCTAssertEqual(try mapped[0].wait(), "0") - XCTAssertThrowsError(try mapped[1].wait()) { - XCTAssertEqual($0 as? MyError, MyError.failed) - } - XCTAssertEqual(try mapped[2].wait(), "2") - } - - func test_whenAllComplete() throws { - // setup - let elg = MultiThreadedEventLoopGroup(numberOfThreads: 1) - let results = [0, 1, 2].map { Result.success($0) } - - // MUT - let res = try results.whenAllComplete(on: elg.next()) { - elg.future(String($0)) - }.wait() - - // validate - XCTAssertEqual(res.compactMap { try? $0.get() }, ["0", "1", "2"]) - } - - func test_whenAllComplete_with_errors() throws { - // setup - enum MyError: Error { case failed } - let elg = MultiThreadedEventLoopGroup(numberOfThreads: 1) - let results: [Result] = [ - .success(0), - .failure(MyError.failed), - .success(2) - ] - - // MUT - let res = try results.whenAllComplete(on: elg.next()) { - elg.future(String($0)) - }.wait() - - // validate - XCTAssertEqual(res.compactMap { try? $0.get() }, ["0", "2"]) - } - func test_defaultBranchVersion() throws { XCTAssertEqual( [ diff --git a/Tests/AppTests/IngestorTests.swift b/Tests/AppTests/IngestorTests.swift index fb259914b..02b7d5411 100644 --- a/Tests/AppTests/IngestorTests.swift +++ b/Tests/AppTests/IngestorTests.swift @@ -265,7 +265,7 @@ class IngestorTests: AppTestCase { Package(id: UUID(), url: "https://github.com/foo/1", status: .ok, processingStage: .reconciliation), Package(id: UUID(), url: "https://github.com/foo/2", status: .new, processingStage: .reconciliation) ] - try await pkgs.save(on: app.db).get() + try await pkgs.save(on: app.db) let results: [Result, Error>] = [ .success(.init(model: pkgs[0])), .success(.init(model: pkgs[1]))] diff --git a/Tests/AppTests/PackageTests.swift b/Tests/AppTests/PackageTests.swift index da334244d..aeae05ad5 100644 --- a/Tests/AppTests/PackageTests.swift +++ b/Tests/AppTests/PackageTests.swift @@ -242,18 +242,18 @@ final class PackageTests: AppTestCase { ) } - func test_findSignificantReleases_old_beta() throws { + func test_findSignificantReleases_old_beta() async throws { // Test to ensure outdated betas aren't picked up as latest versions // setup let pkg = Package(id: UUID(), url: "1") - try pkg.save(on: app.db).wait() - try Repository(package: pkg, defaultBranch: "main").save(on: app.db).wait() + try await pkg.save(on: app.db) + try await Repository(package: pkg, defaultBranch: "main").save(on: app.db) let versions = [ try Version(package: pkg, packageName: "foo", reference: .branch("main")), try Version(package: pkg, packageName: "foo", reference: .tag(2, 0, 0)), try Version(package: pkg, packageName: "foo", reference: .tag(2, 0, 0, "rc1")) ] - try versions.save(on: app.db).wait() + try await versions.save(on: app.db) // MUT let (release, preRelease, defaultBranch) = Package.findSignificantReleases(versions: versions, branch: "main") diff --git a/Tests/AppTests/SearchTests.swift b/Tests/AppTests/SearchTests.swift index 60ffc328d..a1f162154 100644 --- a/Tests/AppTests/SearchTests.swift +++ b/Tests/AppTests/SearchTests.swift @@ -185,27 +185,27 @@ class SearchTests: AppTestCase { XCTAssertEqual(binds(query), ["test", "%test%", "%test%", "test", "test", "test"]) } - func test_fetch_single() throws { + func test_fetch_single() async throws { // Test search with a single term // setup let p1 = try savePackage(on: app.db, "1") let p2 = try savePackage(on: app.db, "2") - try Repository(package: p1, - defaultBranch: "main", - summary: "some package").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - lastCommitDate: .t0, - name: "name 2", - owner: "owner 2", - stars: 1234, - summary: "bar package").save(on: app.db).wait() - try Version(package: p1, packageName: "Foo", reference: .branch("main")).save(on: app.db).wait() - try Version(package: p2, packageName: "Bar", reference: .branch("main")).save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await Repository(package: p1, + defaultBranch: "main", + summary: "some package").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + lastCommitDate: .t0, + name: "name 2", + owner: "owner 2", + stars: 1234, + summary: "bar package").save(on: app.db) + try await Version(package: p1, packageName: "Foo", reference: .branch("main")).save(on: app.db) + try await Version(package: p2, packageName: "Bar", reference: .branch("main")).save(on: app.db) + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["bar"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["bar"], page: 1, pageSize: 20).get() // validation XCTAssertEqual(res, @@ -229,29 +229,29 @@ class SearchTests: AppTestCase { ) } - func test_fetch_multiple() throws { + func test_fetch_multiple() async throws { // Test search with multiple terms ("and") // setup let p1 = try savePackage(on: app.db, "1") let p2 = try savePackage(on: app.db, "2") - try Repository(package: p1, + try await Repository(package: p1, defaultBranch: "main", name: "package 1", owner: "owner", - summary: "package 1 description").save(on: app.db).wait() - try Repository(package: p2, + summary: "package 1 description").save(on: app.db) + try await Repository(package: p2, defaultBranch: "main", lastCommitDate: .t0, name: "package 2", owner: "owner", stars: 1234, - summary: "package 2 description").save(on: app.db).wait() - try Version(package: p1, packageName: "Foo", reference: .branch("main")).save(on: app.db).wait() - try Version(package: p2, packageName: "Bar", reference: .branch("main")).save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + summary: "package 2 description").save(on: app.db) + try await Version(package: p1, packageName: "Foo", reference: .branch("main")).save(on: app.db) + try await Version(package: p2, packageName: "Bar", reference: .branch("main")).save(on: app.db) + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["owner", "bar"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["owner", "bar"], page: 1, pageSize: 20).get() // validation XCTAssertEqual(res, @@ -298,30 +298,30 @@ class SearchTests: AppTestCase { XCTAssertEqual(res.results.compactMap(\.packageResult?.repositoryName), ["bar"]) } - func test_quoting() throws { + func test_quoting() async throws { // Test searching for a `'` // setup let p1 = try savePackage(on: app.db, "1") let p2 = try savePackage(on: app.db, "2") - try Repository(package: p1, - defaultBranch: "main", - lastCommitDate: .t0, - name: "name 1", - owner: "owner 1", - stars: 1234, - summary: "some 'package'").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - lastCommitDate: .t0, - name: "name 2", - owner: "owner 2", - summary: "bar package").save(on: app.db).wait() - try Version(package: p1, packageName: "Foo", reference: .branch("main")).save(on: app.db).wait() - try Version(package: p2, packageName: "Bar", reference: .branch("main")).save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await Repository(package: p1, + defaultBranch: "main", + lastCommitDate: .t0, + name: "name 1", + owner: "owner 1", + stars: 1234, + summary: "some 'package'").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + lastCommitDate: .t0, + name: "name 2", + owner: "owner 2", + summary: "bar package").save(on: app.db) + try await Version(package: p1, packageName: "Foo", reference: .branch("main")).save(on: app.db) + try await Version(package: p2, packageName: "Bar", reference: .branch("main")).save(on: app.db) + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["'"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["'"], page: 1, pageSize: 20).get() // validation XCTAssertEqual(res, @@ -340,7 +340,7 @@ class SearchTests: AppTestCase { summary: "some 'package'", keywords: [], hasDocs: false)! - ) + ) ]) ) } @@ -469,22 +469,22 @@ class SearchTests: AppTestCase { } } - func test_order_by_score() throws { + func test_order_by_score() async throws { // setup - try (0..<10).shuffled().forEach { - let p = Package(id: UUID(), url: "\($0)".url, score: $0) - try p.save(on: app.db).wait() - try Repository(package: p, - defaultBranch: "main", - name: "\($0)", - owner: "foobar", - summary: "\($0)").save(on: app.db).wait() - try Version(package: p, packageName: "\($0)", reference: .branch("main")).save(on: app.db).wait() + for idx in (0..<10).shuffled() { + let p = Package(id: UUID(), url: "\(idx)".url, score: idx) + try await p.save(on: app.db) + try await Repository(package: p, + defaultBranch: "main", + name: "\(idx)", + owner: "foobar", + summary: "\(idx)").save(on: app.db) + try await Version(package: p, packageName: "\(idx)", reference: .branch("main")).save(on: app.db) } - try Search.refresh(on: app.db).wait() + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["foo"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["foo"], page: 1, pageSize: 20).get() // validation XCTAssertEqual(res.results.count, 11) @@ -492,7 +492,7 @@ class SearchTests: AppTestCase { ["a:foobar", "p:9", "p:8", "p:7", "p:6", "p:5", "p:4", "p:3", "p:2", "p:1", "p:0"]) } - func test_exact_name_match() throws { + func test_exact_name_match() async throws { // Ensure exact name matches are boosted // setup // We have three packages that all match in some way: @@ -502,38 +502,37 @@ class SearchTests: AppTestCase { let p1 = Package(id: UUID(), url: "1", score: 10) let p2 = Package(id: UUID(), url: "2", score: 20) let p3 = Package(id: UUID(), url: "3", score: 30) - try [p1, p2, p3].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - name: "1", - owner: "foo", - summary: "").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - name: "2", - owner: "foo", - summary: "").save(on: app.db).wait() - try Repository(package: p3, - defaultBranch: "main", - name: "3", - owner: "foo", - summary: "link").save(on: app.db).wait() - try Version(package: p1, packageName: "Ink", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "inkInName", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p3, packageName: "some name", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2, p3].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + name: "1", + owner: "foo", + summary: "").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + name: "2", + owner: "foo", + summary: "").save(on: app.db) + try await Repository(package: p3, + defaultBranch: "main", + name: "3", + owner: "foo", + summary: "link").save(on: app.db) + try await Version(package: p1, packageName: "Ink", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "inkInName", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p3, packageName: "some name", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["ink"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["ink"], page: 1, pageSize: 20).get() - XCTAssertEqual(res.results.map(\.package?.repositoryName), - ["1", "3", "2"]) + XCTAssertEqual(res.results.map(\.package?.repositoryName), ["1", "3", "2"]) } - func test_exact_name_match_whitespace() throws { + func test_exact_name_match_whitespace() async throws { // Ensure exact name matches are boosted, for package name with whitespace // setup // We have three packages that all match in some way: @@ -543,38 +542,38 @@ class SearchTests: AppTestCase { let p1 = Package(id: UUID(), url: "1", score: 10) let p2 = Package(id: UUID(), url: "2", score: 20) let p3 = Package(id: UUID(), url: "3", score: 30) - try [p1, p2, p3].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - name: "1", - owner: "foo", - summary: "").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - name: "2", - owner: "foo", - summary: "").save(on: app.db).wait() - try Repository(package: p3, - defaultBranch: "main", - name: "3", - owner: "foo", - summary: "foo bar").save(on: app.db).wait() - try Version(package: p1, packageName: "Foo bar", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "foobar", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p3, packageName: "some name", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2, p3].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + name: "1", + owner: "foo", + summary: "").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + name: "2", + owner: "foo", + summary: "").save(on: app.db) + try await Repository(package: p3, + defaultBranch: "main", + name: "3", + owner: "foo", + summary: "foo bar").save(on: app.db) + try await Version(package: p1, packageName: "Foo bar", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "foobar", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p3, packageName: "some name", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["foo", "bar"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["foo", "bar"], page: 1, pageSize: 20).get() XCTAssertEqual(res.results.map(\.package?.repositoryName), ["1", "3", "2"]) } - func test_exact_name_null_packageName() throws { + func test_exact_name_null_packageName() async throws { // Ensure null packageName value aren't boosted // https://github.com/SwiftPackageIndex/SwiftPackageIndex-Server/issues/2072 // setup @@ -584,95 +583,95 @@ class SearchTests: AppTestCase { let p1 = Package(id: UUID(), url: "1", score: 30) let p2 = Package(id: UUID(), url: "2", score: 20) let p3 = Package(id: UUID(), url: "3", score: 10) - try [p1, p2, p3].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - name: "1", - owner: "foo", - summary: "bar1").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - name: "2", - owner: "foo", - summary: "bar2").save(on: app.db).wait() - try Repository(package: p3, - defaultBranch: "main", - name: "3", - owner: "foo", - summary: "bar3").save(on: app.db).wait() - try Version(package: p1, packageName: "Bar1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "Bar2", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p3, packageName: nil, reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2, p3].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + name: "1", + owner: "foo", + summary: "bar1").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + name: "2", + owner: "foo", + summary: "bar2").save(on: app.db) + try await Repository(package: p3, + defaultBranch: "main", + name: "3", + owner: "foo", + summary: "bar3").save(on: app.db) + try await Version(package: p1, packageName: "Bar1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "Bar2", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p3, packageName: nil, reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["bar"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["bar"], page: 1, pageSize: 20).get() XCTAssertEqual(res.results.map(\.package?.repositoryName), ["1", "2", "3"]) } - func test_exclude_null_fields() throws { + func test_exclude_null_fields() async throws { // Ensure excluding results with NULL fields // setup: // Packages that all match but each having one NULL for a required field let p1 = Package(id: UUID(), url: "1", score: 10) let p2 = Package(id: UUID(), url: "2", score: 20) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - name: nil, // Missing repository name - owner: "foobar", - summary: "").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - name: "2", - owner: nil, // Missing repository owner - summary: "foo bar").save(on: app.db).wait() - try Version(package: p1, packageName: "foo1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "foo2", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + name: nil, // Missing repository name + owner: "foobar", + summary: "").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + name: "2", + owner: nil, // Missing repository owner + summary: "foo bar").save(on: app.db) + try await Version(package: p1, packageName: "foo1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "foo2", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["foo"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["foo"], page: 1, pageSize: 20).get() // ensure only the author result is coming through, not the packages XCTAssertEqual(res.results.map(\.testDescription), ["a:foobar"]) } - func test_include_null_package_name() throws { + func test_include_null_package_name() async throws { // Ensure that packages that somehow have a NULL package name do *not* get excluded from search results. let p1 = Package(id: .id0, url: "1", score: 10) - try p1.save(on: app.db).wait() + try await p1.save(on: app.db) - try Repository(package: p1, - defaultBranch: "main", - name: "1", - owner: "bar", - summary: "foo and bar").save(on: app.db).wait() + try await Repository(package: p1, + defaultBranch: "main", + name: "1", + owner: "bar", + summary: "foo and bar").save(on: app.db) // Version record with a missing package name. - try Version(package: p1, packageName: nil, reference: .branch("main")) - .save(on: app.db).wait() + try await Version(package: p1, packageName: nil, reference: .branch("main")) + .save(on: app.db) - try Search.refresh(on: app.db).wait() + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["foo"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["foo"], page: 1, pageSize: 20).get() - let packageResult = try res.results.first.unwrap().package.unwrap() + let packageResult = try XCTUnwrap(res.results.first?.package) XCTAssertEqual(packageResult.packageId, .id0) XCTAssertEqual(packageResult.repositoryName, "1") XCTAssertEqual(packageResult.repositoryOwner, "bar") XCTAssertEqual(packageResult.packageName, nil) } - func test_exact_word_match() throws { + func test_exact_word_match() async throws { // Ensure exact word matches are boosted // See also https://github.com/SwiftPackageIndex/SwiftPackageIndex-Server/issues/2072 // setup @@ -682,39 +681,39 @@ class SearchTests: AppTestCase { let p1 = Package(id: UUID(), url: "1", score: 30) let p2 = Package(id: UUID(), url: "2", score: 20) let p3 = Package(id: UUID(), url: "3", score: 10) - try [p1, p2, p3].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - name: "1", - owner: "foo", - summary: "mapping").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - name: "2", - owner: "foo", - summary: "flopping").save(on: app.db).wait() - try Repository(package: p3, - defaultBranch: "main", - name: "3", - owner: "foo", - summary: "ping").save(on: app.db).wait() - try Version(package: p1, packageName: "Foo1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "Foo2", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p3, packageName: "Foo3", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2, p3].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + name: "1", + owner: "foo", + summary: "mapping").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + name: "2", + owner: "foo", + summary: "flopping").save(on: app.db) + try await Repository(package: p3, + defaultBranch: "main", + name: "3", + owner: "foo", + summary: "ping").save(on: app.db) + try await Version(package: p1, packageName: "Foo1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "Foo2", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p3, packageName: "Foo3", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["ping"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["ping"], page: 1, pageSize: 20).get() // validate XCTAssertEqual(res.results.map(\.package?.repositoryName), ["3", "1", "2"]) } - func test_repo_word_match() throws { + func test_repo_word_match() async throws { // Ensure the repository name is part of word matching // See also https://github.com/SwiftPackageIndex/SwiftPackageIndex-Server/issues/2263 // We have two packages that both match the search term "syntax". This test @@ -722,24 +721,24 @@ class SearchTests: AppTestCase { // ranked first due to its higher score. let p1 = Package(id: UUID(), url: "foo/bar", score: 10) let p2 = Package(id: UUID(), url: "foo/swift-syntax", score: 20) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - name: "bar", - owner: "foo", - summary: "syntax").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - name: "swift-syntax", - owner: "foo").save(on: app.db).wait() - try Version(package: p1, packageName: "Bar", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "SwiftSyntax", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + name: "bar", + owner: "foo", + summary: "syntax").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + name: "swift-syntax", + owner: "foo").save(on: app.db) + try await Version(package: p1, packageName: "Bar", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "SwiftSyntax", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["syntax"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["syntax"], page: 1, pageSize: 20).get() // validate XCTAssertEqual(res.results.map(\.package?.repositoryName), @@ -757,7 +756,7 @@ class SearchTests: AppTestCase { XCTAssertEqual(Search.sanitize(["test\\"]), ["test"]) } - func test_invalid_characters() throws { + func test_invalid_characters() async throws { // https://github.com/SwiftPackageIndex/SwiftPackageIndex-Server/issues/974 // https://github.com/SwiftPackageIndex/SwiftPackageIndex-Server/issues/1402 // Ensure we don't raise a 500 for certain characters @@ -765,7 +764,7 @@ class SearchTests: AppTestCase { do { // MUT - let res = try Search.fetch(app.db, ["*"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["*"], page: 1, pageSize: 20).get() // validation XCTAssertEqual(res, .init(hasMoreResults: false, searchTerm: "\\*", searchFilters: [], results: [])) @@ -773,7 +772,7 @@ class SearchTests: AppTestCase { do { // MUT - let res = try Search.fetch(app.db, ["\\"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["\\"], page: 1, pageSize: 20).get() // validation XCTAssertEqual(res, .init(hasMoreResults: false, searchTerm: "", searchFilters: [], results: [])) @@ -881,34 +880,34 @@ class SearchTests: AppTestCase { ["a:author", "a:author-2", "a:another-author", "p:p3", "p:p2", "p:p1"]) } - func test_search_author() throws { + func test_search_author() async throws { // Test searching for an author // setup // p1: decoy // p2: match let p1 = Package(id: .id1, url: "1", score: 10) let p2 = Package(id: .id2, url: "2", score: 20) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - name: "1", - owner: "bar", - summary: "").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - lastCommitDate: .t0, - name: "2", - owner: "foo", - stars: 1234, - summary: "").save(on: app.db).wait() - try Version(package: p1, packageName: "p1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "p2", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + name: "1", + owner: "bar", + summary: "").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + lastCommitDate: .t0, + name: "2", + owner: "foo", + stars: 1234, + summary: "").save(on: app.db) + try await Version(package: p1, packageName: "p1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "p2", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["foo"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["foo"], page: 1, pageSize: 20).get() XCTAssertEqual(res.results, [ .author(.init(name: "foo")), @@ -961,86 +960,86 @@ class SearchTests: AppTestCase { ]) } - func test_search_withoutTerms() throws { + func test_search_withoutTerms() async throws { // Setup let p1 = Package(id: .id1, url: "1", score: 10) let p2 = Package(id: .id2, url: "2", score: 20) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - keywords: ["a"], - name: "1", - owner: "bar", - stars: 50, - summary: "test package").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - keywords: ["b"], - name: "2", - owner: "foo", - stars: 10, - summary: "test package").save(on: app.db).wait() - try Version(package: p1, packageName: "p1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "p2", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + keywords: ["a"], + name: "1", + owner: "bar", + stars: 50, + summary: "test package").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + keywords: ["b"], + name: "2", + owner: "foo", + stars: 10, + summary: "test package").save(on: app.db) + try await Version(package: p1, packageName: "p1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "p2", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() // MUT - let res = try Search.fetch(app.db, ["stars:>15"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["stars:>15"], page: 1, pageSize: 20).get() XCTAssertEqual(res.results.count, 1) XCTAssertEqual(res.results.compactMap(\.package).compactMap(\.packageName).sorted(), ["p1"]) } - func test_search_withFilter_stars() throws { + func test_search_withFilter_stars() async throws { // Setup let p1 = Package(id: .id1, url: "1", score: 10) let p2 = Package(id: .id2, url: "2", score: 20) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - name: "1", - owner: "bar", - stars: 50, - summary: "test package").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - name: "2", - owner: "foo", - stars: 10, - summary: "test package").save(on: app.db).wait() - try Version(package: p1, packageName: "p1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "p2", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + name: "1", + owner: "bar", + stars: 50, + summary: "test package").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + name: "2", + owner: "foo", + stars: 10, + summary: "test package").save(on: app.db) + try await Version(package: p1, packageName: "p1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "p2", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() do { // Baseline - let res = try Search.fetch(app.db, ["test"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test"], page: 1, pageSize: 20).get() XCTAssertEqual(res.results.count, 2) XCTAssertEqual(res.results.compactMap(\.package).compactMap(\.packageName).sorted(), ["p1", "p2"]) } do { // Greater Than - let res = try Search.fetch(app.db, ["test", "stars:>25"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test", "stars:>25"], page: 1, pageSize: 20).get() XCTAssertEqual(res.results.count, 1) XCTAssertEqual(res.results.first?.package?.packageName, "p1") } do { // Less Than - let res = try Search.fetch(app.db, ["test", "stars:<25"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test", "stars:<25"], page: 1, pageSize: 20).get() XCTAssertEqual(res.results.count, 1) XCTAssertEqual(res.results.first?.package?.packageName, "p2") } do { // Equal - let res = try Search.fetch(app.db, ["test", "stars:50"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test", "stars:50"], page: 1, pageSize: 20).get() XCTAssertEqual(res.results.count, 1) XCTAssertEqual(res.results.first?.package?.packageName, "p1") } do { // Not Equals - let res = try Search.fetch(app.db, ["test", "stars:!50"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test", "stars:!50"], page: 1, pageSize: 20).get() XCTAssertEqual(res.results.count, 1) XCTAssertEqual(res.results.first?.package?.packageName, "p2") } @@ -1064,38 +1063,38 @@ class SearchTests: AppTestCase { } } - func test_authorSearchFilter() throws { + func test_authorSearchFilter() async throws { // Setup let p1 = Package(url: "1", platformCompatibility: [.iOS]) let p2 = Package(url: "2", platformCompatibility: [.macOS]) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - name: "1", - owner: "foo", - summary: "test package").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - name: "2", - owner: "bar", - summary: "test package").save(on: app.db).wait() - try Version(package: p1, packageName: "p1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "p2", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + name: "1", + owner: "foo", + summary: "test package").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + name: "2", + owner: "bar", + summary: "test package").save(on: app.db) + try await Version(package: p1, packageName: "p1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "p2", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() do { // MUT - let res = try Search.fetch(app.db, ["test", "author:foo"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test", "author:foo"], page: 1, pageSize: 20).get() // validate XCTAssertEqual(res.results.compactMap(\.packageResult?.repositoryName), ["1"]) } do { // double check that leaving the filter term off selects both packages - // MUT - let res = try Search.fetch(app.db, ["test"], page: 1, pageSize: 20).wait() + // MUT + let res = try await Search.fetch(app.db, ["test"], page: 1, pageSize: 20).get() // validate XCTAssertEqual( @@ -1105,40 +1104,40 @@ class SearchTests: AppTestCase { } } - func test_keywordSearchFilter() throws { + func test_keywordSearchFilter() async throws { // Setup let p1 = Package(url: "1", platformCompatibility: [.iOS]) let p2 = Package(url: "2", platformCompatibility: [.macOS]) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - keywords: ["kw1", "kw2"], - name: "1", - owner: "foo", - summary: "test package").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - keywords: ["kw1-2"], - name: "2", - owner: "bar", - summary: "test package").save(on: app.db).wait() - try Version(package: p1, packageName: "p1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "p2", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + keywords: ["kw1", "kw2"], + name: "1", + owner: "foo", + summary: "test package").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + keywords: ["kw1-2"], + name: "2", + owner: "bar", + summary: "test package").save(on: app.db) + try await Version(package: p1, packageName: "p1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "p2", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() do { // MUT - let res = try Search.fetch(app.db, ["test", "keyword:kw1"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test", "keyword:kw1"], page: 1, pageSize: 20).get() // validate XCTAssertEqual(res.results.compactMap(\.packageResult?.repositoryName), ["1"]) } do { // double check that leaving the filter term off selects both packages - // MUT - let res = try Search.fetch(app.db, ["test"], page: 1, pageSize: 20).wait() + // MUT + let res = try await Search.fetch(app.db, ["test"], page: 1, pageSize: 20).get() // validate XCTAssertEqual( @@ -1148,40 +1147,40 @@ class SearchTests: AppTestCase { } } - func test_lastActivitySearchFilter() throws { + func test_lastActivitySearchFilter() async throws { // Setup let p1 = Package(url: "1", platformCompatibility: [.iOS]) let p2 = Package(url: "2", platformCompatibility: [.macOS]) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - lastCommitDate: .t0.adding(days: -1), - name: "1", - owner: "foo", - summary: "test package").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - lastCommitDate: .t0, - name: "2", - owner: "bar", - summary: "test package").save(on: app.db).wait() - try Version(package: p1, packageName: "p1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "p2", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + lastCommitDate: .t0.adding(days: -1), + name: "1", + owner: "foo", + summary: "test package").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + lastCommitDate: .t0, + name: "2", + owner: "bar", + summary: "test package").save(on: app.db) + try await Version(package: p1, packageName: "p1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "p2", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() do { // MUT - let res = try Search.fetch(app.db, ["test", "last_activity:<1970-01-01"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test", "last_activity:<1970-01-01"], page: 1, pageSize: 20).get() // validate XCTAssertEqual(res.results.compactMap(\.packageResult?.repositoryName), ["1"]) } do { // double check that leaving the filter term off selects both packages - // MUT - let res = try Search.fetch(app.db, ["test"], page: 1, pageSize: 20).wait() + // MUT + let res = try await Search.fetch(app.db, ["test"], page: 1, pageSize: 20).get() // validate XCTAssertEqual( @@ -1191,40 +1190,40 @@ class SearchTests: AppTestCase { } } - func test_lastCommitSearchFilter() throws { + func test_lastCommitSearchFilter() async throws { // Setup let p1 = Package(url: "1", platformCompatibility: [.iOS]) let p2 = Package(url: "2", platformCompatibility: [.macOS]) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - lastCommitDate: .t0.adding(days: -1), - name: "1", - owner: "foo", - summary: "test package").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - lastCommitDate: .t0, - name: "2", - owner: "bar", - summary: "test package").save(on: app.db).wait() - try Version(package: p1, packageName: "p1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "p2", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + lastCommitDate: .t0.adding(days: -1), + name: "1", + owner: "foo", + summary: "test package").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + lastCommitDate: .t0, + name: "2", + owner: "bar", + summary: "test package").save(on: app.db) + try await Version(package: p1, packageName: "p1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "p2", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() do { // MUT - let res = try Search.fetch(app.db, ["test", "last_commit:<1970-01-01"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test", "last_commit:<1970-01-01"], page: 1, pageSize: 20).get() // validate XCTAssertEqual(res.results.compactMap(\.packageResult?.repositoryName), ["1"]) } do { // double check that leaving the filter term off selects both packages - // MUT - let res = try Search.fetch(app.db, ["test"], page: 1, pageSize: 20).wait() + // MUT + let res = try await Search.fetch(app.db, ["test"], page: 1, pageSize: 20).get() // validate XCTAssertEqual( @@ -1234,32 +1233,32 @@ class SearchTests: AppTestCase { } } - func test_licenseSearchFilter() throws { + func test_licenseSearchFilter() async throws { // Setup let p1 = Package(url: "1", platformCompatibility: [.iOS]) let p2 = Package(url: "2", platformCompatibility: [.macOS]) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - license: .mit, - name: "1", - owner: "foo", - summary: "test package").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - license: .none, - name: "2", - owner: "bar", - summary: "test package").save(on: app.db).wait() - try Version(package: p1, packageName: "p1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "p2", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + license: .mit, + name: "1", + owner: "foo", + summary: "test package").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + license: .none, + name: "2", + owner: "bar", + summary: "test package").save(on: app.db) + try await Version(package: p1, packageName: "p1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "p2", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() do { // MUT - let res = try Search.fetch(app.db, ["test", "license:mit"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test", "license:mit"], page: 1, pageSize: 20).get() // validate XCTAssertEqual(res.results.compactMap(\.packageResult?.repositoryName), ["1"]) @@ -1267,15 +1266,15 @@ class SearchTests: AppTestCase { do { // MUT - let res = try Search.fetch(app.db, ["test", "license:compatible"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test", "license:compatible"], page: 1, pageSize: 20).get() // validate XCTAssertEqual(res.results.compactMap(\.packageResult?.repositoryName), ["1"]) } do { // double check that leaving the filter term off selects both packages - // MUT - let res = try Search.fetch(app.db, ["test"], page: 1, pageSize: 20).wait() + // MUT + let res = try await Search.fetch(app.db, ["test"], page: 1, pageSize: 20).get() // validate XCTAssertEqual( @@ -1285,38 +1284,38 @@ class SearchTests: AppTestCase { } } - func test_platformSearchFilter() throws { + func test_platformSearchFilter() async throws { // Setup let p1 = Package(url: "1", platformCompatibility: [.iOS]) let p2 = Package(url: "2", platformCompatibility: [.macOS]) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - name: "1", - owner: "foo", - summary: "test package").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - name: "2", - owner: "foo", - summary: "test package").save(on: app.db).wait() - try Version(package: p1, packageName: "p1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "p2", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + name: "1", + owner: "foo", + summary: "test package").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + name: "2", + owner: "foo", + summary: "test package").save(on: app.db) + try await Version(package: p1, packageName: "p1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "p2", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() do { // MUT - let res = try Search.fetch(app.db, ["test", "platform:ios"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test", "platform:ios"], page: 1, pageSize: 20).get() // validate XCTAssertEqual(res.results.compactMap(\.packageResult?.repositoryName), ["1"]) } do { // double check that leaving the filter term off selects both packages - // MUT - let res = try Search.fetch(app.db, ["test"], page: 1, pageSize: 20).wait() + // MUT + let res = try await Search.fetch(app.db, ["test"], page: 1, pageSize: 20).get() // validate XCTAssertEqual( @@ -1326,39 +1325,39 @@ class SearchTests: AppTestCase { } } - func test_starsSearchFilter() throws { + func test_starsSearchFilter() async throws { // Setup let p1 = Package(url: "1", platformCompatibility: [.iOS]) let p2 = Package(url: "2", platformCompatibility: [.macOS]) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - name: "1", - owner: "foo", - stars: 10, - summary: "test package").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - name: "2", - owner: "bar", - summary: "test package").save(on: app.db).wait() - try Version(package: p1, packageName: "p1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "p2", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + name: "1", + owner: "foo", + stars: 10, + summary: "test package").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + name: "2", + owner: "bar", + summary: "test package").save(on: app.db) + try await Version(package: p1, packageName: "p1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "p2", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() do { // MUT - let res = try Search.fetch(app.db, ["test", "stars:>5"], page: 1, pageSize: 20).wait() + let res = try await Search.fetch(app.db, ["test", "stars:>5"], page: 1, pageSize: 20).get() // validate XCTAssertEqual(res.results.compactMap(\.packageResult?.repositoryName), ["1"]) } do { // double check that leaving the filter term off selects both packages - // MUT - let res = try Search.fetch(app.db, ["test"], page: 1, pageSize: 20).wait() + // MUT + let res = try await Search.fetch(app.db, ["test"], page: 1, pageSize: 20).get() // validate XCTAssertEqual( @@ -1472,33 +1471,33 @@ class SearchTests: AppTestCase { } } - func test_SearchFilter_error() throws { + func test_SearchFilter_error() async throws { // Test error handling in case of an invalid filter // Setup let p1 = Package(url: "1", platformCompatibility: [.iOS]) let p2 = Package(url: "2", platformCompatibility: [.macOS]) - try [p1, p2].save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - license: .mit, - name: "1", - owner: "foo", - summary: "test package").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - license: .none, - name: "2", - owner: "bar", - summary: "test package").save(on: app.db).wait() - try Version(package: p1, packageName: "p1", reference: .branch("main")) - .save(on: app.db).wait() - try Version(package: p2, packageName: "p2", reference: .branch("main")) - .save(on: app.db).wait() - try Search.refresh(on: app.db).wait() - + try await [p1, p2].save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + license: .mit, + name: "1", + owner: "foo", + summary: "test package").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + license: .none, + name: "2", + owner: "bar", + summary: "test package").save(on: app.db) + try await Version(package: p1, packageName: "p1", reference: .branch("main")) + .save(on: app.db) + try await Version(package: p2, packageName: "p2", reference: .branch("main")) + .save(on: app.db) + try await Search.refresh(on: app.db).get() + // MUT - let res = try Search.fetch(app.db, ["test", "license:>mit"], page: 1, pageSize: 20).wait() - + let res = try await Search.fetch(app.db, ["test", "license:>mit"], page: 1, pageSize: 20).get() + // validate XCTAssertEqual(res.results.compactMap(\.packageResult?.repositoryName), []) } diff --git a/Tests/AppTests/VersionDiffTests.swift b/Tests/AppTests/VersionDiffTests.swift index 74b0b58a9..863ae877d 100644 --- a/Tests/AppTests/VersionDiffTests.swift +++ b/Tests/AppTests/VersionDiffTests.swift @@ -144,7 +144,7 @@ class VersionDiffTests: AppTestCase { // Test [Version] based diff (higher level interface) // Just run an integration scenario, the details are covered in the test above - func test_diff_1() throws { + func test_diff_1() async throws { // Branch changes commit hash // setup let pkg = try savePackage(on: app.db, "1") @@ -154,7 +154,7 @@ class VersionDiffTests: AppTestCase { try .init(id: keptId, package: pkg, commit: "hash2", reference: .tag(1, 2, 3)), ] - try saved.save(on: app.db).wait() + try await saved.save(on: app.db) // MUT let res = Version.diff(local: saved, incoming: [