1+ import os
2+
13from fastapi .testclient import TestClient
24
5+ os .environ ["DATABASE_URL" ] = "sqlite+pysqlite:///:memory:"
6+ os .environ ["ENABLE_PUBLIC_WORKSPACE_ISSUE" ] = "1"
7+
38import app .main as main
49from app .distance import haversine_km
510from app .geocoding import GeocodeResult , ReverseGeocodeResult
611
712
13+ def _auth_headers (client : TestClient ) -> dict [str , str ]:
14+ token_res = client .post ("/api/workspaces/issue" )
15+ assert token_res .status_code == 200 , token_res .text
16+ token = token_res .json ()["workspace_token" ]
17+ return {"Authorization" : f"Bearer { token } " }
18+
19+
820def test_geocode_endpoint_uses_provider (monkeypatch ) -> None :
921 def fake_geocode_address (query : str , * , limit : int = 5 ) -> list [GeocodeResult ]:
1022 assert query .strip () == "Waymo"
@@ -14,7 +26,8 @@ def fake_geocode_address(query: str, *, limit: int = 5) -> list[GeocodeResult]:
1426 monkeypatch .setattr (main , "geocode_address" , fake_geocode_address )
1527
1628 with TestClient (main .app ) as client :
17- res = client .get ("/api/geocode" , params = {"query" : "Waymo" , "limit" : 1 })
29+ headers = _auth_headers (client )
30+ res = client .get ("/api/geocode" , params = {"query" : "Waymo" , "limit" : 1 }, headers = headers )
1831 assert res .status_code == 200 , res .text
1932 data = res .json ()
2033 assert data == [{"display_name" : "Waymo HQ" , "lat" : 37.416 , "lng" : - 122.077 }]
@@ -33,8 +46,11 @@ def fake_reverse_geocode(lat: float, lng: float, *, zoom: int = 10) -> ReverseGe
3346 monkeypatch .setattr (main , "reverse_geocode" , fake_reverse_geocode )
3447
3548 with TestClient (main .app ) as client :
49+ headers = _auth_headers (client )
3650 res = client .get (
37- "/api/reverse_geocode" , params = {"lat" : 37.416 , "lng" : - 122.077 , "zoom" : 18 }
51+ "/api/reverse_geocode" ,
52+ params = {"lat" : 37.416 , "lng" : - 122.077 , "zoom" : 18 },
53+ headers = headers ,
3854 )
3955 assert res .status_code == 200 , res .text
4056 data = res .json ()
@@ -51,12 +67,14 @@ def fake_geocode_address(query: str, *, limit: int = 5) -> list[GeocodeResult]:
5167 monkeypatch .setattr (main , "geocode_address" , fake_geocode_address )
5268
5369 with TestClient (main .app ) as client :
70+ headers = _auth_headers (client )
5471 res = client .post (
5572 "/api/targets" ,
5673 json = {
5774 "name" : "Workplace" ,
5875 "address" : "690 E Middlefield Rd, Mountain View, CA 94043" ,
5976 },
77+ headers = headers ,
6078 )
6179 assert res .status_code == 200 , res .text
6280 data = res .json ()
@@ -77,9 +95,11 @@ def fake_reverse_geocode(lat: float, lng: float, *, zoom: int = 10) -> ReverseGe
7795 monkeypatch .setattr (main , "reverse_geocode" , fake_reverse_geocode )
7896
7997 with TestClient (main .app ) as client :
98+ headers = _auth_headers (client )
8099 res = client .post (
81100 "/api/targets" ,
82101 json = {"name" : "Workplace" , "lat" : 37.416 , "lng" : - 122.077 },
102+ headers = headers ,
83103 )
84104 assert res .status_code == 200 , res .text
85105 data = res .json ()
@@ -90,6 +110,7 @@ def fake_reverse_geocode(lat: float, lng: float, *, zoom: int = 10) -> ReverseGe
90110
91111def test_target_rejects_both_address_and_coords () -> None :
92112 with TestClient (main .app ) as client :
113+ headers = _auth_headers (client )
93114 res = client .post (
94115 "/api/targets" ,
95116 json = {
@@ -98,6 +119,7 @@ def test_target_rejects_both_address_and_coords() -> None:
98119 "lat" : 37.416 ,
99120 "lng" : - 122.077 ,
100121 },
122+ headers = headers ,
101123 )
102124 assert res .status_code == 422 , res .text
103125
@@ -109,7 +131,12 @@ def fake_reverse_geocode(lat: float, lng: float, *, zoom: int = 10) -> ReverseGe
109131 monkeypatch .setattr (main , "reverse_geocode" , fake_reverse_geocode )
110132
111133 with TestClient (main .app ) as client :
112- t = client .post ("/api/targets" , json = {"name" : "Workplace" , "lat" : 37.416 , "lng" : - 122.077 })
134+ headers = _auth_headers (client )
135+ t = client .post (
136+ "/api/targets" ,
137+ json = {"name" : "Workplace" , "lat" : 37.416 , "lng" : - 122.077 },
138+ headers = headers ,
139+ )
113140 assert t .status_code == 200 , t .text
114141 target_id = t .json ()["id" ]
115142
@@ -127,6 +154,7 @@ def fake_reverse_geocode(lat: float, lng: float, *, zoom: int = 10) -> ReverseGe
127154 "location_text" : "Mountain View, CA" ,
128155 "captured_at" : "2026-01-30T12:00:00Z" ,
129156 },
157+ headers = headers ,
130158 )
131159 assert l1 .status_code == 200 , l1 .text
132160
@@ -141,10 +169,11 @@ def fake_reverse_geocode(lat: float, lng: float, *, zoom: int = 10) -> ReverseGe
141169 "price_value" : 2500 ,
142170 "captured_at" : "2026-01-30T10:00:00Z" ,
143171 },
172+ headers = headers ,
144173 )
145174 assert l2 .status_code == 200 , l2 .text
146175
147- res = client .get ("/api/compare" , params = {"target_id" : target_id })
176+ res = client .get ("/api/compare" , params = {"target_id" : target_id }, headers = headers )
148177 assert res .status_code == 200 , res .text
149178 data = res .json ()
150179
@@ -163,7 +192,8 @@ def fake_reverse_geocode(lat: float, lng: float, *, zoom: int = 10) -> ReverseGe
163192
164193def test_listings_summary_empty_then_one () -> None :
165194 with TestClient (main .app ) as client :
166- empty = client .get ("/api/listings/summary" )
195+ headers = _auth_headers (client )
196+ empty = client .get ("/api/listings/summary" , headers = headers )
167197 assert empty .status_code == 200 , empty .text
168198 assert empty .json () == {"count" : 0 , "latest_id" : None , "latest_captured_at" : None }
169199
@@ -177,11 +207,12 @@ def test_listings_summary_empty_then_one() -> None:
177207 "price_period" : "unknown" ,
178208 "captured_at" : "2026-01-30T10:00:00Z" ,
179209 },
210+ headers = headers ,
180211 )
181212 assert created .status_code == 200 , created .text
182213 listing_id = created .json ()["id" ]
183214
184- after = client .get ("/api/listings/summary" )
215+ after = client .get ("/api/listings/summary" , headers = headers )
185216 assert after .status_code == 200 , after .text
186217 data = after .json ()
187218 assert data ["count" ] == 1
@@ -191,6 +222,7 @@ def test_listings_summary_empty_then_one() -> None:
191222
192223def test_upsert_listing_accepts_blueground_source () -> None :
193224 with TestClient (main .app ) as client :
225+ headers = _auth_headers (client )
194226 created = client .post (
195227 "/api/listings" ,
196228 json = {
@@ -204,6 +236,7 @@ def test_upsert_listing_accepts_blueground_source() -> None:
204236 "lng" : - 122.104919 ,
205237 "location_text" : "Mountain View, CA" ,
206238 },
239+ headers = headers ,
207240 )
208241 assert created .status_code == 200 , created .text
209242 data = created .json ()
0 commit comments