
BusTest.pudu
Pudu59 lines2.9 KB
1/** @Test.Events.Bus.Suite — events delivered to their listeners through the package's own mediator */2module PuduLangHttpClient.Events.BusTest34import Std.Concurrent.Cancel as Cancel5import Std.Http as Http6import Std.Io as Io7import Std.Result as Result8import Std.Test as Test9import PuduLangHttpClient.Events.Bus as Bus10import PuduLangHttpClient.Events as Events11import PuduLangHttpClient.Factory.Builder as Builder12import PuduLangHttpClient.Factory.Entry as Entry13import PuduLangHttpClient as HttpClient14import PuduLangHttpClient.Request as Request15import PuduLangHttpClient.Response as Response16import PuduLangHttpClient.Stub as Stub17import PuduLangHttpClient.Utils.Shared as Shared181920fn main() -> Int {21 let lines = Shared.shared([])22 let note = fn(line: Str) -> () { Shared.update(&lines, |held: Array[Str]| held.push(line)) }23 let listeners = Events.listeners()24 .onRequestStarted(|event: Events.RequestStarted| note("started " + event.client + " " + event.method + " " + event.uri))25 .onRequestCompleted(|event: Events.RequestCompleted| note("completed " + show(event.status)))26 .onRequestCompleted(|_event: Events.RequestCompleted| note("completed again"))27 .onRequestFailed(|event: Events.RequestFailed| note("failed " + event.failure))28 .onPipelineChanged(|event: Events.PipelineChanged| note("pipeline " + event.client + " " + show(event.generation) + " " + show(event.stage)))29 let bus = Bus.create(&listeners)30 let stub = Stub.create()31 Stub.respond(&stub, Http.Get, "/ok", 200, "")32 Stub.when(&stub, |request: Request.Request| request.uri.endsWith("/down"), |_request: Request.Request| Err(HttpClient.ResponseEnded))33 let observer = match Bus.observer(&bus) {34 case Some(found) => found35 case None => panic("listeners hear requests")36 }37 let entry = Entry.build(&Builder.named("api").observedBy(observer).withPrimary(|| Stub.send(&stub)), 1)38 let ok = Result.map(entry.send(Request.get("http://a/ok"), Cancel.token()), |r: Response.Response| r.status.code)39 let down = Result.map(entry.send(Request.get("http://a/down"), Cancel.token()), |r: Response.Response| r.status.code)40 Bus.pipelineChanged(&bus, "api", 1, Events.Closed)41 let checks = Test.suite("Events.Bus", &[42 Test.equals("announcing leaves the outcome alone", &(ok, down), &(Ok(200), Err(HttpClient.ResponseEnded))),43 Test.equals("every listener hears its events in order", &Shared.current(&lines), &[44 "started api GET http://a/ok",45 "completed 200",46 "completed again",47 "started api GET http://a/down",48 "failed The connection closed before the response was complete.",49 "pipeline api 1 Closed"50 ]),51 Test.equals("a bus no one listens to requests on adds no observer", &(Bus.observer(&Bus.create(&Events.listeners())) == None), &true)52 ])53 let ran = Test.run(&checks)54 for failure in Test.failuresOf(&ran) {55 let _reported = Io.writeErrorLine(failure)56 }57 Test.report(&ran)58}59