From db22135c8cd1f33d65ed3687f3995e4c65bfe2a6 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Sun, 11 May 2025 13:53:40 -0400 Subject: [PATCH] Delete `/templates` endpoint --- wp_api/src/api_error.rs | 6 ++++ .../request/endpoint/templates_endpoint.rs | 28 +++++++++++++++++++ wp_api/src/templates.rs | 6 ++++ wp_api_integration_tests/src/lib.rs | 1 + .../tests/test_templates_err.rs | 23 +++++++++++++++ .../tests/test_templates_mut.rs | 20 +++++++++++++ 6 files changed, 84 insertions(+) create mode 100644 wp_api_integration_tests/tests/test_templates_err.rs create mode 100644 wp_api_integration_tests/tests/test_templates_mut.rs diff --git a/wp_api/src/api_error.rs b/wp_api/src/api_error.rs index 7eefa188c..005237c7f 100644 --- a/wp_api/src/api_error.rs +++ b/wp_api/src/api_error.rs @@ -256,6 +256,8 @@ pub enum WpErrorCode { InvalidField, #[serde(rename = "rest_invalid_param")] InvalidParam, + #[serde(rename = "rest_invalid_template")] + InvalidTemplate, #[serde(rename = "rest_no_search_term_defined")] NoSearchTermDefined, #[serde(rename = "rest_orderby_include_missing_include")] @@ -270,6 +272,10 @@ pub enum WpErrorCode { PostInvalidPageNumber, #[serde(rename = "rest_taxonomy_invalid")] TaxonomyInvalid, + #[serde(rename = "rest_template_already_trashed")] + TemplateAlreadyTrashed, + #[serde(rename = "rest_template_not_found")] + TemplateNotFound, #[serde(rename = "rest_term_invalid")] TermInvalid, #[serde(rename = "rest_theme_not_found")] diff --git a/wp_api/src/request/endpoint/templates_endpoint.rs b/wp_api/src/request/endpoint/templates_endpoint.rs index a62b9ea1c..635c05fff 100644 --- a/wp_api/src/request/endpoint/templates_endpoint.rs +++ b/wp_api/src/request/endpoint/templates_endpoint.rs @@ -12,9 +12,21 @@ enum TemplatesRequest { List, #[contextual_get(url = "/templates/", output = crate::templates::SparseTemplate, filter_by = crate::templates::SparseTemplateField)] Retrieve, + #[delete(url = "/templates/", output = crate::templates::TemplateDeleteResponse)] + Delete, + #[delete(url = "/templates/", output = crate::templates::TemplateWithEditContext)] + Trash, } impl DerivedRequest for TemplatesRequest { + fn additional_query_pairs(&self) -> Vec<(&str, String)> { + match self { + TemplatesRequest::Delete => vec![("force", true.to_string())], + TemplatesRequest::Trash => vec![("force", false.to_string())], + _ => vec![], + } + } + fn namespace() -> impl AsNamespace { WpNamespace::WpV2 } @@ -161,6 +173,22 @@ mod tests { ); } + #[rstest] + fn delete_template(endpoint: TemplatesRequestEndpoint) { + validate_wp_v2_endpoint( + endpoint.delete(&TemplateId("foo".to_string())), + "/templates/foo?force=true", + ); + } + + #[rstest] + fn trash_template(endpoint: TemplatesRequestEndpoint) { + validate_wp_v2_endpoint( + endpoint.trash(&TemplateId("foo".to_string())), + "/templates/foo?force=false", + ); + } + const EXPECTED_QUERY_PAIRS_FOR_TEMPLATE_LIST_PARAMS_WITH_ALL_FIELDS: &str = "wp_id=2&area=header&post_type=page"; fn template_list_params_with_all_fields() -> TemplateListParams { diff --git a/wp_api/src/templates.rs b/wp_api/src/templates.rs index 7c20f2863..65846e483 100644 --- a/wp_api/src/templates.rs +++ b/wp_api/src/templates.rs @@ -196,3 +196,9 @@ pub struct SparseTemplateTitle { pub raw: Option, pub rendered: Option, } + +#[derive(Debug, Serialize, Deserialize, uniffi::Record)] +pub struct TemplateDeleteResponse { + pub deleted: bool, + pub previous: TemplateWithEditContext, +} diff --git a/wp_api_integration_tests/src/lib.rs b/wp_api_integration_tests/src/lib.rs index d68f67c30..0ee1b53c6 100644 --- a/wp_api_integration_tests/src/lib.rs +++ b/wp_api_integration_tests/src/lib.rs @@ -72,6 +72,7 @@ pub const POST_TEMPLATE_SINGLE_WITH_SIDEBAR: &str = "single-with-sidebar"; pub const THEME_TWENTY_TWENTY_FIVE: &str = "twentytwentyfive"; pub const THEME_TWENTY_TWENTY_FOUR: &str = "twentytwentyfour"; pub const THEME_TWENTY_TWENTY_THREE: &str = "twentytwentythree"; +pub const TEMPLATE_CUSTOM: &str = "CustomTemplateToBeUsedInIntegrationTests"; pub fn api_client() -> WpApiClient { WpApiClient::new( diff --git a/wp_api_integration_tests/tests/test_templates_err.rs b/wp_api_integration_tests/tests/test_templates_err.rs new file mode 100644 index 000000000..de61ac8bf --- /dev/null +++ b/wp_api_integration_tests/tests/test_templates_err.rs @@ -0,0 +1,23 @@ +use serial_test::parallel; +use wp_api::{WpErrorCode, templates::TemplateId}; +use wp_api_integration_tests::{AssertWpError, TEMPLATE_TWENTY_TWENTY_FOUR_SINGLE, api_client}; + +#[tokio::test] +#[parallel] +async fn delete_template_err_invalid_template() { + api_client() + .templates() + .delete(&TemplateId(TEMPLATE_TWENTY_TWENTY_FOUR_SINGLE.to_string())) + .await + .assert_wp_error(WpErrorCode::InvalidTemplate) +} + +#[tokio::test] +#[parallel] +async fn delete_template_err_template_not_found() { + api_client() + .templates() + .delete(&TemplateId("foo".to_string())) + .await + .assert_wp_error(WpErrorCode::TemplateNotFound) +} diff --git a/wp_api_integration_tests/tests/test_templates_mut.rs b/wp_api_integration_tests/tests/test_templates_mut.rs new file mode 100644 index 000000000..161d41289 --- /dev/null +++ b/wp_api_integration_tests/tests/test_templates_mut.rs @@ -0,0 +1,20 @@ +use serial_test::serial; +use wp_api::templates::TemplateId; +use wp_api_integration_tests::{TEMPLATE_CUSTOM, api_client, backend::RestoreServer}; + +#[tokio::test] +#[serial] +async fn delete_template() { + let template_delete_response = api_client() + .templates() + .delete(&TemplateId(TEMPLATE_CUSTOM.to_string())) + .await; + assert!( + template_delete_response.is_ok(), + "{:#?}", + template_delete_response + ); + assert!(template_delete_response.unwrap().data.deleted); + + RestoreServer::db().await; +}