+87
-1
src/main.rs
+87
-1
src/main.rs
···
231
231
#[cfg(test)]
232
232
mod tests {
233
233
use super::*;
234
-
use crate::api::status_read::get_custom_emojis;
234
+
use crate::api::status_read::{api_feed, feed, get_custom_emojis};
235
235
use actix_web::{App, test};
236
236
237
237
#[actix_web::test]
···
257
257
258
258
let resp = test::call_service(&app, req).await;
259
259
assert!(resp.status().is_success());
260
+
}
261
+
262
+
#[actix_web::test]
263
+
async fn test_feed_html_has_status_list_container() {
264
+
use async_sqlite::PoolBuilder;
265
+
use atrium_identity::did::{
266
+
CommonDidResolver, CommonDidResolverConfig, DEFAULT_PLC_DIRECTORY_URL,
267
+
};
268
+
use atrium_oauth::DefaultHttpClient;
269
+
270
+
let cfg = crate::config::Config::from_env().expect("load config");
271
+
let pool = PoolBuilder::new()
272
+
.path(":memory:")
273
+
.open()
274
+
.await
275
+
.expect("pool");
276
+
let arc_pool = std::sync::Arc::new(pool);
277
+
278
+
let resolver = CommonDidResolver::new(CommonDidResolverConfig {
279
+
plc_directory_url: DEFAULT_PLC_DIRECTORY_URL.to_string(),
280
+
http_client: std::sync::Arc::new(DefaultHttpClient::default()),
281
+
});
282
+
let handle_resolver = std::sync::Arc::new(resolver);
283
+
284
+
let app = test::init_service(
285
+
App::new()
286
+
.app_data(web::Data::new(cfg))
287
+
.app_data(web::Data::new(arc_pool))
288
+
.app_data(web::Data::new(handle_resolver))
289
+
.service(feed),
290
+
)
291
+
.await;
292
+
293
+
let req = test::TestRequest::get().uri("/feed").to_request();
294
+
let resp = test::call_service(&app, req).await;
295
+
assert!(resp.status().is_success());
296
+
let body = test::read_body(resp).await;
297
+
let html = String::from_utf8(body.to_vec()).expect("utf8");
298
+
assert!(
299
+
html.contains("class=\"status-list\""),
300
+
"feed HTML must include an empty .status-list container for client-side population"
301
+
);
302
+
}
303
+
304
+
#[actix_web::test]
305
+
async fn test_api_feed_shape() {
306
+
use async_sqlite::PoolBuilder;
307
+
use atrium_identity::did::{
308
+
CommonDidResolver, CommonDidResolverConfig, DEFAULT_PLC_DIRECTORY_URL,
309
+
};
310
+
use atrium_oauth::DefaultHttpClient;
311
+
use serde_json::Value;
312
+
313
+
let pool = PoolBuilder::new()
314
+
.path(":memory:")
315
+
.open()
316
+
.await
317
+
.expect("pool");
318
+
let arc_pool = std::sync::Arc::new(pool);
319
+
let resolver = CommonDidResolver::new(CommonDidResolverConfig {
320
+
plc_directory_url: DEFAULT_PLC_DIRECTORY_URL.to_string(),
321
+
http_client: std::sync::Arc::new(DefaultHttpClient::default()),
322
+
});
323
+
let handle_resolver = std::sync::Arc::new(resolver);
324
+
325
+
let app = test::init_service(
326
+
App::new()
327
+
.app_data(web::Data::new(arc_pool))
328
+
.app_data(web::Data::new(handle_resolver))
329
+
.service(api_feed),
330
+
)
331
+
.await;
332
+
333
+
let req = test::TestRequest::get()
334
+
.uri("/api/feed?offset=0&limit=20")
335
+
.to_request();
336
+
let resp = test::call_service(&app, req).await;
337
+
assert!(resp.status().is_success());
338
+
let body = test::read_body(resp).await;
339
+
let v: Value = serde_json::from_slice(&body).expect("json");
340
+
assert!(
341
+
v.get("statuses").map(|s| s.is_array()).unwrap_or(false),
342
+
"statuses must be an array"
343
+
);
344
+
assert!(v.get("has_more").is_some(), "has_more present");
345
+
assert!(v.get("next_offset").is_some(), "next_offset present");
260
346
}
261
347
262
348
#[actix_web::test]