job_traits.rs (7590B)
1 #[path = "../src/test_fixtures.rs"] 2 mod test_fixtures; 3 4 use radroots_events::RadrootsNostrEvent; 5 use radroots_events::job::{JobFeedbackStatus, JobInputType, JobPaymentRequest}; 6 use radroots_events::job_feedback::RadrootsJobFeedback; 7 use radroots_events::job_request::{RadrootsJobInput, RadrootsJobParam, RadrootsJobRequest}; 8 use radroots_events::job_result::RadrootsJobResult; 9 use radroots_events::kinds::{KIND_JOB_FEEDBACK, KIND_JOB_REQUEST_MIN, KIND_JOB_RESULT_MIN}; 10 use radroots_events_codec::job::feedback::encode::to_wire_parts as to_feedback_wire_parts; 11 use radroots_events_codec::job::request::encode::to_wire_parts as to_request_wire_parts; 12 use radroots_events_codec::job::result::encode::to_wire_parts as to_result_wire_parts; 13 use radroots_events_codec::job::traits::{BorrowedEventAdapter, JobEventLike}; 14 use test_fixtures::{FIXTURE_ALICE_PUBLIC_KEY_HEX, RELAY_PRIMARY_WSS}; 15 16 fn sample_request() -> RadrootsJobRequest { 17 RadrootsJobRequest { 18 kind: (KIND_JOB_REQUEST_MIN + 1) as u16, 19 inputs: vec![RadrootsJobInput { 20 data: "hello".to_string(), 21 input_type: JobInputType::Text, 22 relay: None, 23 marker: None, 24 }], 25 output: None, 26 params: vec![RadrootsJobParam { 27 key: "foo".to_string(), 28 value: "bar".to_string(), 29 }], 30 bid_sat: None, 31 relays: Vec::new(), 32 providers: vec!["provider".to_string()], 33 topics: Vec::new(), 34 encrypted: false, 35 } 36 } 37 38 #[test] 39 fn borrowed_event_adapter_builds_request_metadata() { 40 let req = sample_request(); 41 let parts = to_request_wire_parts(&req, "payload").unwrap(); 42 43 let event = RadrootsNostrEvent { 44 id: "id".to_string(), 45 author: "author".to_string(), 46 created_at: 42, 47 kind: parts.kind, 48 tags: parts.tags.clone(), 49 content: "payload".to_string(), 50 sig: "sig".to_string(), 51 }; 52 53 let adapter = BorrowedEventAdapter::new(&event, event.created_at, &event.tags, &event.sig); 54 let metadata = adapter.to_job_request_metadata().unwrap(); 55 56 assert_eq!(metadata.id, event.id); 57 assert_eq!(metadata.author, event.author); 58 assert_eq!(metadata.published_at, event.created_at); 59 assert_eq!(metadata.kind, event.kind); 60 assert_eq!(metadata.data, req); 61 } 62 63 fn sample_result() -> RadrootsJobResult { 64 RadrootsJobResult { 65 kind: (KIND_JOB_RESULT_MIN + 1) as u16, 66 request_event: radroots_events::RadrootsNostrEventPtr { 67 id: "req".to_string(), 68 relays: Some(RELAY_PRIMARY_WSS.to_string()), 69 }, 70 request_json: Some("{\"foo\":\"bar\"}".to_string()), 71 inputs: vec![RadrootsJobInput { 72 data: "hello".to_string(), 73 input_type: JobInputType::Text, 74 relay: None, 75 marker: None, 76 }], 77 customer_pubkey: Some(FIXTURE_ALICE_PUBLIC_KEY_HEX.to_string()), 78 payment: Some(JobPaymentRequest { 79 amount_sat: 1, 80 bolt11: None, 81 }), 82 content: Some("payload".to_string()), 83 encrypted: false, 84 } 85 } 86 87 fn sample_feedback() -> RadrootsJobFeedback { 88 RadrootsJobFeedback { 89 kind: KIND_JOB_FEEDBACK as u16, 90 status: JobFeedbackStatus::Processing, 91 extra_info: Some("processing".to_string()), 92 request_event: radroots_events::RadrootsNostrEventPtr { 93 id: "req".to_string(), 94 relays: Some(RELAY_PRIMARY_WSS.to_string()), 95 }, 96 customer_pubkey: Some(FIXTURE_ALICE_PUBLIC_KEY_HEX.to_string()), 97 payment: Some(JobPaymentRequest { 98 amount_sat: 2, 99 bolt11: None, 100 }), 101 content: Some("payload".to_string()), 102 encrypted: false, 103 } 104 } 105 106 #[test] 107 fn borrowed_event_adapter_builds_request_metadata_and_index() { 108 let req = sample_request(); 109 let parts = to_request_wire_parts(&req, "payload").unwrap(); 110 let event = RadrootsNostrEvent { 111 id: "id".to_string(), 112 author: "author".to_string(), 113 created_at: 42, 114 kind: parts.kind, 115 tags: parts.tags, 116 content: "payload".to_string(), 117 sig: "sig".to_string(), 118 }; 119 120 let adapter = BorrowedEventAdapter::new(&event, event.created_at, &event.tags, &event.sig); 121 assert_eq!(adapter.raw_id(), "id"); 122 assert_eq!(adapter.raw_author(), "author"); 123 assert_eq!(adapter.raw_published_at(), 42); 124 assert_eq!(adapter.raw_kind(), event.kind); 125 assert_eq!(adapter.raw_content(), "payload"); 126 assert_eq!(adapter.raw_tags().len(), event.tags.len()); 127 assert_eq!(adapter.raw_sig(), "sig"); 128 129 let index = adapter.to_job_request_event_index().unwrap(); 130 assert_eq!(index.event.id, event.id); 131 assert_eq!(index.event.author, event.author); 132 assert_eq!(index.event.created_at, event.created_at); 133 assert_eq!(index.event.kind, event.kind); 134 assert_eq!(index.event.content, event.content); 135 assert_eq!(index.event.sig, event.sig); 136 } 137 138 #[test] 139 fn borrowed_event_adapter_builds_result_metadata_and_index() { 140 let result = sample_result(); 141 let parts = to_result_wire_parts(&result, "payload").unwrap(); 142 let event = RadrootsNostrEvent { 143 id: "id".to_string(), 144 author: "author".to_string(), 145 created_at: 42, 146 kind: parts.kind, 147 tags: parts.tags, 148 content: "payload".to_string(), 149 sig: "sig".to_string(), 150 }; 151 152 let adapter = BorrowedEventAdapter::new(&event, event.created_at, &event.tags, &event.sig); 153 let metadata = adapter.to_job_result_metadata().unwrap(); 154 assert_eq!(metadata.id, event.id); 155 assert_eq!(metadata.author, event.author); 156 assert_eq!(metadata.published_at, event.created_at); 157 assert_eq!(metadata.kind, event.kind); 158 assert_eq!(metadata.data.kind, result.kind); 159 assert_eq!(metadata.data.request_event.id, "req"); 160 assert_eq!(metadata.data.content.as_deref(), Some("payload")); 161 162 let index = adapter.to_job_result_event_index().unwrap(); 163 assert_eq!(index.event.id, event.id); 164 assert_eq!(index.event.author, event.author); 165 assert_eq!(index.event.created_at, event.created_at); 166 assert_eq!(index.event.kind, event.kind); 167 assert_eq!(index.event.content, event.content); 168 assert_eq!(index.event.sig, event.sig); 169 } 170 171 #[test] 172 fn borrowed_event_adapter_builds_feedback_metadata_and_index() { 173 let feedback = sample_feedback(); 174 let parts = to_feedback_wire_parts(&feedback, "payload").unwrap(); 175 let event = RadrootsNostrEvent { 176 id: "id".to_string(), 177 author: "author".to_string(), 178 created_at: 42, 179 kind: parts.kind, 180 tags: parts.tags, 181 content: "payload".to_string(), 182 sig: "sig".to_string(), 183 }; 184 185 let adapter = BorrowedEventAdapter::new(&event, event.created_at, &event.tags, &event.sig); 186 let metadata = adapter.to_job_feedback_metadata().unwrap(); 187 assert_eq!(metadata.id, event.id); 188 assert_eq!(metadata.author, event.author); 189 assert_eq!(metadata.published_at, event.created_at); 190 assert_eq!(metadata.kind, event.kind); 191 assert_eq!(metadata.data.kind, feedback.kind); 192 assert_eq!(metadata.data.request_event.id, "req"); 193 assert_eq!(metadata.data.content.as_deref(), Some("payload")); 194 195 let index = adapter.to_job_feedback_event_index().unwrap(); 196 assert_eq!(index.event.id, event.id); 197 assert_eq!(index.event.author, event.author); 198 assert_eq!(index.event.created_at, event.created_at); 199 assert_eq!(index.event.kind, event.kind); 200 assert_eq!(index.event.content, event.content); 201 assert_eq!(index.event.sig, event.sig); 202 }