tosspayments/api/
list_transactions.rs

1use 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}