1pub mod crypto;
2pub mod dispute;
3pub mod error;
4pub mod message;
5pub mod order;
6pub mod prelude;
7pub mod rating;
8pub mod user;
9#[cfg(test)]
10mod test {
11 use crate::error::CantDoReason;
12 use crate::message::{Action, Message, MessageKind, Payload, Peer};
13 use crate::order::{Kind, SmallOrder, Status};
14 use nostr_sdk::Keys;
15 use uuid::uuid;
16
17 #[test]
18 fn test_status_string() {
19 assert_eq!(Status::Active.to_string(), "active");
20 assert_eq!(Status::CompletedByAdmin.to_string(), "completed-by-admin");
21 assert_eq!(Status::FiatSent.to_string(), "fiat-sent");
22 assert_ne!(Status::Pending.to_string(), "Pending");
23 }
24
25 #[test]
26 fn test_kind_string() {
27 assert_ne!(Kind::Sell.to_string(), "active");
28 assert_eq!(Kind::Sell.to_string(), "sell");
29 assert_eq!(Kind::Buy.to_string(), "buy");
30 assert_ne!(Kind::Buy.to_string(), "active");
31 }
32
33 #[test]
34 fn test_order_message() {
35 let uuid = uuid!("308e1272-d5f4-47e6-bd97-3504baea9c23");
36 let payment_methods = "SEPA,Bank transfer".to_string();
37 let payload = Payload::Order(SmallOrder::new(
38 Some(uuid),
39 Some(Kind::Sell),
40 Some(Status::Pending),
41 100,
42 "eur".to_string(),
43 None,
44 None,
45 100,
46 payment_methods,
47 1,
48 None,
49 None,
50 None,
51 Some(1627371434),
52 None,
53 None,
54 None,
55 ));
56
57 let test_message = Message::Order(MessageKind::new(
58 Some(uuid),
59 Some(1),
60 Some(2),
61 Action::NewOrder,
62 Some(payload),
63 ));
64 let test_message_json = test_message.as_json().unwrap();
65 let sample_message = r#"{"order":{"version":1,"id":"308e1272-d5f4-47e6-bd97-3504baea9c23","request_id":1,"trade_index":2,"action":"new-order","payload":{"order":{"id":"308e1272-d5f4-47e6-bd97-3504baea9c23","kind":"sell","status":"pending","amount":100,"fiat_code":"eur","fiat_amount":100,"payment_method":"SEPA,Bank transfer","premium":1,"created_at":1627371434}}}}"#;
66 let message = Message::from_json(sample_message).unwrap();
67 assert!(message.verify());
68 let message_json = message.as_json().unwrap();
69 assert_eq!(message_json, test_message_json);
70 }
71
72 #[test]
73 fn test_payment_request_payload_message() {
74 let uuid = uuid!("308e1272-d5f4-47e6-bd97-3504baea9c23");
75 let test_message = Message::Order(MessageKind::new(
76 Some(uuid),
77 Some(1),
78 Some(3),
79 Action::PayInvoice,
80 Some(Payload::PaymentRequest(
81 Some(SmallOrder::new(
82 Some(uuid),
83 Some(Kind::Sell),
84 Some(Status::WaitingPayment),
85 100,
86 "eur".to_string(),
87 None,
88 None,
89 100,
90 "Face to face".to_string(),
91 1,
92 None,
93 None,
94 None,
95 Some(1627371434),
96 None,
97 None,
98 None,
99 )),
100 "lnbcrt78510n1pj59wmepp50677g8tffdqa2p8882y0x6newny5vtz0hjuyngdwv226nanv4uzsdqqcqzzsxqyz5vqsp5skn973360gp4yhlpmefwvul5hs58lkkl3u3ujvt57elmp4zugp4q9qyyssqw4nzlr72w28k4waycf27qvgzc9sp79sqlw83j56txltz4va44j7jda23ydcujj9y5k6k0rn5ms84w8wmcmcyk5g3mhpqepf7envhdccp72nz6e".to_string(),
101 None,
102 )),
103 ));
104 let sample_message = r#"{"order":{"version":1,"id":"308e1272-d5f4-47e6-bd97-3504baea9c23","request_id":1,"trade_index":3,"action":"pay-invoice","payload":{"payment_request":[{"id":"308e1272-d5f4-47e6-bd97-3504baea9c23","kind":"sell","status":"waiting-payment","amount":100,"fiat_code":"eur","fiat_amount":100,"payment_method":"Face to face","premium":1,"created_at":1627371434},"lnbcrt78510n1pj59wmepp50677g8tffdqa2p8882y0x6newny5vtz0hjuyngdwv226nanv4uzsdqqcqzzsxqyz5vqsp5skn973360gp4yhlpmefwvul5hs58lkkl3u3ujvt57elmp4zugp4q9qyyssqw4nzlr72w28k4waycf27qvgzc9sp79sqlw83j56txltz4va44j7jda23ydcujj9y5k6k0rn5ms84w8wmcmcyk5g3mhpqepf7envhdccp72nz6e",null]}}}"#;
105 let message = Message::from_json(sample_message).unwrap();
106 assert!(message.verify());
107 let message_json = message.as_json().unwrap();
108 let test_message_json = test_message.as_json().unwrap();
109 assert_eq!(message_json, test_message_json);
110 }
111
112 #[test]
113 fn test_message_payload_signature() {
114 let uuid = uuid!("308e1272-d5f4-47e6-bd97-3504baea9c23");
115 let peer = Peer::new(
116 "npub1testjsf0runcqdht5apkfcalajxkf8txdxqqk5kgm0agc38ke4vsfsgzf8".to_string(),
117 None,
118 );
119 let payload = Payload::Peer(peer);
120 let test_message = Message::Order(MessageKind::new(
121 Some(uuid),
122 Some(1),
123 Some(2),
124 Action::FiatSentOk,
125 Some(payload),
126 ));
127 assert!(test_message.verify());
128 let test_message_json = test_message.as_json().unwrap();
129 let trade_keys =
131 Keys::parse("110e43647eae221ab1da33ddc17fd6ff423f2b2f49d809b9ffa40794a2ab996c")
132 .unwrap();
133 let sig = Message::sign(test_message_json.clone(), &trade_keys);
134
135 assert!(Message::verify_signature(
136 test_message_json,
137 trade_keys.public_key(),
138 sig
139 ));
140 }
141
142 #[test]
143 fn test_cant_do_message_serialization() {
144 let reasons = vec![
146 CantDoReason::InvalidSignature,
147 CantDoReason::InvalidTradeIndex,
148 CantDoReason::InvalidAmount,
149 CantDoReason::InvalidInvoice,
150 CantDoReason::InvalidPaymentRequest,
151 CantDoReason::InvalidPeer,
152 CantDoReason::InvalidRating,
153 CantDoReason::InvalidTextMessage,
154 CantDoReason::InvalidOrderStatus,
155 CantDoReason::InvalidPubkey,
156 CantDoReason::InvalidParameters,
157 CantDoReason::OrderAlreadyCanceled,
158 CantDoReason::CantCreateUser,
159 CantDoReason::IsNotYourOrder,
160 CantDoReason::NotAllowedByStatus,
161 CantDoReason::OutOfRangeFiatAmount,
162 CantDoReason::OutOfRangeSatsAmount,
163 CantDoReason::IsNotYourDispute,
164 CantDoReason::NotFound,
165 ];
166
167 for reason in reasons {
168 let cant_do = Message::CantDo(MessageKind::new(
169 None,
170 None,
171 None,
172 Action::CantDo,
173 Some(Payload::CantDo(Some(reason.clone()))),
174 ));
175 let message = Message::from_json(&cant_do.as_json().unwrap()).unwrap();
176 assert!(message.verify());
177 assert_eq!(message.as_json().unwrap(), cant_do.as_json().unwrap());
178 }
179
180 let cant_do = Message::CantDo(MessageKind::new(
182 None,
183 None,
184 None,
185 Action::CantDo,
186 Some(Payload::CantDo(None)),
187 ));
188 let message = Message::from_json(&cant_do.as_json().unwrap()).unwrap();
189 assert!(message.verify());
190 assert_eq!(message.as_json().unwrap(), cant_do.as_json().unwrap());
191 }
192}