diff --git a/sdk/rust/src/api/feedback.rs b/sdk/rust/src/api/feedback.rs index 1c4b68bb..313216b8 100644 --- a/sdk/rust/src/api/feedback.rs +++ b/sdk/rust/src/api/feedback.rs @@ -47,11 +47,7 @@ impl FeedbackApi { } /// Vote on a feedback item, signed as `vote.voter`. - pub async fn vote( - &self, - feedback_id: &str, - vote: FeedbackVoteRequest, - ) -> Result { + pub async fn vote(&self, feedback_id: &str, vote: FeedbackVoteRequest) -> Result { let voter = vote.voter.clone(); self.http .post_directory_auth_as( diff --git a/sdk/rust/src/api/mod.rs b/sdk/rust/src/api/mod.rs index a40046d1..c5fd88e2 100644 --- a/sdk/rust/src/api/mod.rs +++ b/sdk/rust/src/api/mod.rs @@ -12,6 +12,7 @@ pub mod docs; pub mod escrow; pub mod events; pub mod explorer; +pub mod feedback; pub mod groups; pub mod inbox; pub mod jobs; diff --git a/sdk/rust/src/client.rs b/sdk/rust/src/client.rs index 1730b095..11eee37e 100644 --- a/sdk/rust/src/client.rs +++ b/sdk/rust/src/client.rs @@ -20,6 +20,7 @@ use crate::api::docs::DocsApi; use crate::api::escrow::EscrowApi; use crate::api::events::EventsApi; use crate::api::explorer::ExplorerApi; +use crate::api::feedback::FeedbackApi; use crate::api::groups::GroupsApi; use crate::api::inbox::InboxApi; use crate::api::jobs::JobsApi; @@ -94,6 +95,7 @@ pub struct TinyPlaceClient { pub lottery: LotteryApi, pub artifacts: ArtifactsApi, pub docs: DocsApi, + pub feedback: FeedbackApi, } impl TinyPlaceClient { @@ -139,6 +141,7 @@ impl TinyPlaceClient { lottery: LotteryApi::new(http.clone()), artifacts: ArtifactsApi::new(http.clone()), docs: DocsApi::new(http.clone()), + feedback: FeedbackApi::new(http.clone()), http, } } diff --git a/sdk/rust/tests/api_misc.rs b/sdk/rust/tests/api_misc.rs index 63bf2160..072b522a 100644 --- a/sdk/rust/tests/api_misc.rs +++ b/sdk/rust/tests/api_misc.rs @@ -16,11 +16,12 @@ use tinyplace::api::moderation::{ }; use tinyplace::types::{ ArtifactCreateRequest, ArtifactQueryParams, ArtifactRecipientUpdate, AttestationCreate, - FeeConfig, FeeResolveParams, GameActionRequest, GameEmergencyWithdrawalRequest, - GameJoinRequest, GameLeaveRequest, GameOperatorRequest, GameRoom, GameRoomQueryParams, - GameSettleRequest, LeaderboardQueryParams, LotteryBuyRequest, LotteryDrawRequest, - LotteryRoundQueryParams, ModerationAction, ModerationReportCreate, ReputationReviewCreate, - ReputationVouchCreate, TrustGraphQueryParams, + FeeConfig, FeeResolveParams, FeedbackCreate, FeedbackListParams, FeedbackStatusUpdate, + FeedbackVoteRequest, GameActionRequest, GameEmergencyWithdrawalRequest, GameJoinRequest, + GameLeaveRequest, GameOperatorRequest, GameRoom, GameRoomQueryParams, GameSettleRequest, + LeaderboardQueryParams, LotteryBuyRequest, LotteryDrawRequest, LotteryRoundQueryParams, + ModerationAction, ModerationReportCreate, ReputationReviewCreate, ReputationVouchCreate, + TrustGraphQueryParams, }; // --- RoomsApi --- @@ -1022,3 +1023,88 @@ async fn artifacts_update_recipients() { assert_eq!(req.method.as_str(), "PUT"); assert!(req.url.path().contains("/artifacts/art1/recipients")); } + +// --- FeedbackApi --- + +#[tokio::test] +async fn feedback_list() { + let server = any_ok(json!({"feedback": []})).await; + let client = client_for(&server); + let _ = client + .feedback + .list(Some(&FeedbackListParams::default())) + .await; + let req = only_request(&server).await; + assert_eq!(req.method.as_str(), "GET"); + assert!(req.url.path().contains("/feedback")); +} + +#[tokio::test] +async fn feedback_list_admin() { + let server = any_ok(json!({"feedback": []})).await; + let client = client_for(&server); + let _ = client.feedback.list_admin(None).await; + let req = only_request(&server).await; + assert_eq!(req.method.as_str(), "GET"); + assert!(req.url.path().contains("/feedback")); +} + +#[tokio::test] +async fn feedback_get() { + let server = any_empty_ok().await; + let client = client_for(&server); + let _ = client.feedback.get("fb1").await; + let req = only_request(&server).await; + assert_eq!(req.method.as_str(), "GET"); + assert!(req.url.path().contains("/feedback/fb1")); +} + +#[tokio::test] +async fn feedback_create() { + let server = any_empty_ok().await; + let client = client_for(&server); + let _ = client + .feedback + .create(FeedbackCreate { + author: "@alice".into(), + title: "Bug".into(), + description: "Something broke".into(), + ..Default::default() + }) + .await; + let req = only_request(&server).await; + assert_eq!(req.method.as_str(), "POST"); + assert!(req.url.path().contains("/feedback")); +} + +#[tokio::test] +async fn feedback_vote() { + let server = any_empty_ok().await; + let client = client_for(&server); + let _ = client + .feedback + .vote( + "fb1", + FeedbackVoteRequest { + voter: "@alice".into(), + ..Default::default() + }, + ) + .await; + let req = only_request(&server).await; + assert_eq!(req.method.as_str(), "POST"); + assert!(req.url.path().contains("/feedback/fb1/vote")); +} + +#[tokio::test] +async fn feedback_update_status() { + let server = any_empty_ok().await; + let client = client_for(&server); + let _ = client + .feedback + .update_status("fb1", FeedbackStatusUpdate::default()) + .await; + let req = only_request(&server).await; + assert_eq!(req.method.as_str(), "PUT"); + assert!(req.url.path().contains("/feedback/fb1/status")); +}