firestore-path 1.0.17

A Firestore path helper
Documentation
#![allow(missing_docs)]

use std::{collections::BTreeMap, str::FromStr as _};

use firestore_path::{DatabaseName, DocumentName};
use googleapis_tonic_google_firestore_v1::google::firestore::v1::{
    precondition::ConditionType, BeginTransactionRequest, CreateDocumentRequest,
    DeleteDocumentRequest, Document, Precondition,
};

#[test]
fn test_begin_transaction_request() -> anyhow::Result<()> {
    let s = "projects/my-project/databases/(default)";
    let database_name = DatabaseName::from_str(s)?;

    let request = BeginTransactionRequest {
        database: database_name.to_string(),
        options: None,
    };

    assert_eq!(request.database, s);
    Ok(())
}

#[test]
fn test_create_document_request() -> anyhow::Result<()> {
    for (s, p, c, d) in [
        (
            "projects/my-project/databases/(default)/documents/chatrooms/chatroom1",
            "projects/my-project/databases/(default)/documents",
            "chatrooms",
            "chatroom1",
        ),
        (
            "projects/my-project/databases/(default)/documents/chatrooms/chatroom1/messages/message1",
            "projects/my-project/databases/(default)/documents/chatrooms/chatroom1",
            "messages",
            "message1",
        ),
    ] {
        let document_name = DocumentName::from_str(s)?;

        let request = CreateDocumentRequest {
            parent: document_name
                .parent()
                .parent()
                .map(|parent_document_name| parent_document_name.to_string())
                .unwrap_or_else(|| document_name.root_document_name().to_string()),
            collection_id: document_name.collection_id().to_string(),
            document_id: document_name.document_id().to_string(),
            document: Some(Document {
                name: "".to_string(),
                fields: BTreeMap::new(),
                create_time: None,
                update_time: None,
            }),
            mask: None,
        };

        assert_eq!(request.parent, p);
        assert_eq!(request.collection_id, c);
        assert_eq!(request.document_id, d);
    }

    Ok(())
}

#[test]
fn test_delete_document_request() -> anyhow::Result<()> {
    for s in [
        "projects/my-project/databases/(default)/documents/chatrooms/chatroom1",
        "projects/my-project/databases/(default)/documents/chatrooms/chatroom1/messages/message1",
    ] {
        let document_name = DocumentName::from_str(s)?;

        let request = DeleteDocumentRequest {
            name: document_name.to_string(),
            current_document: Some(Precondition {
                condition_type: Some(ConditionType::Exists(false)),
            }),
        };

        assert_eq!(request.name, s);
    }

    Ok(())
}