2022-10-21 00:00:07 +08:00
|
|
|
use std::fs::File;
|
|
|
|
use std::io::{BufReader, Read};
|
|
|
|
|
|
|
|
use flate2::bufread::GzDecoder;
|
|
|
|
use serde::Deserialize;
|
|
|
|
use tempfile::TempDir;
|
2022-10-03 19:57:18 +08:00
|
|
|
|
2022-10-13 22:21:54 +08:00
|
|
|
use self::compat::v4_to_v5::CompatV4ToV5;
|
|
|
|
use self::compat::v5_to_v6::{CompatIndexV5ToV6, CompatV5ToV6};
|
|
|
|
use self::v5::V5Reader;
|
|
|
|
use self::v6::{V6IndexReader, V6Reader};
|
2022-11-30 21:55:45 +08:00
|
|
|
use crate::{Result, Version};
|
2022-10-09 23:30:34 +08:00
|
|
|
|
2022-10-06 20:41:21 +08:00
|
|
|
mod compat;
|
2022-10-11 00:57:27 +08:00
|
|
|
|
2022-11-30 21:55:45 +08:00
|
|
|
pub(self) mod v1;
|
2022-10-10 05:47:56 +08:00
|
|
|
pub(self) mod v2;
|
2022-10-07 22:43:05 +08:00
|
|
|
pub(self) mod v3;
|
2022-10-06 02:11:07 +08:00
|
|
|
pub(self) mod v4;
|
|
|
|
pub(self) mod v5;
|
|
|
|
pub(self) mod v6;
|
2022-10-03 19:57:18 +08:00
|
|
|
|
2022-10-10 23:58:30 +08:00
|
|
|
pub type Document = serde_json::Map<String, serde_json::Value>;
|
|
|
|
pub type UpdateFile = dyn Iterator<Item = Result<Document>>;
|
|
|
|
|
2022-10-13 22:21:54 +08:00
|
|
|
pub enum DumpReader {
|
|
|
|
Current(V6Reader),
|
|
|
|
Compat(CompatV5ToV6),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl DumpReader {
|
|
|
|
pub fn open(dump: impl Read) -> Result<DumpReader> {
|
|
|
|
let path = TempDir::new()?;
|
|
|
|
let mut dump = BufReader::new(dump);
|
|
|
|
let gz = GzDecoder::new(&mut dump);
|
|
|
|
let mut archive = tar::Archive::new(gz);
|
|
|
|
archive.unpack(path.path())?;
|
|
|
|
|
|
|
|
#[derive(Deserialize)]
|
|
|
|
#[serde(rename_all = "camelCase")]
|
|
|
|
struct MetadataVersion {
|
|
|
|
pub dump_version: Version,
|
|
|
|
}
|
|
|
|
let mut meta_file = File::open(path.path().join("metadata.json"))?;
|
|
|
|
let MetadataVersion { dump_version } = serde_json::from_reader(&mut meta_file)?;
|
|
|
|
|
|
|
|
match dump_version {
|
2022-11-30 21:55:45 +08:00
|
|
|
Version::V1 => {
|
|
|
|
Ok(v1::V1Reader::open(path)?.to_v2().to_v3().to_v4().to_v5().to_v6().into())
|
|
|
|
}
|
2022-10-21 00:00:07 +08:00
|
|
|
Version::V2 => Ok(v2::V2Reader::open(path)?.to_v3().to_v4().to_v5().to_v6().into()),
|
2022-10-13 22:21:54 +08:00
|
|
|
Version::V3 => Ok(v3::V3Reader::open(path)?.to_v4().to_v5().to_v6().into()),
|
|
|
|
Version::V4 => Ok(v4::V4Reader::open(path)?.to_v5().to_v6().into()),
|
|
|
|
Version::V5 => Ok(v5::V5Reader::open(path)?.to_v6().into()),
|
|
|
|
Version::V6 => Ok(v6::V6Reader::open(path)?.into()),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn version(&self) -> crate::Version {
|
|
|
|
match self {
|
|
|
|
DumpReader::Current(current) => current.version(),
|
|
|
|
DumpReader::Compat(compat) => compat.version(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn date(&self) -> Option<time::OffsetDateTime> {
|
|
|
|
match self {
|
|
|
|
DumpReader::Current(current) => current.date(),
|
|
|
|
DumpReader::Compat(compat) => compat.date(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn instance_uid(&self) -> Result<Option<uuid::Uuid>> {
|
|
|
|
match self {
|
|
|
|
DumpReader::Current(current) => current.instance_uid(),
|
|
|
|
DumpReader::Compat(compat) => compat.instance_uid(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn indexes(&self) -> Result<Box<dyn Iterator<Item = Result<DumpIndexReader>> + '_>> {
|
|
|
|
match self {
|
|
|
|
DumpReader::Current(current) => {
|
|
|
|
let indexes = Box::new(current.indexes()?.map(|res| res.map(DumpIndexReader::from)))
|
|
|
|
as Box<dyn Iterator<Item = Result<DumpIndexReader>> + '_>;
|
|
|
|
Ok(indexes)
|
|
|
|
}
|
|
|
|
DumpReader::Compat(compat) => {
|
|
|
|
let indexes = Box::new(compat.indexes()?.map(|res| res.map(DumpIndexReader::from)))
|
|
|
|
as Box<dyn Iterator<Item = Result<DumpIndexReader>> + '_>;
|
|
|
|
Ok(indexes)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn tasks(
|
|
|
|
&mut self,
|
2022-10-17 23:38:31 +08:00
|
|
|
) -> Result<Box<dyn Iterator<Item = Result<(v6::Task, Option<Box<UpdateFile>>)>> + '_>> {
|
2022-10-13 22:21:54 +08:00
|
|
|
match self {
|
2022-10-17 23:38:31 +08:00
|
|
|
DumpReader::Current(current) => Ok(current.tasks()),
|
2022-10-13 22:21:54 +08:00
|
|
|
DumpReader::Compat(compat) => compat.tasks(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-17 23:38:31 +08:00
|
|
|
pub fn keys(&mut self) -> Result<Box<dyn Iterator<Item = Result<v6::Key>> + '_>> {
|
2022-10-13 22:21:54 +08:00
|
|
|
match self {
|
2022-10-17 23:38:31 +08:00
|
|
|
DumpReader::Current(current) => Ok(current.keys()),
|
2022-10-13 22:21:54 +08:00
|
|
|
DumpReader::Compat(compat) => compat.keys(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<V6Reader> for DumpReader {
|
|
|
|
fn from(value: V6Reader) -> Self {
|
|
|
|
DumpReader::Current(value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CompatV5ToV6> for DumpReader {
|
|
|
|
fn from(value: CompatV5ToV6) -> Self {
|
|
|
|
DumpReader::Compat(value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<V5Reader> for DumpReader {
|
|
|
|
fn from(value: V5Reader) -> Self {
|
|
|
|
DumpReader::Compat(value.to_v6())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CompatV4ToV5> for DumpReader {
|
|
|
|
fn from(value: CompatV4ToV5) -> Self {
|
|
|
|
DumpReader::Compat(value.to_v6())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub enum DumpIndexReader {
|
|
|
|
Current(v6::V6IndexReader),
|
2022-10-22 22:35:42 +08:00
|
|
|
Compat(Box<CompatIndexV5ToV6>),
|
2022-10-13 22:21:54 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
impl DumpIndexReader {
|
|
|
|
pub fn new_v6(v6: v6::V6IndexReader) -> DumpIndexReader {
|
|
|
|
DumpIndexReader::Current(v6)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn metadata(&self) -> &crate::IndexMetadata {
|
|
|
|
match self {
|
|
|
|
DumpIndexReader::Current(v6) => v6.metadata(),
|
|
|
|
DumpIndexReader::Compat(compat) => compat.metadata(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn documents(&mut self) -> Result<Box<dyn Iterator<Item = Result<Document>> + '_>> {
|
|
|
|
match self {
|
|
|
|
DumpIndexReader::Current(v6) => v6
|
|
|
|
.documents()
|
|
|
|
.map(|iter| Box::new(iter) as Box<dyn Iterator<Item = Result<Document>> + '_>),
|
|
|
|
DumpIndexReader::Compat(compat) => compat
|
|
|
|
.documents()
|
|
|
|
.map(|iter| Box::new(iter) as Box<dyn Iterator<Item = Result<Document>> + '_>),
|
|
|
|
}
|
2022-10-03 19:57:18 +08:00
|
|
|
}
|
2022-10-13 22:21:54 +08:00
|
|
|
|
|
|
|
pub fn settings(&mut self) -> Result<v6::Settings<v6::Checked>> {
|
|
|
|
match self {
|
|
|
|
DumpIndexReader::Current(v6) => v6.settings(),
|
|
|
|
DumpIndexReader::Compat(compat) => compat.settings(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<V6IndexReader> for DumpIndexReader {
|
|
|
|
fn from(value: V6IndexReader) -> Self {
|
|
|
|
DumpIndexReader::Current(value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<CompatIndexV5ToV6> for DumpIndexReader {
|
|
|
|
fn from(value: CompatIndexV5ToV6) -> Self {
|
2022-10-22 22:35:42 +08:00
|
|
|
DumpIndexReader::Compat(Box::new(value))
|
2022-10-03 22:12:01 +08:00
|
|
|
}
|
2022-10-03 19:57:18 +08:00
|
|
|
}
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
pub(crate) mod test {
|
|
|
|
use std::fs::File;
|
|
|
|
|
2022-10-27 00:49:47 +08:00
|
|
|
use meili_snap::insta;
|
|
|
|
|
2022-10-11 02:17:14 +08:00
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn import_dump_v5() {
|
|
|
|
let dump = File::open("tests/assets/v5.dump").unwrap();
|
2022-10-13 22:21:54 +08:00
|
|
|
let mut dump = DumpReader::open(dump).unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// top level infos
|
|
|
|
insta::assert_display_snapshot!(dump.date().unwrap(), @"2022-10-04 15:55:10.344982459 +00:00:00");
|
|
|
|
insta::assert_display_snapshot!(dump.instance_uid().unwrap().unwrap(), @"9e15e977-f2ae-4761-943f-1eaf75fd736d");
|
|
|
|
|
|
|
|
// tasks
|
2022-10-19 18:13:42 +08:00
|
|
|
let tasks = dump.tasks().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
let (tasks, update_files): (Vec<_>, Vec<_>) = tasks.into_iter().unzip();
|
2023-01-02 23:13:44 +08:00
|
|
|
meili_snap::snapshot_hash!(meili_snap::json_string!(tasks), @"10c673c97f053830aa659876d7aa0b53");
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(update_files.len(), 22);
|
|
|
|
assert!(update_files[0].is_none()); // the dump creation
|
|
|
|
assert!(update_files[1].is_some()); // the enqueued document addition
|
|
|
|
assert!(update_files[2..].iter().all(|u| u.is_none())); // everything already processed
|
|
|
|
|
|
|
|
// keys
|
2022-10-19 18:13:42 +08:00
|
|
|
let keys = dump.keys().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(meili_snap::json_string!(keys), @"c9d2b467fe2fca0b35580d8a999808fb");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// indexes
|
|
|
|
let mut indexes = dump.indexes().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
|
|
|
// the index are not ordered in any way by default
|
|
|
|
indexes.sort_by_key(|index| index.metadata().uid.to_string());
|
|
|
|
|
|
|
|
let mut products = indexes.pop().unwrap();
|
|
|
|
let mut movies = indexes.pop().unwrap();
|
|
|
|
let mut spells = indexes.pop().unwrap();
|
|
|
|
assert!(indexes.is_empty());
|
|
|
|
|
|
|
|
// products
|
2023-01-05 16:44:53 +08:00
|
|
|
insta::assert_json_snapshot!(products.metadata(), @r###"
|
2022-10-11 02:17:14 +08:00
|
|
|
{
|
|
|
|
"uid": "products",
|
|
|
|
"primaryKey": "sku",
|
2023-01-05 16:44:53 +08:00
|
|
|
"createdAt": "2022-10-04T15:51:35.939396731Z",
|
|
|
|
"updatedAt": "2022-10-04T15:55:01.897325373Z"
|
2022-10-11 02:17:14 +08:00
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(products.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = products.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 10);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"b01c8371aea4c7171af0d4d846a2bdca");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// movies
|
2023-01-05 16:44:53 +08:00
|
|
|
insta::assert_json_snapshot!(movies.metadata(), @r###"
|
2022-10-11 02:17:14 +08:00
|
|
|
{
|
|
|
|
"uid": "movies",
|
|
|
|
"primaryKey": "id",
|
2023-01-05 16:44:53 +08:00
|
|
|
"createdAt": "2022-10-04T15:51:35.291992167Z",
|
|
|
|
"updatedAt": "2022-10-04T15:55:10.33561842Z"
|
2022-10-11 02:17:14 +08:00
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(movies.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = movies.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 200);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"e962baafd2fbae4cdd14e876053b0c5a");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// spells
|
2023-01-05 16:44:53 +08:00
|
|
|
insta::assert_json_snapshot!(spells.metadata(), @r###"
|
2022-10-11 02:17:14 +08:00
|
|
|
{
|
|
|
|
"uid": "dnd_spells",
|
|
|
|
"primaryKey": "index",
|
2023-01-05 16:44:53 +08:00
|
|
|
"createdAt": "2022-10-04T15:51:37.381094632Z",
|
|
|
|
"updatedAt": "2022-10-04T15:55:02.394503431Z"
|
2022-10-11 02:17:14 +08:00
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(spells.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = spells.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 10);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"235016433dd04262c7f2da01d1e808ce");
|
2022-10-11 02:17:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn import_dump_v4() {
|
|
|
|
let dump = File::open("tests/assets/v4.dump").unwrap();
|
2022-10-13 22:21:54 +08:00
|
|
|
let mut dump = DumpReader::open(dump).unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// top level infos
|
|
|
|
insta::assert_display_snapshot!(dump.date().unwrap(), @"2022-10-06 12:53:49.131989609 +00:00:00");
|
|
|
|
insta::assert_display_snapshot!(dump.instance_uid().unwrap().unwrap(), @"9e15e977-f2ae-4761-943f-1eaf75fd736d");
|
|
|
|
|
|
|
|
// tasks
|
2022-10-19 18:13:42 +08:00
|
|
|
let tasks = dump.tasks().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
let (tasks, update_files): (Vec<_>, Vec<_>) = tasks.into_iter().unzip();
|
2023-01-05 17:19:19 +08:00
|
|
|
meili_snap::snapshot_hash!(meili_snap::json_string!(tasks), @"12eca43d5d1e1f334200eb4df653b0c9");
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(update_files.len(), 10);
|
|
|
|
assert!(update_files[0].is_some()); // the enqueued document addition
|
|
|
|
assert!(update_files[1..].iter().all(|u| u.is_none())); // everything already processed
|
|
|
|
|
|
|
|
// keys
|
2022-10-19 18:13:42 +08:00
|
|
|
let keys = dump.keys().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
|
|
|
meili_snap::snapshot_hash!(meili_snap::json_string!(keys, { "[].uid" => "[uuid]" }), @"d751713988987e9331980363e24189ce");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// indexes
|
|
|
|
let mut indexes = dump.indexes().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
|
|
|
// the index are not ordered in any way by default
|
|
|
|
indexes.sort_by_key(|index| index.metadata().uid.to_string());
|
|
|
|
|
|
|
|
let mut products = indexes.pop().unwrap();
|
|
|
|
let mut movies = indexes.pop().unwrap();
|
|
|
|
let mut spells = indexes.pop().unwrap();
|
|
|
|
assert!(indexes.is_empty());
|
|
|
|
|
|
|
|
// products
|
2022-12-06 01:15:29 +08:00
|
|
|
insta::assert_json_snapshot!(products.metadata(), @r###"
|
2022-10-11 02:17:14 +08:00
|
|
|
{
|
|
|
|
"uid": "products",
|
|
|
|
"primaryKey": "sku",
|
2022-12-06 01:15:29 +08:00
|
|
|
"createdAt": "2022-10-06T12:53:39.360187055Z",
|
|
|
|
"updatedAt": "2022-10-06T12:53:40.603035979Z"
|
2022-10-11 02:17:14 +08:00
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(products.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = products.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 10);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"b01c8371aea4c7171af0d4d846a2bdca");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// movies
|
2022-12-06 01:15:29 +08:00
|
|
|
insta::assert_json_snapshot!(movies.metadata(), @r###"
|
2022-10-11 02:17:14 +08:00
|
|
|
{
|
|
|
|
"uid": "movies",
|
|
|
|
"primaryKey": "id",
|
2022-12-06 01:15:29 +08:00
|
|
|
"createdAt": "2022-10-06T12:53:38.710611568Z",
|
|
|
|
"updatedAt": "2022-10-06T12:53:49.785862546Z"
|
2022-10-11 02:17:14 +08:00
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(movies.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = movies.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 110);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"786022a66ecb992c8a2a60fee070a5ab");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// spells
|
2022-12-06 01:15:29 +08:00
|
|
|
insta::assert_json_snapshot!(spells.metadata(), @r###"
|
2022-10-11 02:17:14 +08:00
|
|
|
{
|
|
|
|
"uid": "dnd_spells",
|
|
|
|
"primaryKey": "index",
|
2022-12-06 01:15:29 +08:00
|
|
|
"createdAt": "2022-10-06T12:53:40.831649057Z",
|
|
|
|
"updatedAt": "2022-10-06T12:53:41.116036186Z"
|
2022-10-11 02:17:14 +08:00
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(spells.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = spells.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 10);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"235016433dd04262c7f2da01d1e808ce");
|
2022-10-11 02:17:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn import_dump_v3() {
|
|
|
|
let dump = File::open("tests/assets/v3.dump").unwrap();
|
2022-10-13 22:21:54 +08:00
|
|
|
let mut dump = DumpReader::open(dump).unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// top level infos
|
|
|
|
insta::assert_display_snapshot!(dump.date().unwrap(), @"2022-10-07 11:39:03.709153554 +00:00:00");
|
|
|
|
assert_eq!(dump.instance_uid().unwrap(), None);
|
|
|
|
|
|
|
|
// tasks
|
2022-10-19 18:13:42 +08:00
|
|
|
let tasks = dump.tasks().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
let (tasks, update_files): (Vec<_>, Vec<_>) = tasks.into_iter().unzip();
|
2023-01-05 17:19:19 +08:00
|
|
|
meili_snap::snapshot_hash!(meili_snap::json_string!(tasks), @"2f51c6345fabccf47b18c82bad618ffe");
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(update_files.len(), 10);
|
|
|
|
assert!(update_files[0].is_some()); // the enqueued document addition
|
|
|
|
assert!(update_files[1..].iter().all(|u| u.is_none())); // everything already processed
|
|
|
|
|
|
|
|
// keys
|
2022-10-19 18:13:42 +08:00
|
|
|
let keys = dump.keys().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(meili_snap::json_string!(keys), @"d751713988987e9331980363e24189ce");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// indexes
|
|
|
|
let mut indexes = dump.indexes().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
|
|
|
// the index are not ordered in any way by default
|
|
|
|
indexes.sort_by_key(|index| index.metadata().uid.to_string());
|
|
|
|
|
|
|
|
let mut products = indexes.pop().unwrap();
|
|
|
|
let mut movies2 = indexes.pop().unwrap();
|
|
|
|
let mut movies = indexes.pop().unwrap();
|
|
|
|
let mut spells = indexes.pop().unwrap();
|
|
|
|
assert!(indexes.is_empty());
|
|
|
|
|
|
|
|
// products
|
|
|
|
insta::assert_json_snapshot!(products.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
|
|
|
{
|
|
|
|
"uid": "products",
|
|
|
|
"primaryKey": "sku",
|
|
|
|
"createdAt": "[now]",
|
|
|
|
"updatedAt": "[now]"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(products.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = products.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 10);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"548284a84de510f71e88e6cdea495cf5");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// movies
|
|
|
|
insta::assert_json_snapshot!(movies.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
|
|
|
{
|
|
|
|
"uid": "movies",
|
|
|
|
"primaryKey": "id",
|
|
|
|
"createdAt": "[now]",
|
|
|
|
"updatedAt": "[now]"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(movies.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = movies.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 110);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"d153b5a81d8b3cdcbe1dec270b574022");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// movies2
|
|
|
|
insta::assert_json_snapshot!(movies2.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
|
|
|
{
|
|
|
|
"uid": "movies_2",
|
|
|
|
"primaryKey": null,
|
|
|
|
"createdAt": "[now]",
|
|
|
|
"updatedAt": "[now]"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(movies2.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = movies2.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 0);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"d751713988987e9331980363e24189ce");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// spells
|
|
|
|
insta::assert_json_snapshot!(spells.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
|
|
|
{
|
|
|
|
"uid": "dnd_spells",
|
|
|
|
"primaryKey": "index",
|
|
|
|
"createdAt": "[now]",
|
|
|
|
"updatedAt": "[now]"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(spells.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = spells.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 10);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"235016433dd04262c7f2da01d1e808ce");
|
2022-10-11 02:17:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn import_dump_v2() {
|
|
|
|
let dump = File::open("tests/assets/v2.dump").unwrap();
|
2022-10-13 22:21:54 +08:00
|
|
|
let mut dump = DumpReader::open(dump).unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// top level infos
|
|
|
|
insta::assert_display_snapshot!(dump.date().unwrap(), @"2022-10-09 20:27:59.904096267 +00:00:00");
|
|
|
|
assert_eq!(dump.instance_uid().unwrap(), None);
|
|
|
|
|
|
|
|
// tasks
|
2022-10-19 18:13:42 +08:00
|
|
|
let tasks = dump.tasks().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
let (tasks, update_files): (Vec<_>, Vec<_>) = tasks.into_iter().unzip();
|
2023-01-05 17:19:19 +08:00
|
|
|
meili_snap::snapshot_hash!(meili_snap::json_string!(tasks), @"b27292d0bb86d4b4dd1b375a46b33890");
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(update_files.len(), 9);
|
|
|
|
assert!(update_files[0].is_some()); // the enqueued document addition
|
|
|
|
assert!(update_files[1..].iter().all(|u| u.is_none())); // everything already processed
|
|
|
|
|
|
|
|
// keys
|
2022-10-19 18:13:42 +08:00
|
|
|
let keys = dump.keys().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(meili_snap::json_string!(keys), @"d751713988987e9331980363e24189ce");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// indexes
|
|
|
|
let mut indexes = dump.indexes().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
|
|
|
// the index are not ordered in any way by default
|
|
|
|
indexes.sort_by_key(|index| index.metadata().uid.to_string());
|
|
|
|
|
|
|
|
let mut products = indexes.pop().unwrap();
|
|
|
|
let mut movies2 = indexes.pop().unwrap();
|
|
|
|
let mut movies = indexes.pop().unwrap();
|
|
|
|
let mut spells = indexes.pop().unwrap();
|
|
|
|
assert!(indexes.is_empty());
|
|
|
|
|
|
|
|
// products
|
|
|
|
insta::assert_json_snapshot!(products.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
|
|
|
{
|
|
|
|
"uid": "products",
|
|
|
|
"primaryKey": "sku",
|
|
|
|
"createdAt": "[now]",
|
|
|
|
"updatedAt": "[now]"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(products.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = products.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 10);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"548284a84de510f71e88e6cdea495cf5");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// movies
|
|
|
|
insta::assert_json_snapshot!(movies.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
|
|
|
{
|
|
|
|
"uid": "movies",
|
|
|
|
"primaryKey": "id",
|
|
|
|
"createdAt": "[now]",
|
|
|
|
"updatedAt": "[now]"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(movies.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = movies.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 110);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"d153b5a81d8b3cdcbe1dec270b574022");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// movies2
|
|
|
|
insta::assert_json_snapshot!(movies2.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
|
|
|
{
|
|
|
|
"uid": "movies_2",
|
|
|
|
"primaryKey": null,
|
|
|
|
"createdAt": "[now]",
|
|
|
|
"updatedAt": "[now]"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(movies2.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = movies2.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 0);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"d751713988987e9331980363e24189ce");
|
2022-10-11 02:17:14 +08:00
|
|
|
|
|
|
|
// spells
|
|
|
|
insta::assert_json_snapshot!(spells.metadata(), { ".createdAt" => "[now]", ".updatedAt" => "[now]" }, @r###"
|
|
|
|
{
|
|
|
|
"uid": "dnd_spells",
|
|
|
|
"primaryKey": "index",
|
|
|
|
"createdAt": "[now]",
|
|
|
|
"updatedAt": "[now]"
|
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
2022-11-23 23:52:19 +08:00
|
|
|
insta::assert_json_snapshot!(spells.settings().unwrap());
|
2022-10-21 00:00:07 +08:00
|
|
|
let documents = spells.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
2022-10-11 02:17:14 +08:00
|
|
|
assert_eq!(documents.len(), 10);
|
2022-10-13 22:03:23 +08:00
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"235016433dd04262c7f2da01d1e808ce");
|
2022-10-11 02:17:14 +08:00
|
|
|
}
|
2022-12-01 21:01:52 +08:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn import_dump_v1() {
|
|
|
|
let dump = File::open("tests/assets/v1.dump").unwrap();
|
|
|
|
let mut dump = DumpReader::open(dump).unwrap();
|
|
|
|
|
|
|
|
// top level infos
|
|
|
|
assert_eq!(dump.date(), None);
|
|
|
|
assert_eq!(dump.instance_uid().unwrap(), None);
|
|
|
|
|
|
|
|
// tasks
|
|
|
|
let tasks = dump.tasks().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
|
|
|
let (tasks, update_files): (Vec<_>, Vec<_>) = tasks.into_iter().unzip();
|
2023-01-02 23:13:44 +08:00
|
|
|
meili_snap::snapshot_hash!(meili_snap::json_string!(tasks), @"9725ccfceea3f8d5846c44006c9e1e7b");
|
2022-12-01 21:01:52 +08:00
|
|
|
assert_eq!(update_files.len(), 9);
|
|
|
|
assert!(update_files[..].iter().all(|u| u.is_none())); // no update file in dump v1
|
|
|
|
|
|
|
|
// keys
|
|
|
|
let keys = dump.keys().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
|
|
|
meili_snap::snapshot!(meili_snap::json_string!(keys), @"[]");
|
|
|
|
meili_snap::snapshot_hash!(meili_snap::json_string!(keys), @"d751713988987e9331980363e24189ce");
|
|
|
|
|
|
|
|
// indexes
|
|
|
|
let mut indexes = dump.indexes().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
|
|
|
// the index are not ordered in any way by default
|
|
|
|
indexes.sort_by_key(|index| index.metadata().uid.to_string());
|
|
|
|
|
|
|
|
let mut products = indexes.pop().unwrap();
|
|
|
|
let mut movies = indexes.pop().unwrap();
|
|
|
|
let mut spells = indexes.pop().unwrap();
|
|
|
|
assert!(indexes.is_empty());
|
|
|
|
|
|
|
|
// products
|
2022-12-06 00:05:37 +08:00
|
|
|
insta::assert_json_snapshot!(products.metadata(), @r###"
|
2022-12-01 21:01:52 +08:00
|
|
|
{
|
|
|
|
"uid": "products",
|
|
|
|
"primaryKey": "sku",
|
2022-12-06 00:05:37 +08:00
|
|
|
"createdAt": "2022-10-02T13:23:39.976870431Z",
|
|
|
|
"updatedAt": "2022-10-02T13:27:54.353262482Z"
|
2022-12-01 21:01:52 +08:00
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
|
|
|
insta::assert_json_snapshot!(products.settings().unwrap());
|
|
|
|
let documents = products.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
|
|
|
assert_eq!(documents.len(), 10);
|
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"b01c8371aea4c7171af0d4d846a2bdca");
|
|
|
|
|
|
|
|
// movies
|
2022-12-06 00:05:37 +08:00
|
|
|
insta::assert_json_snapshot!(movies.metadata(), @r###"
|
2022-12-01 21:01:52 +08:00
|
|
|
{
|
|
|
|
"uid": "movies",
|
|
|
|
"primaryKey": "id",
|
2022-12-06 00:05:37 +08:00
|
|
|
"createdAt": "2022-10-02T13:15:29.477512777Z",
|
|
|
|
"updatedAt": "2022-10-02T13:21:12.671204856Z"
|
2022-12-01 21:01:52 +08:00
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
|
|
|
insta::assert_json_snapshot!(movies.settings().unwrap());
|
|
|
|
let documents = movies.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
|
|
|
assert_eq!(documents.len(), 10);
|
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"b63dbed5bbc059f3e32bc471ae699bf5");
|
|
|
|
|
|
|
|
// spells
|
2022-12-06 00:05:37 +08:00
|
|
|
insta::assert_json_snapshot!(spells.metadata(), @r###"
|
2022-12-01 21:01:52 +08:00
|
|
|
{
|
|
|
|
"uid": "dnd_spells",
|
|
|
|
"primaryKey": "index",
|
2022-12-06 00:05:37 +08:00
|
|
|
"createdAt": "2022-10-02T13:38:26.358882984Z",
|
|
|
|
"updatedAt": "2022-10-02T13:38:26.385609433Z"
|
2022-12-01 21:01:52 +08:00
|
|
|
}
|
|
|
|
"###);
|
|
|
|
|
|
|
|
insta::assert_json_snapshot!(spells.settings().unwrap());
|
|
|
|
let documents = spells.documents().unwrap().collect::<Result<Vec<_>>>().unwrap();
|
|
|
|
assert_eq!(documents.len(), 10);
|
|
|
|
meili_snap::snapshot_hash!(format!("{:#?}", documents), @"aa24c0cfc733d66c396237ad44263bed");
|
|
|
|
}
|
2022-10-11 02:17:14 +08:00
|
|
|
}
|