instant_epp/extensions/rgp/
request.rs

1//! Types for EPP RGP restore request
2
3use instant_xml::{FromXml, ToXml};
4
5use crate::{
6    domain::{info::DomainInfo, update::DomainUpdate},
7    request::{Extension, Transaction},
8};
9
10use super::{RgpStatus, 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 = RgpRequestResponse;
18}
19
20// Request
21
22#[derive(Debug, FromXml, ToXml)]
23#[xml(rename = "update", ns(XMLNS))]
24pub struct Update<T> {
25    pub data: T,
26}
27
28/// Type corresponding to the `<restore>` tag for an rgp restore request
29#[derive(Debug, ToXml)]
30#[xml(rename = "restore", ns(XMLNS))]
31pub struct RgpRestoreRequest<'a> {
32    /// The value of the op attribute in the `<restore>` tag
33    #[xml(attribute)]
34    pub op: &'a str,
35}
36
37impl Default for RgpRestoreRequest<'static> {
38    fn default() -> Self {
39        Self { op: "request" }
40    }
41}
42
43// Response
44
45#[derive(Debug, FromXml)]
46#[xml(rename = "upData", ns(XMLNS))]
47/// Type that represents the `<resData>` tag for domain transfer response
48pub struct RgpRequestUpdateResponse {
49    /// Data under the `<rgpStatus>` tag
50    pub rgp_status: Vec<RgpStatus>,
51}
52
53#[derive(Debug, FromXml)]
54#[xml(rename = "infData", ns(XMLNS))]
55/// Type that represents the `<resData>` tag for domain transfer response
56pub struct RgpRequestInfoResponse {
57    /// Data under the `<rgpStatus>` tag
58    pub rgp_status: Vec<RgpStatus>,
59}
60
61/// Type that represents the `<resData>` tag for domain transfer response
62#[derive(Debug, FromXml)]
63#[xml(forward)]
64pub enum RgpRequestResponse {
65    Update(RgpRequestUpdateResponse),
66    Info(RgpRequestInfoResponse),
67}
68
69#[cfg(test)]
70mod tests {
71    use super::{RgpRestoreRequest, Update};
72    use crate::domain::info::DomainInfo;
73    use crate::domain::update::{DomainChangeInfo, DomainUpdate};
74    use crate::extensions::rgp::request::RgpRequestResponse;
75    use crate::extensions::rgp::RgpStatus;
76    use crate::response::ResultCode;
77    use crate::tests::{assert_serialized, response_from_file_with_ext, SUCCESS_MSG, SVTRID};
78
79    #[test]
80    fn request_command() {
81        let domain_restore_request = Update {
82            data: RgpRestoreRequest::default(),
83        };
84
85        let mut object = DomainUpdate::new("eppdev.com");
86
87        let change_info = DomainChangeInfo {
88            registrant: None,
89            auth_info: None,
90        };
91
92        object.info(change_info);
93
94        assert_serialized(
95            "request/extensions/rgp_restore_request.xml",
96            (&object, &domain_restore_request),
97        );
98    }
99
100    #[test]
101    fn request_response() {
102        let object = response_from_file_with_ext::<DomainUpdate, Update<RgpRestoreRequest>>(
103            "response/extensions/rgp_restore.xml",
104        );
105        let ext = object.extension.unwrap();
106
107        assert_eq!(object.result.code, ResultCode::CommandCompletedSuccessfully);
108        assert_eq!(object.result.message, SUCCESS_MSG);
109
110        let data = match ext.data {
111            RgpRequestResponse::Update(data) => data,
112            _ => panic!("Unexpected response type"),
113        };
114
115        assert_eq!(data.rgp_status[0], RgpStatus::PendingRestore);
116        assert_eq!(object.tr_ids.server_tr_id, SVTRID);
117    }
118
119    #[test]
120    fn domain_info_request_response() {
121        let object = response_from_file_with_ext::<DomainInfo, Update<RgpRestoreRequest>>(
122            "response/extensions/domain_info_rgp.xml",
123        );
124        let ext = object.extension.unwrap();
125
126        let data = match ext.data {
127            RgpRequestResponse::Info(data) => data,
128            _ => panic!("Unexpected response type"),
129        };
130
131        assert_eq!(data.rgp_status[0], RgpStatus::AddPeriod);
132        assert_eq!(data.rgp_status[1], RgpStatus::RenewPeriod);
133    }
134}