libobs-bootstrapper 0.4.0

Downloads OBS binaries at runtime and bootstraps libobs
#[cfg(test)]
mod tests {
    use libobs::LIBOBS_API_MAJOR_VER;

    use crate::{
        download::select_latest_compatible_release, github_types::Root2, options::UpdateTargetMode,
    };

    fn release(tag_name: &str, draft: bool, prerelease: bool) -> Root2 {
        Root2 {
            tag_name: tag_name.to_string(),
            draft,
            prerelease,
            ..Default::default()
        }
    }

    #[test]
    fn test_select_latest_compatible_release_same_major_picks_highest_minor_patch() {
        let major = LIBOBS_API_MAJOR_VER;
        let releases = vec![
            release(&format!("obs-build-{}.1.5", major), false, false),
            release(&format!("obs-build-{}.9.1", major), false, false),
            release(&format!("obs-build-{}.7.10", major), false, false),
        ];

        let (_, version) = select_latest_compatible_release(
            &releases,
            UpdateTargetMode::LatestCompatibleSameMajor,
        )
        .unwrap();

        assert_eq!(version.major, major as u64);
        assert_eq!(version.minor, 9);
        assert_eq!(version.patch, 1);
    }

    #[test]
    fn test_select_latest_compatible_release_same_major_minor_filters_minor() {
        let major = LIBOBS_API_MAJOR_VER;
        let target_minor = libobs::LIBOBS_API_MINOR_VER;

        let releases = vec![
            release(
                &format!("obs-build-{}.{}.1", major, target_minor),
                false,
                false,
            ),
            release(
                &format!("obs-build-{}.{}.9", major, target_minor),
                false,
                false,
            ),
            release(&format!("obs-build-{}.99.99", major), false, false),
        ];

        let (_, version) = select_latest_compatible_release(
            &releases,
            UpdateTargetMode::LatestCompatibleSameMajorMinor,
        )
        .unwrap();

        assert_eq!(version.major, major as u64);
        assert_eq!(version.minor, target_minor as u64);
        assert_eq!(version.patch, 9);
    }

    #[test]
    fn test_select_latest_compatible_release_ignores_drafts_and_prereleases() {
        let major = LIBOBS_API_MAJOR_VER;
        let releases = vec![
            release(&format!("obs-build-{}.8.1", major), true, false),
            release(&format!("obs-build-{}.9.1", major), false, true),
            release(&format!("obs-build-{}.7.5", major), false, false),
        ];

        let (_, version) = select_latest_compatible_release(
            &releases,
            UpdateTargetMode::LatestCompatibleSameMajor,
        )
        .unwrap();

        assert_eq!(version.major, major as u64);
        assert_eq!(version.minor, 7);
        assert_eq!(version.patch, 5);
    }

    #[test]
    fn test_select_latest_compatible_release_errors_when_none_match() {
        let incompatible_major = LIBOBS_API_MAJOR_VER as u64 + 1;
        let releases = vec![release(
            &format!("obs-build-{}.0.0", incompatible_major),
            false,
            false,
        )];

        let result = select_latest_compatible_release(
            &releases,
            UpdateTargetMode::LatestCompatibleSameMajor,
        );

        assert!(result.is_err());
    }
}