imessage-database 4.0.0

Parsers and tools to interact with iMessage SQLite data
Documentation
#[cfg(test)]
mod tests {
    use crate::{
        message_types::variants::{CustomBalloon, Tapback, TapbackAction, Variant},
        tables::messages::Message,
    };

    #[test]
    fn test_standard_message() {
        let mut m = Message::blank();
        m.associated_message_type = Some(0);
        assert!(matches!(m.variant(), Variant::Normal));
    }

    #[test]
    fn test_built_in_app_url() {
        let mut m = Message::blank();
        m.associated_message_type = Some(0);
        m.balloon_bundle_id = Some(
            "com.apple.messages.MSMessageExtensionBalloonPlugin:XXX:com.apple.messages.URLBalloonProvider".to_string(),
        );
        assert!(matches!(m.variant(), Variant::App(CustomBalloon::URL)));
    }

    #[test]
    fn test_built_in_app_handwriting() {
        let mut m = Message::blank();
        m.associated_message_type = Some(0);
        m.balloon_bundle_id = Some(
            "com.apple.messages.MSMessageExtensionBalloonPlugin:XXX:com.apple.Handwriting.HandwritingProvider".to_string(),
        );
        assert!(matches!(
            m.variant(),
            Variant::App(CustomBalloon::Handwriting)
        ));
    }

    #[test]
    fn test_built_in_app_find_my() {
        let mut m = Message::blank();
        m.associated_message_type = Some(0);
        m.balloon_bundle_id = Some(
            "com.apple.messages.MSMessageExtensionBalloonPlugin:XXX:com.apple.findmy.FindMyMessagesApp".to_string(),
        );
        assert!(matches!(m.variant(), Variant::App(CustomBalloon::FindMy)));
    }

    #[test]
    fn test_tapback_added_heart() {
        let mut m = Message::blank();
        m.associated_message_type = Some(2000);
        assert!(matches!(
            m.variant(),
            Variant::Tapback(0, TapbackAction::Added, Tapback::Loved)
        ));
    }

    #[test]
    fn test_tapback_removed_like() {
        let mut m = Message::blank();
        m.associated_message_type = Some(3001);
        assert!(matches!(
            m.variant(),
            Variant::Tapback(0, TapbackAction::Removed, Tapback::Liked)
        ));
    }

    #[test]
    fn test_sticker() {
        let mut m = Message::blank();
        m.associated_message_type = Some(1000);
        assert!(matches!(
            m.variant(),
            Variant::Tapback(0, TapbackAction::Added, Tapback::Sticker)
        ));
    }

    #[test]
    fn test_shareplay() {
        let mut m = Message::blank();
        m.item_type = 6;
        assert!(matches!(m.variant(), Variant::SharePlay));
    }

    #[test]
    fn test_custom_emoji_tapback() {
        let mut m = Message::blank();
        m.associated_message_type = Some(2006);
        m.associated_message_emoji = Some("🎉".to_owned());
        assert!(matches!(
            m.variant(),
            Variant::Tapback(0, TapbackAction::Added, Tapback::Emoji(Some("🎉")))
        ));
    }

    #[test]
    fn can_get_variant_third_party_app() {
        let mut m = Message::blank();
        m.associated_message_type = Some(0);
        m.balloon_bundle_id = Some("com.apple.messages.MSMessageExtensionBalloonPlugin:QPU8QS3E62:com.contextoptional.OpenTable.Messages".to_owned());

        assert!(matches!(
            m.variant(),
            Variant::App(CustomBalloon::Application(
                "com.contextoptional.OpenTable.Messages"
            ))
        ));
    }

    #[test]
    fn test_edited_message() {
        let mut m = Message::blank();
        m.date_edited = 1234567890;
        assert!(matches!(m.variant(), Variant::Edited));
    }

    #[test]
    fn test_unknown_type() {
        let mut m = Message::blank();
        m.associated_message_type = Some(9999);
        assert!(matches!(m.variant(), Variant::Unknown(9999)));
    }

    #[test]
    fn test_fitness_app() {
        let mut m = Message::blank();
        m.associated_message_type = Some(0);
        m.balloon_bundle_id = Some(
            "com.apple.messages.MSMessageExtensionBalloonPlugin:XXX:com.apple.ActivityMessagesApp.MessagesExtension".to_string(),
        );
        assert!(matches!(m.variant(), Variant::App(CustomBalloon::Fitness)));
    }

    #[test]
    fn test_apple_pay_app() {
        let mut m = Message::blank();
        m.associated_message_type = Some(0);
        m.balloon_bundle_id = Some(
            "com.apple.messages.MSMessageExtensionBalloonPlugin:XXX:com.apple.PassbookUIService.PeerPaymentMessagesExtension".to_string(),
        );
        assert!(matches!(m.variant(), Variant::App(CustomBalloon::ApplePay)));
    }

    #[test]
    fn test_slideshow_app() {
        let mut m = Message::blank();
        m.associated_message_type = Some(0);
        m.balloon_bundle_id = Some(
            "com.apple.messages.MSMessageExtensionBalloonPlugin:XXX:com.apple.mobileslideshow.PhotosMessagesApp".to_string(),
        );
        assert!(matches!(
            m.variant(),
            Variant::App(CustomBalloon::Slideshow)
        ));
    }

    #[test]
    fn test_check_in_app() {
        let mut m = Message::blank();
        m.associated_message_type = Some(0);
        m.balloon_bundle_id = Some(
            "com.apple.messages.MSMessageExtensionBalloonPlugin:XXX:com.apple.SafetyMonitorApp.SafetyMonitorMessages".to_string(),
        );
        assert!(matches!(m.variant(), Variant::App(CustomBalloon::CheckIn)));
    }

    #[test]
    fn test_digital_touch_app() {
        let mut m = Message::blank();
        m.associated_message_type = Some(0);
        m.balloon_bundle_id = Some(
            "com.apple.messages.MSMessageExtensionBalloonPlugin:XXX:com.apple.DigitalTouchBalloonProvider".to_string(),
        );
        assert!(matches!(
            m.variant(),
            Variant::App(CustomBalloon::DigitalTouch)
        ));
    }

    #[test]
    fn test_removed_custom_emoji_tapback() {
        let mut m = Message::blank();
        m.associated_message_type = Some(3006);
        m.associated_message_emoji = Some("🎉".to_owned());
        assert!(matches!(
            m.variant(),
            Variant::Tapback(0, TapbackAction::Removed, Tapback::Emoji(Some("🎉")))
        ));
    }

    #[test]
    fn test_sticker_reply() {
        let mut m = Message::blank();
        m.associated_message_type = Some(2007);
        assert!(matches!(
            m.variant(),
            Variant::Tapback(0, TapbackAction::Added, Tapback::Sticker)
        ));
    }

    #[test]
    fn test_remove_sticker_reply() {
        let mut m = Message::blank();
        m.associated_message_type = Some(3007);
        assert!(matches!(
            m.variant(),
            Variant::Tapback(0, TapbackAction::Removed, Tapback::Sticker)
        ));
    }
}