Skip to main content

gog_forms/
get.rs

1// get.rs - Fetch a Google Form or a single form response by ID.
2// Google Forms API v1: https://developers.google.com/forms/api/reference/rest
3
4use reqwest::Client;
5
6use crate::types::{Form, FormResponse, FormsError};
7
8const FORMS_BASE: &str = "https://forms.googleapis.com/v1/forms";
9
10// ---------------------------------------------------------------------------
11// get_form
12// ---------------------------------------------------------------------------
13
14/// Fetch a Google Form by its form ID.
15///
16/// Uses: `GET https://forms.googleapis.com/v1/forms/{formId}`
17pub 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
40// ---------------------------------------------------------------------------
41// get_response
42// ---------------------------------------------------------------------------
43
44/// Fetch a single form response by its response ID.
45///
46/// Uses: `GET https://forms.googleapis.com/v1/forms/{formId}/responses/{responseId}`
47pub 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// ---------------------------------------------------------------------------
72// Tests
73// ---------------------------------------------------------------------------
74
75#[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}