tosspayments/api/
list_transactions.rs1use reqwest::Method;
2use serde::{Deserialize, Serialize};
3use typed_builder::TypedBuilder;
4
5use crate::data::Transaction;
6use crate::endpoint::Endpoint;
7
8#[derive(Clone, Debug, Serialize, Deserialize, TypedBuilder)]
9#[serde(rename_all = "camelCase")]
10pub struct ListTransactions {
11 pub start_date: String,
12 pub end_date: String,
13 #[builder(default)]
14 pub starting_after: Option<String>,
15 #[builder(default)]
16 pub limit: Option<usize>,
17}
18
19impl Endpoint for ListTransactions {
20 type Query = Self;
21 type Body = ();
22 type Response = Vec<Transaction>;
23
24 fn relative_path(&self) -> String {
25 "/v1/transactions".to_string()
26 }
27
28 fn method(&self) -> Method {
29 Method::GET
30 }
31
32 fn query(&self) -> Option<&Self::Query> {
33 Some(&self)
34 }
35}
36
37
38#[cfg(test)]
39mod tests {
40 use httpmock::prelude::*;
41 use serde_json::json;
42
43 use crate::Client;
44
45 use super::*;
46
47 #[tokio::test]
48 async fn list_transactions() {
49 let dummy_transactions = json!([
50 {
51 "mId": "tvivarepublica",
52 "transactionKey": "42B9BB5ECF555F940E064C5D18CBE3BE",
53 "paymentKey": "tviva20231208004903pIlD7",
54 "orderId": "MC4yNTE3MzkyNzQyNDMw",
55 "method": "가상계좌",
56 "customerKey": null,
57 "useEscrow": false,
58 "receiptUrl": "https://pgweb.tosspayments.com:9091/MpFlowCtrl?eventDiv1=search&eventDiv2=getCasReceiptList&trxid=tviva20231208004903pIlD7&SYSTEM=NEW",
59 "status": "WAITING_FOR_DEPOSIT",
60 "transactionAt": "2023-12-08T00:49:57+09:00",
61 "currency": "KRW",
62 "amount": 0
63 },
64 {
65 "mId": "tvivarepublica",
66 "transactionKey": "5CA936D26AA197D55B4C1BE3DA247057",
67 "paymentKey": "xMljweGQBN5OWRapdA8dPgLNgN7O2b8o1zEqZKLPbmD70vk4",
68 "orderId": "MC42ODEwOTg1MjU2MTI4",
69 "method": "카드",
70 "customerKey": null,
71 "useEscrow": false,
72 "receiptUrl": "https://dashboard.tosspayments.com/receipt/redirection?transactionId=tviva20231208005013dMup7&ref=PX",
73 "status": "DONE",
74 "transactionAt": "2023-12-08T00:50:13+09:00",
75 "currency": "KRW",
76 "amount": 1000
77 },
78 {
79 "mId": "tvivarepublica2",
80 "transactionKey": "5D73B312295618836EC12DD3F58FF41D",
81 "paymentKey": "xMljweGQBN5OWRapdA8dq7v2OaB42b3o1zEqZKLPbmD70vk4",
82 "orderId": "018c452f-cc02-e55f-cef0-a47f1885f5f4",
83 "method": "카드",
84 "customerKey": "018b0955-3fd3-db31-8b94-0314dd3906d4",
85 "useEscrow": false,
86 "receiptUrl": "https://dashboard.tosspayments.com/receipt/redirection?transactionId=tviva20231208015009eZvH9&ref=PX",
87 "status": "DONE",
88 "transactionAt": "2023-12-08T01:50:09+09:00",
89 "currency": "KRW",
90 "amount": 4900
91 }
92 ]);
93 let server = MockServer::start();
94 let mock = server.mock(|when, then| {
95 when
96 .method(GET)
97 .path("/v1/transactions")
98 .query_param("startDate", "2023-12-08")
99 .query_param("endDate", "2023-12-09")
100 .query_param("limit", "3")
101 .header("authorization", "Basic bXlfc2VjcmV0X2tleTo");
102 then
103 .status(200)
104 .header("content-type", "application/json")
105 .json_body(dummy_transactions);
106 });
107 let client = Client::from_url(server.base_url(), "my_secret_key");
108 let settlements = client
109 .execute(&ListTransactions::builder()
110 .start_date("2023-12-08".to_string())
111 .end_date("2023-12-09".to_string())
112 .limit(Some(3))
113 .build()
114 )
115 .await
116 .unwrap();
117 mock.assert();
118 assert_eq!(settlements.len(), 3);
119 }
120}