Skip to main content

classcharts/api/
pupilfields.rs

1use serde::Deserialize;
2
3use crate::client::{ErrorResponse, CCParser, SuccessResponse, Client};
4
5use super::helpers::Empty;
6
7#[derive(Deserialize, Debug)]
8pub struct PupilField {
9    pub id: usize,
10    pub name: String,
11    pub graphic: String,
12    pub value: String,
13}
14
15#[derive(Deserialize, Debug)]
16pub struct PupilFieldsData {
17    pub note: String,
18    pub fields: Vec<PupilField>,
19}
20
21pub type PupilFieldsMeta = Vec<Empty>;
22
23pub type PupilFields = SuccessResponse<PupilFieldsData, PupilFieldsMeta>;
24
25impl Client {
26    /// Gets the current student's pupil fields. 
27    pub async fn get_pupilfields(&mut self) -> Result<PupilFields, ErrorResponse> {
28        let request = self
29            .build_get(format!("/customfields/{}", self.student_id))
30            .await?
31            .send()
32            .await?;
33
34        let text = request.cc_parse().await?;
35        let data: PupilFields = serde_json::from_str(&text)?;
36
37        return Ok(data);
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44    use httpmock::prelude::*;
45    use serde_json::json;
46
47    #[tokio::test]
48    async fn get_pupilfields_test() {
49        // Start a lightweight mock server.
50        let server = MockServer::start();
51
52        // Create a mock on the server.
53        let pupilfields_response = server.mock(|when, then| {
54            when.method(GET)
55                .path("/apiv2student/customfields/student_id");
56            then.status(200)
57                .header("content-type", "application/json")
58                .json_body(json!({
59                    "success": 1,
60                    "data": {
61                        "note": "Note",
62                        "fields": [
63                            {
64                                "id": 43583485,
65                                "name": "Field Name",
66                                "graphic": "#000",
67                                "value": "Value",
68                            }
69                        ]
70                    },
71                    "meta": [],
72                }));
73        });
74
75        let mut client = Client::generate_mock(server.base_url());
76
77        let _ = client.get_pupilfields().await.unwrap();
78
79        pupilfields_response.assert();
80    }
81}