
Testing.pudu
Pudu39 lines1.9 KB
1/** @Examples.Testing.Program — a client tested against a stub primary handler */2module Testing34import Std.Http as Http5import Std.Io as Io6import PuduLangHttpClient.Client as Client7import PuduLangHttpClient.Factory.Builder as Builder8import PuduLangHttpClient.Factory as Factory9import PuduLangHttpClient as HttpClient10import PuduLangHttpClient.Request as Request11import PuduLangHttpClient.Response as Response12import PuduLangHttpClient.Stub as Stub131415fn forecast(client: &Client.Client, city: Str) -> Str {16 match Client.getText(client, "forecast?city=" + city) {17 case Ok(text) => city + ": " + text18 case Err(HttpClient.Unsuccessful(404, _)) => city + ": unknown"19 case Err(failure) => city + ": " + HttpClient.describe(&failure)20 }21}222324fn main() -> Int {25 let stub = Stub.create()26 Stub.when(&stub, |request: Request.Request| request.uri.endsWith("city=Lima"), |request: Request.Request| Ok(Response.answer(&request, 200).withText("sunny")))27 Stub.when(&stub, |request: Request.Request| request.uri.endsWith("city=Oslo"), |_request: Request.Request| Err(HttpClient.Connection("refused")))28 let factory = match Factory.build([Builder.named("weather").withBaseAddress("https://weather.test/").withPrimary(|| Stub.send(&stub))]) {29 case Ok(built) => built30 case Err(invalid) => panic(Factory.explain(&invalid))31 }32 let client = Factory.createClient(&factory, "weather")33 let answers = [forecast(&client, "Lima"), forecast(&client, "Pune"), forecast(&client, "Oslo")]34 for answer in answers { let _said = Io.writeLine(answer) }35 let asked = Stub.received(&stub).map(|request: Request.Request| request.uri)36 let expected = ["Lima: sunny", "Pune: unknown", "Oslo: The connection failed: refused"]37 if answers == expected && asked.length() == 3 && asked[0] == "https://weather.test/forecast?city=Lima" && Stub.received(&stub)[0].method == Http.Get { 0 } else { 1 }38}39