gitlab_runner_mock/api/
update.rs1use 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}