use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum Status {
Passed,
Failed,
Broken,
Skipped,
#[default]
Unknown,
}
impl fmt::Display for Status {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Status::Passed => write!(f, "passed"),
Status::Failed => write!(f, "failed"),
Status::Broken => write!(f, "broken"),
Status::Skipped => write!(f, "skipped"),
Status::Unknown => write!(f, "unknown"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum Stage {
Scheduled,
Running,
#[default]
Finished,
Pending,
Interrupted,
}
impl fmt::Display for Stage {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Stage::Scheduled => write!(f, "scheduled"),
Stage::Running => write!(f, "running"),
Stage::Finished => write!(f, "finished"),
Stage::Pending => write!(f, "pending"),
Stage::Interrupted => write!(f, "interrupted"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum Severity {
Blocker,
Critical,
#[default]
Normal,
Minor,
Trivial,
}
impl Severity {
pub fn as_str(&self) -> &'static str {
match self {
Severity::Blocker => "blocker",
Severity::Critical => "critical",
Severity::Normal => "normal",
Severity::Minor => "minor",
Severity::Trivial => "trivial",
}
}
}
impl fmt::Display for Severity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum LinkType {
#[default]
#[serde(rename = "link")]
Default,
Issue,
Tms,
}
impl fmt::Display for LinkType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
LinkType::Default => write!(f, "link"),
LinkType::Issue => write!(f, "issue"),
LinkType::Tms => write!(f, "tms"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum ParameterMode {
#[default]
Default,
Hidden,
Masked,
}
impl fmt::Display for ParameterMode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ParameterMode::Default => write!(f, "default"),
ParameterMode::Hidden => write!(f, "hidden"),
ParameterMode::Masked => write!(f, "masked"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum ContentType {
#[default]
Text,
Json,
Xml,
Html,
Csv,
Tsv,
Css,
Uri,
Svg,
Png,
Jpeg,
Webm,
Mp4,
Zip,
#[serde(rename = "imagediff")]
ImageDiff,
}
impl ContentType {
pub fn as_mime(&self) -> &'static str {
match self {
ContentType::Text => "text/plain",
ContentType::Json => "application/json",
ContentType::Xml => "application/xml",
ContentType::Html => "text/html",
ContentType::Csv => "text/csv",
ContentType::Tsv => "text/tab-separated-values",
ContentType::Css => "text/css",
ContentType::Uri => "text/uri-list",
ContentType::Svg => "image/svg+xml",
ContentType::Png => "image/png",
ContentType::Jpeg => "image/jpeg",
ContentType::Webm => "video/webm",
ContentType::Mp4 => "video/mp4",
ContentType::Zip => "application/zip",
ContentType::ImageDiff => "application/vnd.allure.image.diff",
}
}
pub fn extension(&self) -> &'static str {
match self {
ContentType::Text => "txt",
ContentType::Json => "json",
ContentType::Xml => "xml",
ContentType::Html => "html",
ContentType::Csv => "csv",
ContentType::Tsv => "tsv",
ContentType::Css => "css",
ContentType::Uri => "uri",
ContentType::Svg => "svg",
ContentType::Png => "png",
ContentType::Jpeg => "jpg",
ContentType::Webm => "webm",
ContentType::Mp4 => "mp4",
ContentType::Zip => "zip",
ContentType::ImageDiff => "imagediff",
}
}
}
impl fmt::Display for ContentType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_mime())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[non_exhaustive]
pub enum LabelName {
#[serde(rename = "AS_ID")]
AllureId,
#[serde(rename = "suite")]
Suite,
#[serde(rename = "parentSuite")]
ParentSuite,
#[serde(rename = "subSuite")]
SubSuite,
#[serde(rename = "epic")]
Epic,
#[serde(rename = "feature")]
Feature,
#[serde(rename = "story")]
Story,
#[serde(rename = "severity")]
Severity,
#[default]
#[serde(rename = "tag")]
Tag,
#[serde(rename = "owner")]
Owner,
#[serde(rename = "host")]
Host,
#[serde(rename = "thread")]
Thread,
#[serde(rename = "testMethod")]
TestMethod,
#[serde(rename = "testClass")]
TestClass,
#[serde(rename = "package")]
Package,
#[serde(rename = "framework")]
Framework,
#[serde(rename = "language")]
Language,
}
impl LabelName {
pub fn as_str(&self) -> &'static str {
match self {
LabelName::AllureId => "AS_ID",
LabelName::Suite => "suite",
LabelName::ParentSuite => "parentSuite",
LabelName::SubSuite => "subSuite",
LabelName::Epic => "epic",
LabelName::Feature => "feature",
LabelName::Story => "story",
LabelName::Severity => "severity",
LabelName::Tag => "tag",
LabelName::Owner => "owner",
LabelName::Host => "host",
LabelName::Thread => "thread",
LabelName::TestMethod => "testMethod",
LabelName::TestClass => "testClass",
LabelName::Package => "package",
LabelName::Framework => "framework",
LabelName::Language => "language",
}
}
}
impl fmt::Display for LabelName {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_status_serialization() {
assert_eq!(
serde_json::to_string(&Status::Passed).unwrap(),
"\"passed\""
);
assert_eq!(
serde_json::to_string(&Status::Failed).unwrap(),
"\"failed\""
);
assert_eq!(
serde_json::to_string(&Status::Broken).unwrap(),
"\"broken\""
);
assert_eq!(
serde_json::to_string(&Status::Skipped).unwrap(),
"\"skipped\""
);
assert_eq!(
serde_json::to_string(&Status::Unknown).unwrap(),
"\"unknown\""
);
}
#[test]
fn test_stage_serialization() {
assert_eq!(
serde_json::to_string(&Stage::Finished).unwrap(),
"\"finished\""
);
assert_eq!(
serde_json::to_string(&Stage::Running).unwrap(),
"\"running\""
);
}
#[test]
fn test_severity_as_str() {
assert_eq!(Severity::Blocker.as_str(), "blocker");
assert_eq!(Severity::Critical.as_str(), "critical");
assert_eq!(Severity::Normal.as_str(), "normal");
}
#[test]
fn test_content_type_mime() {
assert_eq!(ContentType::Json.as_mime(), "application/json");
assert_eq!(ContentType::Png.as_mime(), "image/png");
}
#[test]
fn test_label_name_as_str() {
assert_eq!(LabelName::Epic.as_str(), "epic");
assert_eq!(LabelName::AllureId.as_str(), "AS_ID");
assert_eq!(LabelName::ParentSuite.as_str(), "parentSuite");
}
#[test]
fn test_status_display() {
assert_eq!(format!("{}", Status::Passed), "passed");
assert_eq!(format!("{}", Status::Failed), "failed");
assert_eq!(format!("{}", Status::Broken), "broken");
}
#[test]
fn test_stage_display() {
assert_eq!(format!("{}", Stage::Running), "running");
assert_eq!(format!("{}", Stage::Finished), "finished");
}
#[test]
fn test_severity_display() {
assert_eq!(format!("{}", Severity::Critical), "critical");
assert_eq!(format!("{}", Severity::Blocker), "blocker");
}
#[test]
fn test_link_type_display() {
assert_eq!(format!("{}", LinkType::Issue), "issue");
assert_eq!(format!("{}", LinkType::Tms), "tms");
assert_eq!(format!("{}", LinkType::Default), "link");
}
#[test]
fn test_parameter_mode_display() {
assert_eq!(format!("{}", ParameterMode::Default), "default");
assert_eq!(format!("{}", ParameterMode::Hidden), "hidden");
assert_eq!(format!("{}", ParameterMode::Masked), "masked");
}
#[test]
fn test_content_type_display() {
assert_eq!(format!("{}", ContentType::Json), "application/json");
assert_eq!(format!("{}", ContentType::Png), "image/png");
}
#[test]
fn test_label_name_display() {
assert_eq!(format!("{}", LabelName::Epic), "epic");
assert_eq!(format!("{}", LabelName::AllureId), "AS_ID");
}
#[test]
fn test_stage_pending_and_interrupted_display() {
assert_eq!(format!("{}", Stage::Pending), "pending");
assert_eq!(format!("{}", Stage::Interrupted), "interrupted");
}
#[test]
fn test_content_type_extension_and_image_diff() {
assert_eq!(ContentType::ImageDiff.extension(), "imagediff");
assert_eq!(ContentType::Zip.extension(), "zip");
}
#[test]
fn test_severity_minor_and_trivial() {
assert_eq!(Severity::Minor.to_string(), "minor");
assert_eq!(Severity::Trivial.to_string(), "trivial");
}
#[test]
fn test_status_and_stage_cover_all_variants() {
assert_eq!(Status::Skipped.to_string(), "skipped");
assert_eq!(Status::Unknown.to_string(), "unknown");
assert_eq!(Stage::Scheduled.to_string(), "scheduled");
}
#[test]
fn test_content_type_mime_and_extension_variants() {
assert_eq!(ContentType::Tsv.as_mime(), "text/tab-separated-values");
assert_eq!(ContentType::Css.as_mime(), "text/css");
assert_eq!(ContentType::Uri.extension(), "uri");
assert_eq!(ContentType::Svg.extension(), "svg");
}
#[test]
fn test_label_name_as_str_additional_variants() {
assert_eq!(LabelName::Package.as_str(), "package");
assert_eq!(LabelName::TestClass.as_str(), "testClass");
assert_eq!(LabelName::TestMethod.as_str(), "testMethod");
}
}