Skip to main content

max / makenotwork

2.6 KB · 91 lines History Blame Raw
1 //! Creator workflow: login -> grant creator -> create project -> create item
2 //! -> publish -> discover
3
4 use crate::harness::TestHarness;
5 use serde_json::Value;
6
7 #[tokio::test]
8 async fn create_project_and_publish_item() {
9 let mut h = TestHarness::new().await;
10
11 // Sign up and grant creator
12 let user_id = h
13 .signup("creator1", "creator1@example.com", "password123")
14 .await;
15 h.grant_creator(user_id).await;
16
17 // Re-login so session picks up can_create_projects
18 h.client.post_form("/logout", "").await;
19 h.login("creator1", "password123").await;
20
21 // Create project
22 let resp = h
23 .client
24 .post_form("/api/projects", "slug=test-project&title=Test+Project")
25 .await;
26 assert_eq!(
27 resp.status, 200,
28 "Create project failed: {} {}",
29 resp.status, resp.text
30 );
31 let project: Value = resp.json();
32 let project_id = project["id"].as_str().expect("project should have id");
33
34 // Create item in project
35 let resp = h
36 .client
37 .post_form(
38 &format!("/api/projects/{project_id}/items"),
39 "title=Test+Item&price_cents=0&item_type=digital",
40 )
41 .await;
42 assert_eq!(
43 resp.status, 200,
44 "Create item failed: {} {}",
45 resp.status, resp.text
46 );
47 let item: Value = resp.json();
48 let item_id = item["id"].as_str().expect("item should have id");
49
50 // Make project public
51 let resp = h
52 .client
53 .put_json(
54 &format!("/api/projects/{project_id}"),
55 r#"{"is_public": true}"#,
56 )
57 .await;
58 assert_eq!(
59 resp.status, 200,
60 "Make project public failed: {} {}",
61 resp.status, resp.text
62 );
63
64 // Make item public
65 let resp = h
66 .client
67 .put_form(&format!("/api/items/{item_id}"), "is_public=true")
68 .await;
69 assert_eq!(
70 resp.status, 200,
71 "Make item public failed: {} {}",
72 resp.status, resp.text
73 );
74
75 // Check discover page includes the project (projects mode, default)
76 let resp = h.client.get("/discover").await;
77 assert_eq!(resp.status, 200, "Discover page should load");
78 assert!(
79 resp.text.contains("Test Project"),
80 "Discover page should show the published project"
81 );
82
83 // Check discover items mode includes the item
84 let resp = h.client.get("/discover?mode=items").await;
85 assert_eq!(resp.status, 200, "Discover items mode should load");
86 assert!(
87 resp.text.contains("Test Item"),
88 "Discover items mode should show the published item"
89 );
90 }
91