Skip to main content

gitlab_runner_mock/api/
update.rs

1use http::StatusCode;
2use serde::Deserialize;
3use wiremock::ResponseTemplate;
4use wiremock::{Request, Respond};
5
6use crate::GitlabRunnerMock;
7use crate::MockJobState;
8
9#[derive(Debug, Deserialize)]
10pub(crate) struct JobUpdate {
11    token: String,
12    state: MockJobState,
13}
14
15pub(crate) struct JobUpdateResponder {
16    mock: GitlabRunnerMock,
17}
18
19impl JobUpdateResponder {
20    pub(crate) fn new(mock: GitlabRunnerMock) -> Self {
21        Self { mock }
22    }
23}
24
25impl Respond for JobUpdateResponder {
26    fn respond(&self, request: &Request) -> ResponseTemplate {
27        let r: JobUpdate = serde_json::from_slice(&request.body).unwrap();
28        let id = request
29            .url
30            .path_segments()
31            .unwrap()
32            .next_back()
33            .unwrap()
34            .parse()
35            .unwrap();
36
37        if let Some(job) = self.mock.get_job(id) {
38            if r.token != job.token() {
39                ResponseTemplate::new(StatusCode::FORBIDDEN)
40            } else {
41                let r = match (job.state(), r.state) {
42                    (MockJobState::Running, MockJobState::Success) => {
43                        job.update_state(r.state);
44                        ResponseTemplate::new(StatusCode::OK)
45                    }
46                    (MockJobState::Running, MockJobState::Failed) => {
47                        job.update_state(r.state);
48                        ResponseTemplate::new(StatusCode::OK)
49                    }
50                    (MockJobState::Running, MockJobState::Running) => {
51                        job.update_state(r.state);
52                        ResponseTemplate::new(StatusCode::OK)
53                    }
54                    (current_state, _) if current_state != MockJobState::Running => {
55                        ResponseTemplate::new(StatusCode::FORBIDDEN)
56                    }
57                    _ => panic!("Invalid state change"),
58                };
59
60                r.append_header("Job-Status", &*job.state().to_string())
61            }
62        } else {
63            ResponseTemplate::new(StatusCode::NOT_FOUND)
64        }
65    }
66}