Gebweb hello-world TestClient smoke
Exercises every endpoint of `hello.gb` via the in-process
- Path
gebweb/examples/hello_test.gb- Category
- General
TestClient. Runnable without a network port:
geblang examples/hello_test.gb
Useful as a CI-friendly smoke for the Gebweb framework wiring.
Source
import gebweb;
import io;
class GreetingDTO {
string name;
?string greeting;
}
class HelloController {
dict<string, dict<string, any>> greetings;
func HelloController() {
this.greetings = {};
}
@Get("/")
func index(): dict<string, any> {
return {"service": "gebweb-hello", "version": "0.1.0"};
}
@Get("/hello/{name}")
func hello(string name, ?string lang): dict<string, any> {
string g = "Hello";
if (lang != null) {
let normalised = (lang as string).lower();
if (normalised == "fr") { g = "Bonjour"; }
if (normalised == "es") { g = "Hola"; }
if (normalised == "de") { g = "Hallo"; }
}
return {"message": g + ", " + name + "!"};
}
@Post("/greetings")
func store(GreetingDTO body): dict<string, any> {
string g = "Hello";
if (body.greeting != null) {
g = body.greeting as string;
}
dict<string, any> entry = {"name": body.name, "greeting": g};
this.greetings[body.name] = entry;
return entry;
}
@Get("/greetings/{name}")
func lookup(string name): dict<string, any> {
if (!this.greetings.contains(name)) {
throw gebweb.notFound("no greeting for '" + name + "'");
}
return this.greetings[name];
}
}
let client = gebweb.TestClient(gebweb.app([HelloController()]));
let banner = client.get("/");
banner.assertStatus(200);
io.println("banner: " + banner.text());
let fr = client.get("/hello/Ada?lang=fr");
fr.assertStatus(200);
io.println("hello-fr: " + fr.text());
let stored = client.post("/greetings", {"name": "Ada", "greeting": "Ahoy"});
stored.assertStatus(200);
io.println("stored: " + stored.text());
let fetched = client.get("/greetings/Ada");
fetched.assertStatus(200);
io.println("fetched: " + fetched.text());
let missing = client.get("/greetings/Bob");
missing.assertStatus(404);
io.println("missing: " + missing.text());