Skip to main content

max / makenotwork

2.6 KB · 95 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!(
27 resp.status.is_success(),
28 "Create project failed: {} {}",
29 resp.status,
30 resp.text
31 );
32 let project: Value = resp.json();
33 let project_id = project["id"].as_str().expect("project should have id");
34
35 // Create item in project
36 let resp = h
37 .client
38 .post_form(
39 &format!("/api/projects/{project_id}/items"),
40 "title=Test+Item&price_cents=0&item_type=digital",
41 )
42 .await;
43 assert!(
44 resp.status.is_success(),
45 "Create item failed: {} {}",
46 resp.status,
47 resp.text
48 );
49 let item: Value = resp.json();
50 let item_id = item["id"].as_str().expect("item should have id");
51
52 // Make project public
53 let resp = h
54 .client
55 .put_json(
56 &format!("/api/projects/{project_id}"),
57 r#"{"is_public": true}"#,
58 )
59 .await;
60 assert!(
61 resp.status.is_success(),
62 "Make project public failed: {} {}",
63 resp.status,
64 resp.text
65 );
66
67 // Make item public
68 let resp = h
69 .client
70 .put_form(&format!("/api/items/{item_id}"), "is_public=true")
71 .await;
72 assert!(
73 resp.status.is_success(),
74 "Make item public failed: {} {}",
75 resp.status,
76 resp.text
77 );
78
79 // Check discover page includes the project (projects mode, default)
80 let resp = h.client.get("/discover").await;
81 assert_eq!(resp.status, 200, "Discover page should load");
82 assert!(
83 resp.text.contains("Test Project"),
84 "Discover page should show the published project"
85 );
86
87 // Check discover items mode includes the item
88 let resp = h.client.get("/discover?mode=items").await;
89 assert_eq!(resp.status, 200, "Discover items mode should load");
90 assert!(
91 resp.text.contains("Test Item"),
92 "Discover items mode should show the published item"
93 );
94 }
95