rust-embed v8.11.0

#rust#proc-macro#http

git clone https://git.pyrossh.dev/rust-embed

rust macro which loads files into the rust binary at compile time during release and loads the file from the fs during dev.


tests/compression.rs
c3aed87 1
use rust_embed::{Embed, EmbeddedCompressedFile, EmbeddedFile};
c3aed87 2
c3aed87 3
#[derive(Embed)]
c3aed87 4
#[folder = "examples/public/"]
c3aed87 5
struct Asset;
c3aed87 6
c3aed87 7
#[derive(Embed)]
c3aed87 8
#[folder = "examples/public/"]
c3aed87 9
#[metadata_only = true]
c3aed87 10
struct MetadataAsset;
c3aed87 11
c3aed87 12
#[test]
c3aed87 13
fn get_returns_decompressed_content() {
c3aed87 14
  let file: EmbeddedFile = Asset::get("index.html").expect("index.html exists");
c3aed87 15
  assert!(!file.data.is_empty());
c3aed87 16
}
c3aed87 17
c3aed87 18
#[test]
c3aed87 19
fn get_missing_returns_none() {
c3aed87 20
  assert!(Asset::get("missing.html").is_none());
c3aed87 21
}
c3aed87 22
c3aed87 23
#[test]
c3aed87 24
fn metadata_only_compressed_always_returns_none() {
c3aed87 25
  let file: Option<EmbeddedCompressedFile> = MetadataAsset::compressed("index.html");
c3aed87 26
  assert!(file.is_none(), "metadata_only structs never have compressed data");
c3aed87 27
}
c3aed87 28
c3aed87 29
#[test]
c3aed87 30
fn metadata_only_get_returns_empty_data() {
c3aed87 31
  let file: EmbeddedFile = MetadataAsset::get("index.html").expect("index.html exists");
c3aed87 32
  assert_eq!(file.data.len(), 0);
c3aed87 33
}
c3aed87 34
c3aed87 35
#[cfg(any(not(debug_assertions), feature = "debug-embed"))]
c3aed87 36
mod release {
c3aed87 37
  use super::*;
c3aed87 38
c3aed87 39
  #[test]
c3aed87 40
  fn compressed_exists() {
c3aed87 41
    let file: Option<EmbeddedCompressedFile> = Asset::compressed("index.html");
c3aed87 42
    assert!(file.is_some(), "index.html should have a compressed version");
c3aed87 43
  }
c3aed87 44
c3aed87 45
  #[test]
c3aed87 46
  fn compressed_missing_returns_none() {
c3aed87 47
    let file: Option<EmbeddedCompressedFile> = Asset::compressed("missing.html");
c3aed87 48
    assert!(file.is_none());
c3aed87 49
  }
c3aed87 50
c3aed87 51
  #[test]
c3aed87 52
  fn compressed_decompresses_to_original_content() {
c3aed87 53
    let compressed: EmbeddedCompressedFile = Asset::compressed("index.html").expect("index.html exists");
c3aed87 54
    let uncompressed: EmbeddedFile = Asset::get("index.html").expect("index.html exists");
c3aed87 55
    assert_eq!(compressed.data.decoded(), uncompressed.data.as_ref());
c3aed87 56
  }
c3aed87 57
c3aed87 58
  #[test]
c3aed87 59
  fn compressed_and_get_share_same_hash() {
c3aed87 60
    let compressed: EmbeddedCompressedFile = Asset::compressed("index.html").expect("index.html exists");
c3aed87 61
    let uncompressed: EmbeddedFile = Asset::get("index.html").expect("index.html exists");
c3aed87 62
    assert_eq!(compressed.metadata.sha256_hash(), uncompressed.metadata.sha256_hash());
c3aed87 63
  }
c3aed87 64
c3aed87 65
  #[test]
c3aed87 66
  fn compressed_bytes_smaller_than_original_for_text() {
c3aed87 67
    let compressed: EmbeddedCompressedFile = Asset::compressed("index.html").expect("index.html exists");
c3aed87 68
    let uncompressed: EmbeddedFile = Asset::get("index.html").expect("index.html exists");
c3aed87 69
    assert!(
c3aed87 70
      compressed.data.compressed().len() < uncompressed.data.len(),
c3aed87 71
      "compressed text should be smaller than the original"
c3aed87 72
    );
c3aed87 73
  }
c3aed87 74
c3aed87 75
  #[test]
c3aed87 76
  fn content_encoding_is_valid_http_header_value() {
c3aed87 77
    let compressed: EmbeddedCompressedFile = Asset::compressed("index.html").expect("index.html exists");
c3aed87 78
    let encoding = compressed.content_encoding();
c3aed87 79
    assert!(
c3aed87 80
      encoding == "deflate" || encoding == "zstd",
c3aed87 81
      "content_encoding should be a known HTTP Content-Encoding value, got: {}",
c3aed87 82
      encoding
c3aed87 83
    );
c3aed87 84
  }
c3aed87 85
c3aed87 86
  #[test]
c3aed87 87
  fn compressed_iter_matches_get_iter() {
c3aed87 88
    let file_count = Asset::iter().count();
c3aed87 89
    let compressed_count = Asset::iter().filter_map(|p| Asset::compressed(p.as_ref())).count();
c3aed87 90
    assert_eq!(file_count, compressed_count, "every file should have a compressed version");
c3aed87 91
  }
c3aed87 92
}