mirror of
https://github.com/chatmail/core.git
synced 2026-04-17 21:46:35 +03:00
test: Image drafted as Viewtype::File is sent as is
This commit is contained in:
387
src/blob.rs
387
src/blob.rs
@@ -1101,32 +1101,34 @@ mod tests {
|
|||||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
async fn test_recode_image_1() {
|
async fn test_recode_image_1() {
|
||||||
let bytes = include_bytes!("../test-data/image/avatar1000x1000.jpg");
|
let bytes = include_bytes!("../test-data/image/avatar1000x1000.jpg");
|
||||||
send_image_check_mediaquality(
|
SendImageCheckMediaquality {
|
||||||
Viewtype::Image,
|
viewtype: Viewtype::Image,
|
||||||
Some("0"),
|
media_quality_config: "0",
|
||||||
bytes,
|
bytes,
|
||||||
"jpg",
|
extension: "jpg",
|
||||||
true, // has Exif
|
has_exif: true,
|
||||||
1000,
|
original_width: 1000,
|
||||||
1000,
|
original_height: 1000,
|
||||||
0,
|
compressed_width: 1000,
|
||||||
1000,
|
compressed_height: 1000,
|
||||||
1000,
|
..Default::default()
|
||||||
)
|
}
|
||||||
|
.test()
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
send_image_check_mediaquality(
|
SendImageCheckMediaquality {
|
||||||
Viewtype::Image,
|
viewtype: Viewtype::Image,
|
||||||
Some("1"),
|
media_quality_config: "1",
|
||||||
bytes,
|
bytes,
|
||||||
"jpg",
|
extension: "jpg",
|
||||||
true, // has Exif
|
has_exif: true,
|
||||||
1000,
|
original_width: 1000,
|
||||||
1000,
|
original_height: 1000,
|
||||||
0,
|
compressed_width: 1000,
|
||||||
1000,
|
compressed_height: 1000,
|
||||||
1000,
|
..Default::default()
|
||||||
)
|
}
|
||||||
|
.test()
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
@@ -1135,18 +1137,20 @@ mod tests {
|
|||||||
async fn test_recode_image_2() {
|
async fn test_recode_image_2() {
|
||||||
// The "-rotated" files are rotated by 270 degrees using the Exif metadata
|
// The "-rotated" files are rotated by 270 degrees using the Exif metadata
|
||||||
let bytes = include_bytes!("../test-data/image/rectangle2000x1800-rotated.jpg");
|
let bytes = include_bytes!("../test-data/image/rectangle2000x1800-rotated.jpg");
|
||||||
let img_rotated = send_image_check_mediaquality(
|
let img_rotated = SendImageCheckMediaquality {
|
||||||
Viewtype::Image,
|
viewtype: Viewtype::Image,
|
||||||
Some("0"),
|
media_quality_config: "0",
|
||||||
bytes,
|
bytes,
|
||||||
"jpg",
|
extension: "jpg",
|
||||||
true, // has Exif
|
has_exif: true,
|
||||||
2000,
|
original_width: 2000,
|
||||||
1800,
|
original_height: 1800,
|
||||||
270,
|
orientation: 270,
|
||||||
1800,
|
compressed_width: 1800,
|
||||||
2000,
|
compressed_height: 2000,
|
||||||
)
|
..Default::default()
|
||||||
|
}
|
||||||
|
.test()
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_correct_rotation(&img_rotated);
|
assert_correct_rotation(&img_rotated);
|
||||||
@@ -1155,18 +1159,18 @@ mod tests {
|
|||||||
img_rotated.write_to(&mut buf, ImageFormat::Jpeg).unwrap();
|
img_rotated.write_to(&mut buf, ImageFormat::Jpeg).unwrap();
|
||||||
let bytes = buf.into_inner();
|
let bytes = buf.into_inner();
|
||||||
|
|
||||||
let img_rotated = send_image_check_mediaquality(
|
let img_rotated = SendImageCheckMediaquality {
|
||||||
Viewtype::Image,
|
viewtype: Viewtype::Image,
|
||||||
Some("1"),
|
media_quality_config: "1",
|
||||||
&bytes,
|
bytes: &bytes,
|
||||||
"jpg",
|
extension: "jpg",
|
||||||
false, // no Exif
|
original_width: 1800,
|
||||||
1800,
|
original_height: 2000,
|
||||||
2000,
|
compressed_width: 1800,
|
||||||
0,
|
compressed_height: 2000,
|
||||||
1800,
|
..Default::default()
|
||||||
2000,
|
}
|
||||||
)
|
.test()
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_correct_rotation(&img_rotated);
|
assert_correct_rotation(&img_rotated);
|
||||||
@@ -1176,64 +1180,80 @@ mod tests {
|
|||||||
async fn test_recode_image_balanced_png() {
|
async fn test_recode_image_balanced_png() {
|
||||||
let bytes = include_bytes!("../test-data/image/screenshot.png");
|
let bytes = include_bytes!("../test-data/image/screenshot.png");
|
||||||
|
|
||||||
send_image_check_mediaquality(
|
SendImageCheckMediaquality {
|
||||||
Viewtype::Image,
|
viewtype: Viewtype::Image,
|
||||||
Some("0"),
|
media_quality_config: "0",
|
||||||
bytes,
|
bytes,
|
||||||
"png",
|
extension: "png",
|
||||||
false, // no Exif
|
original_width: 1920,
|
||||||
1920,
|
original_height: 1080,
|
||||||
1080,
|
compressed_width: 1920,
|
||||||
0,
|
compressed_height: 1080,
|
||||||
1920,
|
..Default::default()
|
||||||
1080,
|
}
|
||||||
)
|
.test()
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
send_image_check_mediaquality(
|
SendImageCheckMediaquality {
|
||||||
Viewtype::Image,
|
viewtype: Viewtype::Image,
|
||||||
Some("1"),
|
media_quality_config: "1",
|
||||||
bytes,
|
bytes,
|
||||||
"png",
|
extension: "png",
|
||||||
false, // no Exif
|
original_width: 1920,
|
||||||
1920,
|
original_height: 1080,
|
||||||
1080,
|
compressed_width: constants::WORSE_IMAGE_SIZE,
|
||||||
0,
|
compressed_height: constants::WORSE_IMAGE_SIZE * 1080 / 1920,
|
||||||
constants::WORSE_IMAGE_SIZE,
|
..Default::default()
|
||||||
constants::WORSE_IMAGE_SIZE * 1080 / 1920,
|
}
|
||||||
)
|
.test()
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
send_image_check_mediaquality(
|
SendImageCheckMediaquality {
|
||||||
Viewtype::File,
|
viewtype: Viewtype::File,
|
||||||
Some("1"),
|
media_quality_config: "1",
|
||||||
bytes,
|
bytes,
|
||||||
"png",
|
extension: "png",
|
||||||
false, // no Exif
|
original_width: 1920,
|
||||||
1920,
|
original_height: 1080,
|
||||||
1080,
|
compressed_width: 1920,
|
||||||
0,
|
compressed_height: 1080,
|
||||||
1920,
|
..Default::default()
|
||||||
1080,
|
}
|
||||||
)
|
.test()
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
SendImageCheckMediaquality {
|
||||||
|
viewtype: Viewtype::File,
|
||||||
|
media_quality_config: "1",
|
||||||
|
bytes,
|
||||||
|
extension: "png",
|
||||||
|
original_width: 1920,
|
||||||
|
original_height: 1080,
|
||||||
|
compressed_width: 1920,
|
||||||
|
compressed_height: 1080,
|
||||||
|
set_draft: true,
|
||||||
|
..Default::default()
|
||||||
|
}
|
||||||
|
.test()
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
// This will be sent as Image, see [`BlobObject::maybe_sticker`] for explanation.
|
// This will be sent as Image, see [`BlobObject::maybe_sticker`] for explanation.
|
||||||
send_image_check_mediaquality(
|
SendImageCheckMediaquality {
|
||||||
Viewtype::Sticker,
|
viewtype: Viewtype::Sticker,
|
||||||
Some("0"),
|
media_quality_config: "0",
|
||||||
bytes,
|
bytes,
|
||||||
"png",
|
extension: "png",
|
||||||
false, // no Exif
|
original_width: 1920,
|
||||||
1920,
|
original_height: 1080,
|
||||||
1080,
|
compressed_width: 1920,
|
||||||
0,
|
compressed_height: 1080,
|
||||||
1920,
|
..Default::default()
|
||||||
1080,
|
}
|
||||||
)
|
.test()
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
@@ -1244,18 +1264,18 @@ mod tests {
|
|||||||
async fn test_recode_image_rgba_png_to_jpeg() {
|
async fn test_recode_image_rgba_png_to_jpeg() {
|
||||||
let bytes = include_bytes!("../test-data/image/screenshot-rgba.png");
|
let bytes = include_bytes!("../test-data/image/screenshot-rgba.png");
|
||||||
|
|
||||||
send_image_check_mediaquality(
|
SendImageCheckMediaquality {
|
||||||
Viewtype::Image,
|
viewtype: Viewtype::Image,
|
||||||
Some("1"),
|
media_quality_config: "1",
|
||||||
bytes,
|
bytes,
|
||||||
"png",
|
extension: "png",
|
||||||
false, // no Exif
|
original_width: 1920,
|
||||||
1920,
|
original_height: 1080,
|
||||||
1080,
|
compressed_width: constants::WORSE_IMAGE_SIZE,
|
||||||
0,
|
compressed_height: constants::WORSE_IMAGE_SIZE * 1080 / 1920,
|
||||||
constants::WORSE_IMAGE_SIZE,
|
..Default::default()
|
||||||
constants::WORSE_IMAGE_SIZE * 1080 / 1920,
|
}
|
||||||
)
|
.test()
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
@@ -1263,18 +1283,19 @@ mod tests {
|
|||||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
async fn test_recode_image_huge_jpg() {
|
async fn test_recode_image_huge_jpg() {
|
||||||
let bytes = include_bytes!("../test-data/image/screenshot.jpg");
|
let bytes = include_bytes!("../test-data/image/screenshot.jpg");
|
||||||
send_image_check_mediaquality(
|
SendImageCheckMediaquality {
|
||||||
Viewtype::Image,
|
viewtype: Viewtype::Image,
|
||||||
Some("0"),
|
media_quality_config: "0",
|
||||||
bytes,
|
bytes,
|
||||||
"jpg",
|
extension: "jpg",
|
||||||
true, // has Exif
|
has_exif: true,
|
||||||
1920,
|
original_width: 1920,
|
||||||
1080,
|
original_height: 1080,
|
||||||
0,
|
compressed_width: constants::BALANCED_IMAGE_SIZE,
|
||||||
constants::BALANCED_IMAGE_SIZE,
|
compressed_height: constants::BALANCED_IMAGE_SIZE * 1080 / 1920,
|
||||||
constants::BALANCED_IMAGE_SIZE * 1080 / 1920,
|
..Default::default()
|
||||||
)
|
}
|
||||||
|
.test()
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
@@ -1296,71 +1317,93 @@ mod tests {
|
|||||||
assert_eq!(luma, 0);
|
assert_eq!(luma, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[derive(Default)]
|
||||||
async fn send_image_check_mediaquality(
|
struct SendImageCheckMediaquality<'a> {
|
||||||
viewtype: Viewtype,
|
pub(crate) viewtype: Viewtype,
|
||||||
media_quality_config: Option<&str>,
|
pub(crate) media_quality_config: &'a str,
|
||||||
bytes: &[u8],
|
pub(crate) bytes: &'a [u8],
|
||||||
extension: &str,
|
pub(crate) extension: &'a str,
|
||||||
has_exif: bool,
|
pub(crate) has_exif: bool,
|
||||||
original_width: u32,
|
pub(crate) original_width: u32,
|
||||||
original_height: u32,
|
pub(crate) original_height: u32,
|
||||||
orientation: i32,
|
pub(crate) orientation: i32,
|
||||||
compressed_width: u32,
|
pub(crate) compressed_width: u32,
|
||||||
compressed_height: u32,
|
pub(crate) compressed_height: u32,
|
||||||
) -> anyhow::Result<DynamicImage> {
|
pub(crate) set_draft: bool,
|
||||||
let alice = TestContext::new_alice().await;
|
}
|
||||||
let bob = TestContext::new_bob().await;
|
|
||||||
alice
|
|
||||||
.set_config(Config::MediaQuality, media_quality_config)
|
|
||||||
.await?;
|
|
||||||
let file = alice.get_blobdir().join("file").with_extension(extension);
|
|
||||||
|
|
||||||
fs::write(&file, &bytes)
|
impl SendImageCheckMediaquality<'_> {
|
||||||
.await
|
pub(crate) async fn test(self) -> anyhow::Result<DynamicImage> {
|
||||||
.context("failed to write file")?;
|
let viewtype = self.viewtype;
|
||||||
check_image_size(&file, original_width, original_height);
|
let media_quality_config = self.media_quality_config;
|
||||||
|
let bytes = self.bytes;
|
||||||
|
let extension = self.extension;
|
||||||
|
let has_exif = self.has_exif;
|
||||||
|
let original_width = self.original_width;
|
||||||
|
let original_height = self.original_height;
|
||||||
|
let orientation = self.orientation;
|
||||||
|
let compressed_width = self.compressed_width;
|
||||||
|
let compressed_height = self.compressed_height;
|
||||||
|
let set_draft = self.set_draft;
|
||||||
|
|
||||||
let (_, exif) = image_metadata(&std::fs::File::open(&file)?)?;
|
let alice = TestContext::new_alice().await;
|
||||||
if has_exif {
|
let bob = TestContext::new_bob().await;
|
||||||
let exif = exif.unwrap();
|
alice
|
||||||
assert_eq!(exif_orientation(&exif, &alice), orientation);
|
.set_config(Config::MediaQuality, Some(media_quality_config))
|
||||||
} else {
|
.await?;
|
||||||
|
let file = alice.get_blobdir().join("file").with_extension(extension);
|
||||||
|
|
||||||
|
fs::write(&file, &bytes)
|
||||||
|
.await
|
||||||
|
.context("failed to write file")?;
|
||||||
|
check_image_size(&file, original_width, original_height);
|
||||||
|
|
||||||
|
let (_, exif) = image_metadata(&std::fs::File::open(&file)?)?;
|
||||||
|
if has_exif {
|
||||||
|
let exif = exif.unwrap();
|
||||||
|
assert_eq!(exif_orientation(&exif, &alice), orientation);
|
||||||
|
} else {
|
||||||
|
assert!(exif.is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut msg = Message::new(viewtype);
|
||||||
|
msg.set_file(file.to_str().unwrap(), None);
|
||||||
|
let chat = alice.create_chat(&bob).await;
|
||||||
|
if set_draft {
|
||||||
|
chat.id.set_draft(&alice, Some(&mut msg)).await.unwrap();
|
||||||
|
msg = chat.id.get_draft(&alice).await.unwrap().unwrap();
|
||||||
|
assert_eq!(msg.get_viewtype(), Viewtype::File);
|
||||||
|
}
|
||||||
|
let sent = alice.send_msg(chat.id, &mut msg).await;
|
||||||
|
let alice_msg = alice.get_last_msg().await;
|
||||||
|
assert_eq!(alice_msg.get_width() as u32, compressed_width);
|
||||||
|
assert_eq!(alice_msg.get_height() as u32, compressed_height);
|
||||||
|
let file_saved = alice
|
||||||
|
.get_blobdir()
|
||||||
|
.join("saved-".to_string() + &alice_msg.get_filename().unwrap());
|
||||||
|
alice_msg.save_file(&alice, &file_saved).await?;
|
||||||
|
check_image_size(file_saved, compressed_width, compressed_height);
|
||||||
|
|
||||||
|
let bob_msg = bob.recv_msg(&sent).await;
|
||||||
|
assert_eq!(bob_msg.get_viewtype(), Viewtype::Image);
|
||||||
|
assert_eq!(bob_msg.get_width() as u32, compressed_width);
|
||||||
|
assert_eq!(bob_msg.get_height() as u32, compressed_height);
|
||||||
|
let file_saved = bob
|
||||||
|
.get_blobdir()
|
||||||
|
.join("saved-".to_string() + &bob_msg.get_filename().unwrap());
|
||||||
|
bob_msg.save_file(&bob, &file_saved).await?;
|
||||||
|
if viewtype == Viewtype::File {
|
||||||
|
assert_eq!(file_saved.extension().unwrap(), extension);
|
||||||
|
let bytes1 = fs::read(&file_saved).await?;
|
||||||
|
assert_eq!(&bytes1, bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
let (_, exif) = image_metadata(&std::fs::File::open(&file_saved)?)?;
|
||||||
assert!(exif.is_none());
|
assert!(exif.is_none());
|
||||||
|
|
||||||
|
let img = check_image_size(file_saved, compressed_width, compressed_height);
|
||||||
|
Ok(img)
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut msg = Message::new(viewtype);
|
|
||||||
msg.set_file(file.to_str().unwrap(), None);
|
|
||||||
let chat = alice.create_chat(&bob).await;
|
|
||||||
let sent = alice.send_msg(chat.id, &mut msg).await;
|
|
||||||
let alice_msg = alice.get_last_msg().await;
|
|
||||||
assert_eq!(alice_msg.get_width() as u32, compressed_width);
|
|
||||||
assert_eq!(alice_msg.get_height() as u32, compressed_height);
|
|
||||||
let file_saved = alice
|
|
||||||
.get_blobdir()
|
|
||||||
.join("saved-".to_string() + &alice_msg.get_filename().unwrap());
|
|
||||||
alice_msg.save_file(&alice, &file_saved).await?;
|
|
||||||
check_image_size(file_saved, compressed_width, compressed_height);
|
|
||||||
|
|
||||||
let bob_msg = bob.recv_msg(&sent).await;
|
|
||||||
assert_eq!(bob_msg.get_viewtype(), Viewtype::Image);
|
|
||||||
assert_eq!(bob_msg.get_width() as u32, compressed_width);
|
|
||||||
assert_eq!(bob_msg.get_height() as u32, compressed_height);
|
|
||||||
let file_saved = bob
|
|
||||||
.get_blobdir()
|
|
||||||
.join("saved-".to_string() + &bob_msg.get_filename().unwrap());
|
|
||||||
bob_msg.save_file(&bob, &file_saved).await?;
|
|
||||||
if viewtype == Viewtype::File {
|
|
||||||
assert_eq!(file_saved.extension().unwrap(), extension);
|
|
||||||
let bytes1 = fs::read(&file_saved).await?;
|
|
||||||
assert_eq!(&bytes1, bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
let (_, exif) = image_metadata(&std::fs::File::open(&file_saved)?)?;
|
|
||||||
assert!(exif.is_none());
|
|
||||||
|
|
||||||
let img = check_image_size(file_saved, compressed_width, compressed_height);
|
|
||||||
Ok(img)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
|
|||||||
Reference in New Issue
Block a user