use super::*; #[tokio::test] async fn upload_requires_auth() { let (mut app, _) = test_app().await; let boundary = "----b"; let body_str = format!( "--{boundary}\r\nContent-Disposition: form-data; name=\"file\"; filename=\"t.png\"\r\n\r\nx\r\n--{boundary}--\r\n" ); let req = Request::builder() .method("POST") .uri("/api/v1/media/upload") .header( header::CONTENT_TYPE, format!("multipart/form-data; boundary={boundary}"), ) .body(Body::from(body_str)) .unwrap(); let (status, _): (StatusCode, Value) = send(&mut app, req).await; assert_eq!(status, StatusCode::UNAUTHORIZED); } #[tokio::test] async fn upload_success() { let (mut app, state) = test_app().await; let (int_id, doc_id) = create_author(&state.pool).await; let tok = make_token(&doc_id, int_id, raisfast::models::user::UserRole::Author); let boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW"; let png_header = b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR"; let body_bytes = { let mut v = Vec::new(); v.extend_from_slice(format!("--{boundary}\r\n").as_bytes()); v.extend_from_slice( b"Content-Disposition: form-data; name=\"file\"; filename=\"test.png\"\r\n", ); v.extend_from_slice(b"Content-Type: image/png\r\n\r\n"); v.extend_from_slice(png_header); v.extend_from_slice(format!("\r\n--{boundary}--\r\n").as_bytes()); v }; let req = Request::builder() .method("POST") .uri("/api/v1/media/upload") .header( header::CONTENT_TYPE, format!("multipart/form-data; boundary={boundary}"), ) .header(header::AUTHORIZATION, format!("Bearer {tok}")) .body(Body::from(body_bytes)) .unwrap(); let (status, body): (StatusCode, Value) = send(&mut app, req).await; assert!(status.is_success(), "upload failed: {status} {body:?}"); assert_eq!(body["code"], 0); assert!(body["data"]["id"].is_string()); assert!(body["data"]["url"].is_string()); } #[tokio::test] async fn list_requires_auth() { let (mut app, _) = test_app().await; let (status, _): (StatusCode, Value) = send(&mut app, get_req("/api/v1/media")).await; assert_eq!(status, StatusCode::UNAUTHORIZED); } #[tokio::test] async fn list_success() { let (mut app, state) = test_app().await; let (int_id, doc_id) = create_author(&state.pool).await; let tok = make_token(&doc_id, int_id, raisfast::models::user::UserRole::Author); let (status, body): (StatusCode, Value) = send(&mut app, get_auth("/api/v1/media", &tok)).await; assert!(status.is_success()); assert!(body["data"]["items"].is_array()); } #[tokio::test] async fn delete_not_found() { let (mut app, state) = test_app().await; let (int_id, doc_id) = create_author(&state.pool).await; let tok = make_token(&doc_id, int_id, raisfast::models::user::UserRole::Author); let fake = "nonexistent"; let (status, _): (StatusCode, Value) = send( &mut app, delete_auth(&format!("/api/v1/media/{fake}"), &tok), ) .await; assert_eq!(status, StatusCode::NOT_FOUND); }