cloud_sdk_testkit/
response.rs1use cloud_sdk::transport::{ResponseHeaders, StatusCode};
4
5use crate::{ActionFixture, FixtureBody, PaginationFixture, RateLimitFixture};
6
7#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
9pub enum FixtureKind {
10 Success,
12 Pagination,
14 Action,
16 RateLimit,
18 Error,
20}
21
22#[derive(Clone, Copy, Debug, Eq, PartialEq)]
24pub enum ResponseFixtureError {
25 NonErrorStatus,
27}
28
29impl_static_error!(ResponseFixtureError,
30 Self::NonErrorStatus => "error fixture requires an HTTP error status",
31);
32
33#[derive(Debug)]
35pub struct ResponseFixture<'a> {
36 kind: FixtureKind,
37 status: StatusCode,
38 body: FixtureBody<'a>,
39 pagination: Option<PaginationFixture>,
40 action: Option<ActionFixture>,
41 rate_limit: Option<RateLimitFixture>,
42 content_type: Option<&'a str>,
43 headers: Option<ResponseHeaders<'a>>,
44}
45
46impl<'a> ResponseFixture<'a> {
47 #[must_use]
49 pub const fn success(body: FixtureBody<'a>) -> Self {
50 Self::new(FixtureKind::Success, StatusCode::OK, body)
51 }
52
53 #[must_use]
55 pub const fn paginated(body: FixtureBody<'a>, pagination: PaginationFixture) -> Self {
56 let mut fixture = Self::new(FixtureKind::Pagination, StatusCode::OK, body);
57 fixture.pagination = Some(pagination);
58 fixture
59 }
60
61 #[must_use]
63 pub const fn action(body: FixtureBody<'a>, action: ActionFixture) -> Self {
64 let mut fixture = Self::new(FixtureKind::Action, StatusCode::OK, body);
65 fixture.action = Some(action);
66 fixture
67 }
68
69 #[must_use]
71 pub const fn rate_limited(body: FixtureBody<'a>, rate_limit: RateLimitFixture) -> Self {
72 let mut fixture = Self::new(FixtureKind::RateLimit, StatusCode::TOO_MANY_REQUESTS, body);
73 fixture.rate_limit = Some(rate_limit);
74 fixture
75 }
76
77 #[must_use]
79 pub const fn with_rate_limit(mut self, rate_limit: RateLimitFixture) -> Self {
80 self.rate_limit = Some(rate_limit);
81 self
82 }
83
84 #[must_use]
86 pub const fn with_content_type(mut self, content_type: &'a str) -> Self {
87 self.content_type = Some(content_type);
88 self
89 }
90
91 #[must_use]
93 pub fn with_headers(mut self, headers: ResponseHeaders<'a>) -> Self {
94 self.headers = Some(headers);
95 self
96 }
97
98 pub const fn error(
100 status: StatusCode,
101 body: FixtureBody<'a>,
102 ) -> Result<Self, ResponseFixtureError> {
103 if !status.is_error() {
104 return Err(ResponseFixtureError::NonErrorStatus);
105 }
106 Ok(Self::new(FixtureKind::Error, status, body))
107 }
108
109 const fn new(kind: FixtureKind, status: StatusCode, body: FixtureBody<'a>) -> Self {
110 Self {
111 kind,
112 status,
113 body,
114 pagination: None,
115 action: None,
116 rate_limit: None,
117 content_type: None,
118 headers: None,
119 }
120 }
121
122 #[must_use]
124 pub const fn kind(&self) -> FixtureKind {
125 self.kind
126 }
127
128 #[must_use]
130 pub const fn status(&self) -> StatusCode {
131 self.status
132 }
133
134 #[must_use]
136 pub const fn body(&self) -> FixtureBody<'a> {
137 self.body
138 }
139
140 #[must_use]
142 pub const fn pagination(&self) -> Option<PaginationFixture> {
143 self.pagination
144 }
145
146 #[must_use]
148 pub const fn action_metadata(&self) -> Option<ActionFixture> {
149 self.action
150 }
151
152 #[must_use]
154 pub const fn rate_limit(&self) -> Option<RateLimitFixture> {
155 self.rate_limit
156 }
157
158 #[must_use]
160 pub const fn content_type(&self) -> Option<&'a str> {
161 self.content_type
162 }
163
164 #[must_use]
166 pub const fn headers(&self) -> Option<&ResponseHeaders<'a>> {
167 self.headers.as_ref()
168 }
169}