lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

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 }