//! Creator workflow: login -> grant creator -> create project -> create item //! -> publish -> discover use crate::harness::TestHarness; use serde_json::Value; #[tokio::test] async fn create_project_and_publish_item() { let mut h = TestHarness::new().await; // Sign up and grant creator let user_id = h.signup("creator1", "creator1@example.com", "password123").await; h.grant_creator(user_id).await; // Re-login so session picks up can_create_projects h.client.post_form("/logout", "").await; h.login("creator1", "password123").await; // Create project let resp = h .client .post_form("/api/projects", "slug=test-project&title=Test+Project") .await; assert!( resp.status.is_success(), "Create project failed: {} {}", resp.status, resp.text ); let project: Value = resp.json(); let project_id = project["id"].as_str().expect("project should have id"); // Create item in project let resp = h .client .post_form( &format!("/api/projects/{}/items", project_id), "title=Test+Item&price_cents=0&item_type=digital", ) .await; assert!( resp.status.is_success(), "Create item failed: {} {}", resp.status, resp.text ); let item: Value = resp.json(); let item_id = item["id"].as_str().expect("item should have id"); // Make project public let resp = h .client .put_json( &format!("/api/projects/{}", project_id), r#"{"is_public": true}"#, ) .await; assert!( resp.status.is_success(), "Make project public failed: {} {}", resp.status, resp.text ); // Make item public let resp = h .client .put_form(&format!("/api/items/{}", item_id), "is_public=true") .await; assert!( resp.status.is_success(), "Make item public failed: {} {}", resp.status, resp.text ); // Check discover page includes the project (projects mode, default) let resp = h.client.get("/discover").await; assert_eq!(resp.status, 200, "Discover page should load"); assert!( resp.text.contains("Test Project"), "Discover page should show the published project" ); // Check discover items mode includes the item let resp = h.client.get("/discover?mode=items").await; assert_eq!(resp.status, 200, "Discover items mode should load"); assert!( resp.text.contains("Test Item"), "Discover items mode should show the published item" ); }