epp_client/extensions/rgp/
request.rs

1//! Types for EPP RGP restore request
2
3use crate::{
4    domain::{info::DomainInfo, update::DomainUpdate},
5    request::{Extension, Transaction},
6};
7
8use serde::{Deserialize, Serialize};
9
10use super::{Update, XMLNS};
11
12impl<'a> Transaction<Update<RgpRestoreRequest<'a>>> for DomainUpdate<'a> {}
13
14impl<'a> Transaction<Update<RgpRestoreRequest<'a>>> for DomainInfo<'a> {}
15
16impl<'a> Extension for Update<RgpRestoreRequest<'a>> {
17    type Response = Update<RgpRequestResponse>;
18}
19
20// Request
21
22/// Type corresponding to the &lt;restore&gt; tag for an rgp restore request
23#[derive(Serialize, Debug)]
24pub struct RgpRestoreRequestData<'a> {
25    /// The value of the op attribute in the &lt;restore&gt; tag
26    pub op: &'a str,
27}
28
29#[derive(Serialize, Debug)]
30/// Type for EPP XML &lt;check&gt; command for domains
31pub struct RgpRestoreRequest<'a> {
32    /// XML namespace for the RGP restore extension
33    #[serde(rename = "xmlns:rgp")]
34    xmlns: &'a str,
35    /// The object holding the list of domains to be checked
36    #[serde(rename = "rgp:restore")]
37    restore: RgpRestoreRequestData<'a>,
38}
39
40impl Default for RgpRestoreRequest<'static> {
41    fn default() -> Self {
42        Self {
43            xmlns: XMLNS,
44            restore: RgpRestoreRequestData { op: "request" },
45        }
46    }
47}
48
49// Response
50
51/// Type that represents the &lt;rgpStatus&gt; tag for domain rgp restore request response
52#[derive(Deserialize, Debug)]
53pub struct RgpStatus {
54    /// The domain RGP status
55    #[serde(rename = "s")]
56    pub status: String,
57}
58
59#[derive(Deserialize, Debug)]
60#[serde(rename = "upData")]
61/// Type that represents the &lt;resData&gt; tag for domain transfer response
62pub struct RgpRequestResponse {
63    /// Data under the &lt;rgpStatus&gt; tag
64    #[serde(rename = "rgpStatus")]
65    pub rgp_status: Vec<RgpStatus>,
66}
67
68#[cfg(test)]
69mod tests {
70    use super::{RgpRestoreRequest, Update};
71    use crate::domain::info::DomainInfo;
72    use crate::domain::update::{DomainChangeInfo, DomainUpdate};
73    use crate::response::ResultCode;
74    use crate::tests::{assert_serialized, response_from_file_with_ext, SUCCESS_MSG, SVTRID};
75
76    #[test]
77    fn request_command() {
78        let domain_restore_request = Update {
79            data: RgpRestoreRequest::default(),
80        };
81
82        let mut object = DomainUpdate::new("eppdev.com");
83
84        let change_info = DomainChangeInfo {
85            registrant: None,
86            auth_info: None,
87        };
88
89        object.info(change_info);
90
91        assert_serialized(
92            "request/extensions/rgp_restore_request.xml",
93            (&object, &domain_restore_request),
94        );
95    }
96
97    #[test]
98    fn request_response() {
99        let object = response_from_file_with_ext::<DomainUpdate, Update<RgpRestoreRequest>>(
100            "response/extensions/rgp_restore.xml",
101        );
102        let ext = object.extension.unwrap();
103
104        assert_eq!(object.result.code, ResultCode::CommandCompletedSuccessfully);
105        assert_eq!(object.result.message, SUCCESS_MSG.into());
106        assert_eq!(ext.data.rgp_status[0].status, "pendingRestore".to_string());
107        assert_eq!(object.tr_ids.server_tr_id, SVTRID.into());
108    }
109
110    #[test]
111    fn domain_info_request_response() {
112        let object = response_from_file_with_ext::<DomainInfo, Update<RgpRestoreRequest>>(
113            "response/extensions/domain_info_rgp.xml",
114        );
115        let ext = object.extension.unwrap();
116
117        assert_eq!(ext.data.rgp_status[0].status, "addPeriod");
118        assert_eq!(ext.data.rgp_status[1].status, "renewPeriod");
119    }
120}