London Escorts sunderland escorts 1v1.lol unblocked yohoho 76 https://www.symbaloo.com/mix/yohoho?lang=EN yohoho https://www.symbaloo.com/mix/agariounblockedpvp https://yohoho-io.app/ https://www.symbaloo.com/mix/agariounblockedschool1?lang=EN
2.6 C
New York
Friday, January 31, 2025

Operating and testing async Vapor instructions


How you can run async instructions in Vapor?

The async / await function is comparatively new in Swift and a few framework authors have not transformed every thing to reap the benefits of these new key phrases. At present, that is the state of affairs with the Command API in Vapor 4. You’ll be able to already outline async instructions, however there is no option to register them utilizing the Vapor framework. Happily, there’s a comparatively easy workaround that you need to use if you wish to execute instructions utilizing an asynchronous context. ?

First we will outline a helper protocol and create an asyncRun operate. We’re going to lengthen the unique Command protocol and supply a default implementation for the run methodology.

import Vapor

public protocol AsyncCommand: Command {
    
    func asyncRun(
        utilizing context: CommandContext,
        signature: Signature
    ) async throws
}

public extension AsyncCommand {

    func run(
        utilizing context: CommandContext,
        signature: Signature
    ) throws {
        let promise = context
            .utility
            .eventLoopGroup
            .subsequent()
            .makePromise(of: Void.self)
        
        promise.completeWithTask {
            attempt await asyncRun(
                utilizing: context,
                signature: signature
            )
        }
        attempt promise.futureResult.wait()
    }
}

This fashion it’s best to have the ability to create a brand new async command and it’s best to implement the asyncRun methodology if you wish to name some asynchronous Swift code.

import Vapor

ultimate class MyAsyncCommand: AsyncCommand {
    
    static let title = "async"
    
    let assist = "This command run asynchronously."

    struct Signature: CommandSignature {}

    func asyncRun(
        utilizing context: CommandContext,
        signature: Signature
    ) async throws {
        context.console.information("That is async.")
    }
}

It’s doable to register the command utilizing the configure methodology, you’ll be able to do that out by working the swift run Run async snippet if you’re utilizing the usual Vapor template. ?

import Vapor

public func configure(
    _ app: Utility
) throws {

    app.instructions.use(
        MyAsyncCommand(),
        as: MyAsyncCommand.title
    )

    attempt routes(app)
}

As you’ll be able to see it is a fairly neat trick, it is also talked about on GitHub, however hopefully we do not want this workaround for too lengthy and correct async command assist will arrive in Vapor 4.x.

Unit testing Vapor instructions

This matter has actually zero documentation, so I believed it will be good to let you know a bit about the right way to unit take a look at scripts created through ConsoleKit. Initially we want a TestConsole that we are able to use to gather the output of our instructions. It is a shameless ripoff from ConsoleKit. ?

import Vapor

ultimate class TestConsole: Console {

    var testInputQueue: [String]
    var testOutputQueue: [String]
    var userInfo: [AnyHashable : Any]

    init() {
        self.testInputQueue = []
        self.testOutputQueue = []
        self.userInfo = [:]
    }

    func enter(isSecure: Bool) -> String {
        testInputQueue.popLast() ?? ""
    }

    func output(_ textual content: ConsoleText, newLine: Bool) {
        let line = textual content.description + (newLine ? "n" : "")
        testOutputQueue.insert(line, at: 0)
    }

    func report(error: String, newLine: Bool) {
        
    }

    func clear(_ sort: ConsoleClear) {
        
    }

    var measurement: (width: Int, peak: Int) {
        (0, 0)
    }
}

Now contained in the take a look at suite, it’s best to create a brand new utility occasion utilizing the take a look at setting and configure it for testing functions. Then it’s best to provoke the command that you just’d like to check and run it utilizing the take a look at console. You simply should create a brand new context and a correct enter with the mandatory arguments and the console.run operate will care for every thing else.

@testable import App
import XCTVapor

ultimate class AppTests: XCTestCase {
    
    func testCommand() throws {
        let app = Utility(.testing)
        defer { app.shutdown() }
        attempt configure(app)
        
        let command = MyAsyncCommand()
        let arguments = ["async"]
        
        let console = TestConsole()
        let enter = CommandInput(arguments: arguments)
        var context = CommandContext(
            console: console,
            enter: enter
        )
        context.utility = app
        
        attempt console.run(command, with: context)

        let output = console
            .testOutputQueue
            .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
        
        let expectation = [
            "This is async."
        ]
        XCTAssertEqual(output, expectation)
    }
}

The great factor about this answer is that the ConsoleKit framework will robotically parse the arguments, choices and the flags. You’ll be able to present these as standalone array components utilizing the enter arguments array (e.g. ["arg1", "--option1", "value1", "--flag1"]).

It’s doable to check command teams, you simply have so as to add the precise command title as the primary argument that you just’d wish to run from the group and you may merely verify the output by way of the take a look at console if you’re in search of the precise command outcomes. ?

Related Articles

Social Media Auto Publish Powered By : XYZScripts.com