Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-httpclient

Named HTTP clients for Pudu: a client factory, delegating handlers, pooled keep-alive connections, handler lifetimes, logging, and resilience

0.1.1Apache-2.01

InstallClose

Testing.pudu

Pudu39 lines1.9 KB

GitHub ↗
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 Stub1314/// Answers the weather from a client, the code under test.15fn 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}2223/// Checks the code under test against stubbed answers, answering 0 when every case held.24fn 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