slack status without the slack status.zzstoatzz.io/
quickslice

fmt: rustfmt regression tests

Changed files
+87 -1
src
+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]