1use reqwest::Client;
5
6use crate::types::{Form, FormResponse, FormsError};
7
8const FORMS_BASE: &str = "https://forms.googleapis.com/v1/forms";
9
10pub async fn get_form(
18 client: &Client,
19 access_token: &str,
20 form_id: &str,
21) -> Result<Form, FormsError> {
22 let url = format!("{FORMS_BASE}/{form_id}");
23
24 let resp = client
25 .get(&url)
26 .bearer_auth(access_token)
27 .send()
28 .await?;
29
30 if !resp.status().is_success() {
31 let status = resp.status().as_u16();
32 let message = resp.text().await.unwrap_or_default();
33 return Err(FormsError::Api { status, message });
34 }
35
36 let form: Form = resp.json().await?;
37 Ok(form)
38}
39
40pub async fn get_response(
48 client: &Client,
49 access_token: &str,
50 form_id: &str,
51 response_id: &str,
52) -> Result<FormResponse, FormsError> {
53 let url = format!("{FORMS_BASE}/{form_id}/responses/{response_id}");
54
55 let resp = client
56 .get(&url)
57 .bearer_auth(access_token)
58 .send()
59 .await?;
60
61 if !resp.status().is_success() {
62 let status = resp.status().as_u16();
63 let message = resp.text().await.unwrap_or_default();
64 return Err(FormsError::Api { status, message });
65 }
66
67 let response: FormResponse = resp.json().await?;
68 Ok(response)
69}
70
71#[cfg(test)]
76mod tests {
77 use super::*;
78
79 #[test]
80 fn test_forms_base_url() {
81 assert_eq!(FORMS_BASE, "https://forms.googleapis.com/v1/forms");
82 }
83
84 #[test]
85 fn test_get_form_url_construction() {
86 let form_id = "1FAIpQLSe_abc123";
87 let expected = format!("{FORMS_BASE}/{form_id}");
88 assert_eq!(expected, "https://forms.googleapis.com/v1/forms/1FAIpQLSe_abc123");
89 }
90
91 #[test]
92 fn test_get_response_url_construction() {
93 let form_id = "form_xyz";
94 let response_id = "resp_001";
95 let url = format!("{FORMS_BASE}/{form_id}/responses/{response_id}");
96 assert_eq!(url, "https://forms.googleapis.com/v1/forms/form_xyz/responses/resp_001");
97 }
98}