Waldo_test.res
1open VitestHelpers
2
3// Test data matching the Waldo API format
4let sampleResultJson = `{
5 "gid": 102191569,
6 "name": "Washington",
7 "placetype": "region",
8 "lon": -77.0369,
9 "lat": 38.9072,
10 "distance": 0.0,
11 "bearing": 0.0,
12 "region": ["Washington", "District of Columbia", "United States", "North America"],
13 "country": "US"
14}`
15
16let sampleGeocodeResponseJson = `{
17 "results": [${sampleResultJson}],
18 "num_results": 1
19}`
20
21let sampleErrorResponseJson = `{
22 "error": "missing required parameter: q"
23}`
24
25describe("Waldo FFI bindings", () => {
26 describe("decodeResult", () => {
27 test("decodes valid result", ctx => {
28 let json = JSON.parseExn(sampleResultJson)
29 switch Waldo.decodeResult(json) {
30 | Some(result) => {
31 ctx->expect(result.gid)->toBe(102191569)
32 ctx->expect(result.name)->toBe("Washington")
33 ctx->expect(result.placetype)->toBe("region")
34 ctx->expect(result.lon)->toBeCloseTo(-77.0369, ~digits=4)
35 ctx->expect(result.lat)->toBeCloseTo(38.9072, ~digits=4)
36 ctx->expect(result.distance)->toBeCloseTo(0.0, ~digits=4)
37 ctx->expect(result.bearing)->toBeCloseTo(0.0, ~digits=4)
38 ctx->expect(result.region)->toEqual(["Washington", "District of Columbia", "United States", "North America"])
39 ctx->expect(result.country)->toBe("US")
40 }
41 | None => ctx->fail("Should decode result")
42 }
43 })
44
45 test("returns None for invalid JSON", ctx => {
46 let json = JSON.parseExn(`{"invalid": "data"}`)
47 ctx->expect(Waldo.decodeResult(json))->toEqual(None)
48 })
49
50 test("returns None for missing fields", ctx => {
51 let json = JSON.parseExn(`{"gid": 123}`)
52 ctx->expect(Waldo.decodeResult(json))->toEqual(None)
53 })
54 })
55
56 describe("decodeGeocodeResponse", () => {
57 test("decodes valid geocode response", ctx => {
58 let json = JSON.parseExn(sampleGeocodeResponseJson)
59 switch Waldo.decodeGeocodeResponse(json) {
60 | Some(response) => {
61 ctx->expect(response.numResults)->toBe(1)
62 ctx->expect(response.results)->toHaveLength(1)
63 switch response.results[0] {
64 | Some(first) => ctx->expect(first.name)->toBe("Washington")
65 | None => ctx->fail("Should have first result")
66 }
67 }
68 | None => ctx->fail("Should decode response")
69 }
70 })
71
72 test("returns None for invalid response", ctx => {
73 let json = JSON.parseExn(`{"invalid": "data"}`)
74 ctx->expect(Waldo.decodeGeocodeResponse(json))->toEqual(None)
75 })
76 })
77
78 describe("decodeErrorResponse", () => {
79 test("decodes error response", ctx => {
80 let json = JSON.parseExn(sampleErrorResponseJson)
81 switch Waldo.decodeErrorResponse(json) {
82 | Some(err) => ctx->expect(err.error)->toBe("missing required parameter: q")
83 | None => ctx->fail("Should decode error")
84 }
85 })
86
87 test("returns None for non-error JSON", ctx => {
88 let json = JSON.parseExn(`{"success": true}`)
89 ctx->expect(Waldo.decodeErrorResponse(json))->toEqual(None)
90 })
91 })
92
93 describe("Forward.buildUrl", () => {
94 test("builds URL with query only", ctx => {
95 let params: Waldo.Forward.params = {query: "Washington DC"}
96 let url = Waldo.Forward.buildUrl(params)
97 ctx->expect(url)->toBe("/forward?q=Washington%20DC")
98 })
99
100 test("builds URL with bias point", ctx => {
101 let params: Waldo.Forward.params = {query: "Washington", biasPoint: (-77.0, 38.9)}
102 let url = Waldo.Forward.buildUrl(params)
103 ctx->expect(url)->toInclude("q=Washington")
104 ctx->expect(url)->toInclude("lon=-77")
105 ctx->expect(url)->toInclude("lat=38.9")
106 })
107
108 test("URL encodes special characters", ctx => {
109 let params: Waldo.Forward.params = {query: "São Paulo"}
110 let url = Waldo.Forward.buildUrl(params)
111 ctx->expect(url->String.includes(" "))->toEqual(false)
112 ctx->expect(url)->toInclude("q=S%C3%A3o%20Paulo")
113 })
114 })
115
116 describe("Reverse.buildUrl", () => {
117 test("builds URL with coordinates", ctx => {
118 let params: Waldo.Reverse.params = {lon: -77.0369, lat: 38.9072}
119 let url = Waldo.Reverse.buildUrl(params)
120 ctx->expect(url)->toBe("/reverse?lon=-77.0369&lat=38.9072")
121 })
122 })
123})