use std::{io, pin::pin};
use bytes::Bytes;
use cerniera::{FileTimes, ZipEntry, ZipWriter};
use futures_util::{StreamExt, stream};
fn boom() -> io::Error {
io::Error::other("boom")
}
#[tokio::test]
async fn content_stream_error_is_terminal() {
let entries = stream::iter([Ok(ZipEntry::file(
"a.txt".try_into().unwrap(),
FileTimes::default(),
stream::iter([Ok(Bytes::from_static(b"hi")), Err(boom())]),
)
.unwrap())]);
let mut zip = pin!(ZipWriter::new(entries));
assert!(zip.next().await.unwrap().is_ok());
assert!(zip.next().await.unwrap().is_ok());
assert!(matches!(zip.next().await, Some(Err(_))));
assert!(zip.next().await.is_none());
}
#[tokio::test]
async fn entries_stream_error_is_terminal() {
let entries = stream::iter([
Ok(ZipEntry::file(
"a.txt".try_into().unwrap(),
FileTimes::default(),
stream::iter([Ok(Bytes::from_static(b"x"))]),
)
.unwrap()),
Err(boom()),
]);
let mut zip = pin!(ZipWriter::new(entries));
assert!(zip.next().await.unwrap().is_ok());
assert!(zip.next().await.unwrap().is_ok());
assert!(zip.next().await.unwrap().is_ok());
assert!(matches!(zip.next().await, Some(Err(_))));
assert!(zip.next().await.is_none());
}