instant_epp/extensions/rgp/
request.rs1use 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#[derive(Debug, FromXml, ToXml)]
23#[xml(rename = "update", ns(XMLNS))]
24pub struct Update<T> {
25 pub data: T,
26}
27
28#[derive(Debug, ToXml)]
30#[xml(rename = "restore", ns(XMLNS))]
31pub struct RgpRestoreRequest<'a> {
32 #[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#[derive(Debug, FromXml)]
46#[xml(rename = "upData", ns(XMLNS))]
47pub struct RgpRequestUpdateResponse {
49 pub rgp_status: Vec<RgpStatus>,
51}
52
53#[derive(Debug, FromXml)]
54#[xml(rename = "infData", ns(XMLNS))]
55pub struct RgpRequestInfoResponse {
57 pub rgp_status: Vec<RgpStatus>,
59}
60
61#[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}