From 10bdd2897b57bd7c8cfcc91ea828e3255b020da6 Mon Sep 17 00:00:00 2001 From: "Sven A. Schmidt" Date: Fri, 23 Aug 2024 13:35:24 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Convert=20`=E2=86=92=20EventLoopFuture`=20functions=20to=20a/a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/App/Commands/Analyze.swift | 6 +- Sources/App/Commands/CreateRestfile.swift | 16 +++-- Sources/App/Commands/ReAnalyzeVersions.swift | 4 +- Sources/App/Core/AppMetrics.swift | 42 +++---------- Sources/App/Core/Search.swift | 4 +- Sources/App/Core/Stats.swift | 4 +- Sources/App/Models/WeightedKeyword.swift | 4 +- Tests/AppTests/ApiTests.swift | 60 +++++++++--------- Tests/AppTests/SearchTests.swift | 66 ++++++++++---------- Tests/AppTests/SitemapTests.swift | 2 +- Tests/AppTests/StatsTests.swift | 10 +-- Tests/AppTests/Util.swift | 6 +- 12 files changed, 99 insertions(+), 125 deletions(-) diff --git a/Sources/App/Commands/Analyze.swift b/Sources/App/Commands/Analyze.swift index 1b7378a49..5e7e25dbf 100644 --- a/Sources/App/Commands/Analyze.swift +++ b/Sources/App/Commands/Analyze.swift @@ -158,9 +158,9 @@ extension Analyze { try await RecentPackage.refresh(on: database) try await RecentRelease.refresh(on: database) - try await Search.refresh(on: database).get() - try await Stats.refresh(on: database).get() - try await WeightedKeyword.refresh(on: database).get() + try await Search.refresh(on: database) + try await Stats.refresh(on: database) + try await WeightedKeyword.refresh(on: database) } diff --git a/Sources/App/Commands/CreateRestfile.swift b/Sources/App/Commands/CreateRestfile.swift index 020e68b36..d09818185 100644 --- a/Sources/App/Commands/CreateRestfile.swift +++ b/Sources/App/Commands/CreateRestfile.swift @@ -31,7 +31,7 @@ enum Variant: String, LosslessStringConvertible { } -struct CreateRestfileCommand: Command { +struct CreateRestfileCommand: AsyncCommand { struct Signature: CommandSignature { @Argument(name: "variant") var variant: Variant @@ -39,16 +39,16 @@ struct CreateRestfileCommand: Command { var help: String { "Create restfile for automated testing" } - func run(using context: CommandContext, signature: Signature) throws { + func run(using context: CommandContext, signature: Signature) async throws { guard let db = context.application.db as? SQLDatabase else { fatalError("Database must be an SQLDatabase ('as? SQLDatabase' must succeed)") } - try createRestfile(on: db, variant: signature.variant).wait() + try await createRestfile(on: db, variant: signature.variant) } } -func createRestfile(on database: SQLDatabase, variant: Variant) -> EventLoopFuture { +func createRestfile(on database: SQLDatabase, variant: Variant) async throws { let mode: String let query: SQLQueryString switch variant { @@ -96,14 +96,12 @@ func createRestfile(on database: SQLDatabase, variant: Variant) -> EventLoopFutu print("# auto-generated via `Run create-restfile \(variant.rawValue)`") print("mode: \(mode)") print("requests:") - return database.raw(query) - .all(decoding: Record.self) - .mapEach { r in - print(""" + for r in try await database.raw(query).all(decoding: Record.self) { + print(""" \(r.url): url: ${base_url}\(r.url) validation: status: .regex((2|3)\\d\\d) """) - }.transform(to: ()) + } } diff --git a/Sources/App/Commands/ReAnalyzeVersions.swift b/Sources/App/Commands/ReAnalyzeVersions.swift index c5315af89..6196da13a 100644 --- a/Sources/App/Commands/ReAnalyzeVersions.swift +++ b/Sources/App/Commands/ReAnalyzeVersions.swift @@ -88,9 +88,7 @@ enum ReAnalyzeVersions { } } do { - try await AppMetrics.push(client: client, - jobName: "re-analyze-versions") - .get() + try await AppMetrics.push(client: client, jobName: "re-analyze-versions") } catch { Current.logger().warning("\(error.localizedDescription)") } diff --git a/Sources/App/Core/AppMetrics.swift b/Sources/App/Core/AppMetrics.swift index 653f47162..80e1d1548 100644 --- a/Sources/App/Core/AppMetrics.swift +++ b/Sources/App/Core/AppMetrics.swift @@ -169,45 +169,23 @@ extension AppMetrics { /// a `/metrics` endpoint that could be scraped. Instead, they push to a gateway that is configured as a Prometheus /// scrape target. /// - Parameter client: client for POST request - /// - Returns: future - static func push(client: Client, jobName: String) -> EventLoopFuture { + static func push(client: Client, jobName: String) async throws { guard let pushGatewayUrl = Current.metricsPushGatewayUrl() else { - return client.eventLoop.future(error: AppError.envVariableNotSet("METRICS_PUSHGATEWAY_URL")) + throw AppError.envVariableNotSet("METRICS_PUSHGATEWAY_URL") } let url = URI(string: "\(pushGatewayUrl)/metrics/job/\(jobName)") - let promise = client.eventLoop.makePromise(of: String.self) do { - try MetricsSystem.prometheus().collect(into: promise) + let metrics: String = try await MetricsSystem.prometheus().collect() + _ = try await client.post(url) { req in + // append "\n" to avoid + // text format parsing error in line 4: unexpected end of input stream + try req.content.encode(metrics + "\n") + } } catch { - return client.eventLoop.future(error: error) + Current.logger().warning("AppMetrics.push failed with error: \(error)") + // ignore error - we don't want metrics issues to cause upstream failures } - - let req = promise.futureResult - .flatMap { metrics in - client.post(url) { req in - // append "\n" to avoid - // text format parsing error in line 4: unexpected end of input stream - try req.content.encode(metrics + "\n") - } - } - .transform(to: ()) - - return req - .flatMapError { error in - Current.logger().warning("AppMetrics.push failed with error: \(error)") - // absorb error - we don't want metrics issues to cause upstream failures - return client.eventLoop.future() - } - } - - - /// Async-await wrapper for `EventLoopFuture`-based `push` - /// - Parameters: - /// - client: `Client` - /// - jobName: job name - static func push(client: Client, jobName: String) async throws { - try await push(client: client, jobName: jobName).get() } } diff --git a/Sources/App/Core/Search.swift b/Sources/App/Core/Search.swift index 369671333..ec6cb99f7 100644 --- a/Sources/App/Core/Search.swift +++ b/Sources/App/Core/Search.swift @@ -402,10 +402,10 @@ enum Search { } } - static func refresh(on database: Database) -> EventLoopFuture { + static func refresh(on database: Database) async throws { guard let db = database as? SQLDatabase else { fatalError("Database must be an SQLDatabase ('as? SQLDatabase' must succeed)") } - return db.raw("REFRESH MATERIALIZED VIEW \(ident: Self.schema)").run() + try await db.raw("REFRESH MATERIALIZED VIEW \(ident: Self.schema)").run() } } diff --git a/Sources/App/Core/Stats.swift b/Sources/App/Core/Stats.swift index 1db5717e1..851e302dc 100644 --- a/Sources/App/Core/Stats.swift +++ b/Sources/App/Core/Stats.swift @@ -28,11 +28,11 @@ struct Stats: Decodable, Equatable { } extension Stats { - static func refresh(on database: Database) -> EventLoopFuture { + static func refresh(on database: Database) async throws { guard let db = database as? SQLDatabase else { fatalError("Database must be an SQLDatabase ('as? SQLDatabase' must succeed)") } - return db.raw("REFRESH MATERIALIZED VIEW \(ident: Self.schema)").run() + try await db.raw("REFRESH MATERIALIZED VIEW \(ident: Self.schema)").run() } diff --git a/Sources/App/Models/WeightedKeyword.swift b/Sources/App/Models/WeightedKeyword.swift index bb522fc26..c3b5c7c87 100644 --- a/Sources/App/Models/WeightedKeyword.swift +++ b/Sources/App/Models/WeightedKeyword.swift @@ -48,11 +48,11 @@ extension WeightedKeyword { .all(decoding: Self.self) } - static func refresh(on database: Database) -> EventLoopFuture { + static func refresh(on database: Database) async throws { guard let db = database as? SQLDatabase else { fatalError("Database must be an SQLDatabase ('as? SQLDatabase' must succeed)") } - return db.raw("REFRESH MATERIALIZED VIEW \(ident: Self.schema)").run() + try await db.raw("REFRESH MATERIALIZED VIEW \(ident: Self.schema)").run() } } diff --git a/Tests/AppTests/ApiTests.swift b/Tests/AppTests/ApiTests.swift index cf937672e..1c49b10c4 100644 --- a/Tests/AppTests/ApiTests.swift +++ b/Tests/AppTests/ApiTests.swift @@ -64,7 +64,7 @@ class ApiTests: AppTestCase { summary: "foo 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() + try await Search.refresh(on: app.db) let event = ActorIsolated(nil) Current.postPlausibleEvent = { @Sendable _, kind, path, _ in @@ -805,7 +805,7 @@ class ApiTests: AppTestCase { try await v.save(on: app.db) try await Product(version: v, type: .library(.automatic), name: "lib") .save(on: app.db) - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) let event = ActorIsolated(nil) Current.postPlausibleEvent = { @Sendable _, kind, path, _ in @@ -850,7 +850,7 @@ class ApiTests: AppTestCase { } } - func test_package_collections_packageURLs() throws { + func test_package_collections_packageURLs() async throws { try XCTSkipIf(!isRunningInCI && Current.collectionSigningPrivateKey() == nil, "Skip test for local user due to unset COLLECTION_SIGNING_PRIVATE_KEY env variable") // setup let refDate = Date(timeIntervalSince1970: 0) @@ -858,27 +858,27 @@ class ApiTests: AppTestCase { Current.apiSigningKey = { "secret" } let p1 = Package(id: UUID(uuidString: "442cf59f-0135-4d08-be00-bc9a7cebabd3")!, url: "1") - try p1.save(on: app.db).wait() + try await p1.save(on: app.db) let p2 = Package(id: UUID(uuidString: "4e256250-d1ea-4cdd-9fe9-0fc5dce17a80")!, url: "2") - try p2.save(on: app.db).wait() - try Repository(package: p1, - defaultBranch: "main", - summary: "some package").save(on: app.db).wait() - try Repository(package: p2, - defaultBranch: "main", - name: "name 2", - owner: "foo", - summary: "foo bar package").save(on: app.db).wait() + try await p2.save(on: app.db) + try await Repository(package: p1, + defaultBranch: "main", + summary: "some package").save(on: app.db) + try await Repository(package: p2, + defaultBranch: "main", + name: "name 2", + owner: "foo", + summary: "foo bar package").save(on: app.db) do { let v = try Version(package: p1, latest: .release, packageName: "Foo", reference: .tag(1, 2, 3), toolsVersion: "5.3") - try v.save(on: app.db).wait() - try Product(version: v, type: .library(.automatic), name: "p1") - .save(on: app.db).wait() + try await v.save(on: app.db) + try await Product(version: v, type: .library(.automatic), name: "p1") + .save(on: app.db) } do { let v = try Version(package: p2, @@ -886,11 +886,11 @@ class ApiTests: AppTestCase { packageName: "Bar", reference: .tag(2, 0, 0), toolsVersion: "5.4") - try v.save(on: app.db).wait() - try Product(version: v, type: .library(.automatic), name: "p2") - .save(on: app.db).wait() + try await v.save(on: app.db) + try await Product(version: v, type: .library(.automatic), name: "p2") + .save(on: app.db) } - try Search.refresh(on: app.db).wait() + try await Search.refresh(on: app.db) do { // MUT let body: ByteBuffer = .init(string: """ @@ -913,16 +913,16 @@ class ApiTests: AppTestCase { } """) - try app.test(.POST, - "api/package-collections", - headers: .bearerApplicationJSON((try .apiToken(secretKey: "secret", tier: .tier3))), - body: body, - afterResponse: { res in - // validation - XCTAssertEqual(res.status, .ok) - let pkgColl = try res.content.decode(PackageCollection.self) - assertSnapshot(of: pkgColl, as: .dump) - }) + try await app.test(.POST, + "api/package-collections", + headers: .bearerApplicationJSON((try .apiToken(secretKey: "secret", tier: .tier3))), + body: body, + afterResponse: { res async throws in + // validation + XCTAssertEqual(res.status, .ok) + let pkgColl = try res.content.decode(PackageCollection.self) + assertSnapshot(of: pkgColl, as: .dump) + }) } } diff --git a/Tests/AppTests/SearchTests.swift b/Tests/AppTests/SearchTests.swift index a1f162154..16fc505f8 100644 --- a/Tests/AppTests/SearchTests.swift +++ b/Tests/AppTests/SearchTests.swift @@ -202,7 +202,7 @@ class SearchTests: AppTestCase { 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() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["bar"], page: 1, pageSize: 20).get() @@ -248,7 +248,7 @@ class SearchTests: AppTestCase { 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() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["owner", "bar"], page: 1, pageSize: 20).get() @@ -288,7 +288,7 @@ class SearchTests: AppTestCase { try await v.save(on: app.db) try await Product(version: v, type: .library(.automatic), name: "lib").save(on: app.db) try await Product(version: v, type: .plugin, name: "plugin").save(on: app.db) - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["bar"], page: 1, pageSize: 20).get() @@ -318,7 +318,7 @@ class SearchTests: AppTestCase { 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() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["'"], page: 1, pageSize: 20).get() @@ -356,7 +356,7 @@ class SearchTests: AppTestCase { .save(on: app.db) try await packages.map { try Version(package: $0, packageName: $0.url, reference: .branch("default")) } .save(on: app.db) - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) do { // first page // MUT @@ -407,7 +407,7 @@ class SearchTests: AppTestCase { .save(on: app.db) try await packages.map { try Version(package: $0, packageName: $0.url, reference: .branch("default")) } .save(on: app.db) - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) do { // first page // MUT @@ -446,7 +446,7 @@ class SearchTests: AppTestCase { try await packages.map { try Version(package: $0, packageName: $0.url, reference: .branch("default")) } .save(on: app.db) - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) do { // page out of bounds (too large) // MUT @@ -481,7 +481,7 @@ class SearchTests: AppTestCase { summary: "\(idx)").save(on: app.db) try await Version(package: p, packageName: "\(idx)", reference: .branch("main")).save(on: app.db) } - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["foo"], page: 1, pageSize: 20).get() @@ -524,7 +524,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["ink"], page: 1, pageSize: 20).get() @@ -564,7 +564,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["foo", "bar"], page: 1, pageSize: 20).get() @@ -605,7 +605,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["bar"], page: 1, pageSize: 20).get() @@ -635,7 +635,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["foo"], page: 1, pageSize: 20).get() @@ -659,7 +659,7 @@ class SearchTests: AppTestCase { try await Version(package: p1, packageName: nil, reference: .branch("main")) .save(on: app.db) - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["foo"], page: 1, pageSize: 20).get() @@ -703,7 +703,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["ping"], page: 1, pageSize: 20).get() @@ -735,7 +735,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["syntax"], page: 1, pageSize: 20).get() @@ -801,7 +801,7 @@ class SearchTests: AppTestCase { Version(package: pkgs[0], packageName: "p0", reference: .branch("main")), Version(package: pkgs[1], packageName: "p1", reference: .branch("main")) ].save(on: app.db) - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["topic"], page: 1, pageSize: 20).get() @@ -832,7 +832,7 @@ class SearchTests: AppTestCase { try await (0..<4).map { try Version(package: pkgs[$0], packageName: "p\($0)", reference: .branch("main")) }.save(on: app.db) - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["topic"], page: 1, pageSize: 20).get() @@ -869,7 +869,7 @@ class SearchTests: AppTestCase { try await (0..<4).map { try Version(package: pkgs[$0], packageName: "p\($0)", reference: .branch("main")) }.save(on: app.db) - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["author"], page: 1, pageSize: 20).get() @@ -904,7 +904,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["foo"], page: 1, pageSize: 20).get() @@ -940,7 +940,7 @@ class SearchTests: AppTestCase { let v2 = try Version(package: p2, latest: .defaultBranch, packageName: "p2", reference: .branch("main")) try await v2.save(on: app.db) try await Product(version: v2, type: .library(.automatic), name: "ModuleName").save(on: app.db) - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["modulename"], page: 1, pageSize: 20).get() @@ -983,7 +983,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["stars:>15"], page: 1, pageSize: 20).get() @@ -1012,7 +1012,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) do { // Baseline let res = try await Search.fetch(app.db, ["test"], page: 1, pageSize: 20).get() @@ -1082,7 +1082,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) do { // MUT @@ -1125,7 +1125,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) do { // MUT @@ -1168,7 +1168,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) do { // MUT @@ -1211,7 +1211,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) do { // MUT @@ -1254,7 +1254,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) do { // MUT @@ -1303,7 +1303,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) do { // MUT @@ -1345,7 +1345,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) do { // MUT @@ -1394,7 +1394,7 @@ class SearchTests: AppTestCase { try await v.save(on: app.db) try await Product(version: v, type: .plugin, name: "plugin").save(on: app.db) } - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) do { // MUT @@ -1446,7 +1446,7 @@ class SearchTests: AppTestCase { try await v.save(on: app.db) try await Target(version: v, name: "t2", type: .macro).save(on: app.db) } - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) do { // MUT @@ -1493,7 +1493,7 @@ class SearchTests: AppTestCase { .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() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["test", "license:>mit"], page: 1, pageSize: 20).get() @@ -1518,7 +1518,7 @@ class SearchTests: AppTestCase { reference: .branch("main"), spiManifest: .init(externalLinks: .init(documentation: "doc link"))) .save(on: app.db) - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) // MUT let res = try await Search.fetch(app.db, ["1"], page: 1, pageSize: 20).get() diff --git a/Tests/AppTests/SitemapTests.swift b/Tests/AppTests/SitemapTests.swift index 4511eeb6d..6fb7c5343 100644 --- a/Tests/AppTests/SitemapTests.swift +++ b/Tests/AppTests/SitemapTests.swift @@ -31,7 +31,7 @@ class SitemapTests: SnapshotTestCase { owner: "foo") }.save(on: app.db) try await packages.map { try Version(package: $0, packageName: "foo", reference: .branch("default")) }.save(on: app.db) - try await Search.refresh(on: app.db).get() + try await Search.refresh(on: app.db) let req = Request(application: app, on: app.eventLoopGroup.next()) diff --git a/Tests/AppTests/StatsTests.swift b/Tests/AppTests/StatsTests.swift index 557541fcc..5df4e6313 100644 --- a/Tests/AppTests/StatsTests.swift +++ b/Tests/AppTests/StatsTests.swift @@ -19,20 +19,20 @@ import XCTVapor class StatsTests: AppTestCase { - func test_fetch() throws { + func test_fetch() async throws { // setup do { let pkg = Package(id: UUID(), url: "1") - try pkg.save(on: app.db).wait() + try await pkg.save(on: app.db) } do { let pkg = Package(id: UUID(), url: "2") - try pkg.save(on: app.db).wait() + try await pkg.save(on: app.db) } - try Stats.refresh(on: app.db).wait() + try await Stats.refresh(on: app.db) // MUT - let res = try Stats.fetch(on: app.db).wait() + let res = try await Stats.fetch(on: app.db).get() // validate XCTAssertEqual(res, .some(.init(packageCount: 2))) diff --git a/Tests/AppTests/Util.swift b/Tests/AppTests/Util.swift index 12c99dcb0..935ca629b 100644 --- a/Tests/AppTests/Util.swift +++ b/Tests/AppTests/Util.swift @@ -79,9 +79,9 @@ func _resetDb(_ app: Application) async throws { try await RecentPackage.refresh(on: app.db) try await RecentRelease.refresh(on: app.db) - try await Search.refresh(on: app.db).get() - try await Stats.refresh(on: app.db).get() - try await WeightedKeyword.refresh(on: app.db).get() + try await Search.refresh(on: app.db) + try await Stats.refresh(on: app.db) + try await WeightedKeyword.refresh(on: app.db) } From 2433e86ec5d84d2f6c598d86364775da69351375 Mon Sep 17 00:00:00 2001 From: "Sven A. Schmidt" Date: Fri, 23 Aug 2024 13:40:48 +0200 Subject: [PATCH 2/2] Update metrics use in route --- Sources/App/routes.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Sources/App/routes.swift b/Sources/App/routes.swift index 659948454..22358d0df 100644 --- a/Sources/App/routes.swift +++ b/Sources/App/routes.swift @@ -275,10 +275,8 @@ func routes(_ app: Application) throws { } do { // Metrics - app.get("metrics") { req -> EventLoopFuture in - let promise = req.eventLoop.makePromise(of: String.self) - try MetricsSystem.prometheus().collect(into: promise) - return promise.futureResult + app.get("metrics") { req -> String in + try await MetricsSystem.prometheus().collect() }.excludeFromOpenAPI() } }