Skip to main content

pact_verifier/
request_response.rs

1use ansi_term::Colour::*;
2use ansi_term::Style;
3
4use pact_matching::Mismatch;
5use pact_models::sync_interaction::RequestResponseInteraction;
6
7use crate::{generate_display_for_result, MismatchResult};
8
9pub fn process_request_response_result(
10  interaction: &RequestResponseInteraction,
11  match_result: &Result<Option<String>, MismatchResult>,
12  output: &mut Vec<String>,
13  coloured: bool) {
14  let plain = Style::new();
15  match match_result {
16    Ok(_) => {
17      generate_display_for_result(
18        interaction.response.status,
19        if coloured { Green.paint("OK") } else { plain.paint("OK") },
20        interaction.response.headers.clone().map(|h| h.iter().map(|(k, v)| {
21          (k.clone(), v.join(", "), if coloured { Green.paint("OK") } else { plain.paint("OK") })
22        }).collect()), if coloured { Green.paint("OK") } else { plain.paint("OK") },
23        output,
24        coloured
25      );
26    },
27    Err(err) => match err {
28      MismatchResult::Error(err_des, _) => {
29        if coloured {
30          output.push(format!("      {}", Red.paint(format!("Request Failed - {}", err_des))));
31        } else {
32          output.push(format!("      {}", format!("Request Failed - {}", err_des)));
33        }
34      },
35      MismatchResult::Mismatches { mismatches, .. } => {
36        let status_result = if mismatches.iter().any(|m| m.mismatch_type() == "StatusMismatch") {
37          if coloured { Red.paint("FAILED") } else { plain.paint("FAILED") }
38        } else {
39            if coloured { Green.paint("OK") } else { plain.paint("OK") }
40        };
41        let header_results = match interaction.response.headers {
42          Some(ref h) => Some(h.iter().map(|(k, v)| {
43            (k.clone(), v.join(", "), if mismatches.iter().any(|m| {
44              match *m {
45                Mismatch::HeaderMismatch { ref key, .. } => k == key,
46                _ => false
47              }
48            }) {
49              if coloured { Red.paint("FAILED") } else { plain.paint("FAILED") }
50            } else {
51              if coloured { Green.paint("OK") } else { plain.paint("OK") }
52            })
53          }).collect()),
54          None => None
55        };
56        let body_result = if mismatches.iter().any(|m| m.mismatch_type() == "BodyMismatch" ||
57          m.mismatch_type() == "BodyTypeMismatch") {
58          if coloured { Red.paint("FAILED") } else { plain.paint("FAILED") }
59        } else {
60            if coloured { Green.paint("OK") } else { plain.paint("OK") }
61        };
62
63        generate_display_for_result(interaction.response.status, status_result, header_results,
64                                    body_result, output, coloured);
65      }
66    }
67  }
68}