Skip to content

Commit 1b0d28d

Browse files
Pi-Clalpil
authored andcommitted
Add functions to revert a release and an entire package
See gleam-lang/gleam#3019
1 parent 507abc2 commit 1b0d28d

File tree

2 files changed

+124
-0
lines changed

2 files changed

+124
-0
lines changed

src/lib.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,64 @@ pub fn publish_package_response(response: http::Response<Vec<u8>>) -> Result<(),
459459
}
460460
}
461461

462+
pub fn revert_release_request(
463+
package_name: &str,
464+
version: &str,
465+
api_key: &str,
466+
config: &Config,
467+
) -> Result<http::Request<Vec<u8>>, ApiError> {
468+
validate_package_and_version(package_name, version)?;
469+
470+
Ok(config
471+
.api_request(
472+
Method::DELETE,
473+
&format!("packages/{}/releases/{}", package_name, version),
474+
Some(api_key),
475+
)
476+
.body(vec![])
477+
.expect("publish_package_request request"))
478+
}
479+
480+
pub fn revert_release_response(response: http::Response<Vec<u8>>) -> Result<(), ApiError> {
481+
let (parts, body) = response.into_parts();
482+
match parts.status {
483+
StatusCode::NO_CONTENT => Ok(()),
484+
StatusCode::NOT_FOUND => Err(ApiError::NotFound),
485+
StatusCode::TOO_MANY_REQUESTS => Err(ApiError::RateLimited),
486+
StatusCode::UNAUTHORIZED => Err(ApiError::InvalidApiKey),
487+
StatusCode::FORBIDDEN => Err(ApiError::Forbidden),
488+
status => Err(ApiError::unexpected_response(status, body)),
489+
}
490+
}
491+
492+
pub fn revert_package_request(
493+
package_name: &str,
494+
owner: &str,
495+
api_key: &str,
496+
config: &Config,
497+
) -> Result<http::Request<Vec<u8>>, ApiError> {
498+
Ok(config
499+
.api_request(
500+
Method::DELETE,
501+
&format!("packages/{}/owners/{}", package_name, owner),
502+
Some(api_key),
503+
)
504+
.body(vec![])
505+
.expect("publish_package_request request"))
506+
}
507+
508+
pub fn revert_package_response(response: http::Response<Vec<u8>>) -> Result<(), ApiError> {
509+
let (parts, body) = response.into_parts();
510+
match parts.status {
511+
StatusCode::NO_CONTENT => Ok(()),
512+
StatusCode::NOT_FOUND => Err(ApiError::NotFound),
513+
StatusCode::TOO_MANY_REQUESTS => Err(ApiError::RateLimited),
514+
StatusCode::UNAUTHORIZED => Err(ApiError::InvalidApiKey),
515+
StatusCode::FORBIDDEN => Err(ApiError::Forbidden),
516+
status => Err(ApiError::unexpected_response(status, body)),
517+
}
518+
}
519+
462520
#[derive(Error, Debug)]
463521
pub enum ApiError {
464522
#[error(transparent)]

src/tests.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,72 @@ async fn remove_docs_success() {
195195
mock.assert();
196196
}
197197

198+
#[tokio::test]
199+
async fn revert_release_success() {
200+
let key = "my-api-key-here";
201+
let package = "gleam_experimental_stdlib";
202+
let version = "0.8.0";
203+
204+
let mut server = mockito::Server::new_async().await;
205+
let mock = server
206+
.mock(
207+
"DELETE",
208+
format!("/packages/{}/releases/{}", package, version).as_str(),
209+
)
210+
.expect(1)
211+
.match_header("authorization", key)
212+
.match_header("accept", "application/json")
213+
.with_status(204)
214+
.create_async()
215+
.await;
216+
217+
let mut config = Config::new();
218+
config.api_base = http::Uri::try_from(server.url()).unwrap();
219+
220+
let result = crate::revert_release_response(
221+
http_send(crate::revert_release_request(package, version, key, &config).unwrap())
222+
.await
223+
.unwrap(),
224+
)
225+
.unwrap();
226+
227+
assert_eq!(result, ());
228+
mock.assert();
229+
}
230+
231+
#[tokio::test]
232+
async fn revert_package_success() {
233+
let key = "my-api-key-here";
234+
let package = "gleam_experimental_stdlib";
235+
let owner = "lpil";
236+
237+
let mut server = mockito::Server::new_async().await;
238+
let mock = server
239+
.mock(
240+
"DELETE",
241+
format!("/packages/{}/owners/{}", package, owner).as_str(),
242+
)
243+
.expect(1)
244+
.match_header("authorization", key)
245+
.match_header("accept", "application/json")
246+
.with_status(204)
247+
.create_async()
248+
.await;
249+
250+
let mut config = Config::new();
251+
config.api_base = http::Uri::try_from(server.url()).unwrap();
252+
253+
let result = crate::revert_package_response(
254+
http_send(crate::revert_package_request(package, owner, key, &config).unwrap())
255+
.await
256+
.unwrap(),
257+
)
258+
.unwrap();
259+
260+
assert_eq!(result, ());
261+
mock.assert();
262+
}
263+
198264
#[tokio::test]
199265
async fn remove_key_success() {
200266
let name = "some-key-name";

0 commit comments

Comments
 (0)