cloud_sdk_testkit/
response.rs1use cloud_sdk::transport::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(Clone, Copy, Debug, Eq, PartialEq)]
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}
44
45impl<'a> ResponseFixture<'a> {
46 #[must_use]
48 pub const fn success(body: FixtureBody<'a>) -> Self {
49 Self::new(FixtureKind::Success, StatusCode::OK, body)
50 }
51
52 #[must_use]
54 pub const fn paginated(body: FixtureBody<'a>, pagination: PaginationFixture) -> Self {
55 let mut fixture = Self::new(FixtureKind::Pagination, StatusCode::OK, body);
56 fixture.pagination = Some(pagination);
57 fixture
58 }
59
60 #[must_use]
62 pub const fn action(body: FixtureBody<'a>, action: ActionFixture) -> Self {
63 let mut fixture = Self::new(FixtureKind::Action, StatusCode::OK, body);
64 fixture.action = Some(action);
65 fixture
66 }
67
68 #[must_use]
70 pub const fn rate_limited(body: FixtureBody<'a>, rate_limit: RateLimitFixture) -> Self {
71 let mut fixture = Self::new(FixtureKind::RateLimit, StatusCode::TOO_MANY_REQUESTS, body);
72 fixture.rate_limit = Some(rate_limit);
73 fixture
74 }
75
76 #[must_use]
78 pub const fn with_rate_limit(mut self, rate_limit: RateLimitFixture) -> Self {
79 self.rate_limit = Some(rate_limit);
80 self
81 }
82
83 #[must_use]
85 pub const fn with_content_type(mut self, content_type: &'a str) -> Self {
86 self.content_type = Some(content_type);
87 self
88 }
89
90 pub const fn error(
92 status: StatusCode,
93 body: FixtureBody<'a>,
94 ) -> Result<Self, ResponseFixtureError> {
95 if !status.is_error() {
96 return Err(ResponseFixtureError::NonErrorStatus);
97 }
98 Ok(Self::new(FixtureKind::Error, status, body))
99 }
100
101 const fn new(kind: FixtureKind, status: StatusCode, body: FixtureBody<'a>) -> Self {
102 Self {
103 kind,
104 status,
105 body,
106 pagination: None,
107 action: None,
108 rate_limit: None,
109 content_type: None,
110 }
111 }
112
113 #[must_use]
115 pub const fn kind(self) -> FixtureKind {
116 self.kind
117 }
118
119 #[must_use]
121 pub const fn status(self) -> StatusCode {
122 self.status
123 }
124
125 #[must_use]
127 pub const fn body(self) -> FixtureBody<'a> {
128 self.body
129 }
130
131 #[must_use]
133 pub const fn pagination(self) -> Option<PaginationFixture> {
134 self.pagination
135 }
136
137 #[must_use]
139 pub const fn action_metadata(self) -> Option<ActionFixture> {
140 self.action
141 }
142
143 #[must_use]
145 pub const fn rate_limit(self) -> Option<RateLimitFixture> {
146 self.rate_limit
147 }
148
149 #[must_use]
151 pub const fn content_type(self) -> Option<&'a str> {
152 self.content_type
153 }
154}