extension_tests.rs

  1use std::collections::BTreeSet;
  2use std::sync::Arc;
  3
  4use cloud_api_types::{ExtensionMetadata, ExtensionProvides};
  5use collab::db::Database;
  6use collab::db::ExtensionVersionConstraints;
  7use collab::db::{NewExtensionVersion, queries::extensions::convert_time_to_chrono};
  8
  9use crate::test_both_dbs;
 10
 11test_both_dbs!(
 12    test_extensions_by_id,
 13    test_extensions_by_id_postgres,
 14    test_extensions_by_id_sqlite
 15);
 16
 17async fn test_extensions_by_id(db: &Arc<Database>) {
 18    let versions = db.get_known_extension_versions().await.unwrap();
 19    assert!(versions.is_empty());
 20
 21    let t0 = time::OffsetDateTime::from_unix_timestamp_nanos(0).unwrap();
 22    let t0 = time::PrimitiveDateTime::new(t0.date(), t0.time());
 23
 24    let t0_chrono = convert_time_to_chrono(t0);
 25
 26    db.insert_extension_versions(
 27        &[
 28            (
 29                "ext1",
 30                vec![
 31                    NewExtensionVersion {
 32                        name: "Extension 1".into(),
 33                        version: semver::Version::parse("0.0.1").unwrap(),
 34                        description: "an extension".into(),
 35                        authors: vec!["max".into()],
 36                        repository: "ext1/repo".into(),
 37                        schema_version: 1,
 38                        wasm_api_version: Some("0.0.4".into()),
 39                        provides: BTreeSet::from_iter([
 40                            ExtensionProvides::Grammars,
 41                            ExtensionProvides::Languages,
 42                        ]),
 43                        published_at: t0,
 44                    },
 45                    NewExtensionVersion {
 46                        name: "Extension 1".into(),
 47                        version: semver::Version::parse("0.0.2").unwrap(),
 48                        description: "a good extension".into(),
 49                        authors: vec!["max".into()],
 50                        repository: "ext1/repo".into(),
 51                        schema_version: 1,
 52                        wasm_api_version: Some("0.0.4".into()),
 53                        provides: BTreeSet::from_iter([
 54                            ExtensionProvides::Grammars,
 55                            ExtensionProvides::Languages,
 56                            ExtensionProvides::LanguageServers,
 57                        ]),
 58                        published_at: t0,
 59                    },
 60                    NewExtensionVersion {
 61                        name: "Extension 1".into(),
 62                        version: semver::Version::parse("0.0.3").unwrap(),
 63                        description: "a real good extension".into(),
 64                        authors: vec!["max".into(), "marshall".into()],
 65                        repository: "ext1/repo".into(),
 66                        schema_version: 1,
 67                        wasm_api_version: Some("0.0.5".into()),
 68                        provides: BTreeSet::from_iter([
 69                            ExtensionProvides::Grammars,
 70                            ExtensionProvides::Languages,
 71                            ExtensionProvides::LanguageServers,
 72                        ]),
 73                        published_at: t0,
 74                    },
 75                ],
 76            ),
 77            (
 78                "ext2",
 79                vec![NewExtensionVersion {
 80                    name: "Extension 2".into(),
 81                    version: semver::Version::parse("0.2.0").unwrap(),
 82                    description: "a great extension".into(),
 83                    authors: vec!["marshall".into()],
 84                    repository: "ext2/repo".into(),
 85                    schema_version: 0,
 86                    wasm_api_version: None,
 87                    provides: BTreeSet::default(),
 88                    published_at: t0,
 89                }],
 90            ),
 91        ]
 92        .into_iter()
 93        .collect(),
 94    )
 95    .await
 96    .unwrap();
 97
 98    let extensions = db
 99        .get_extensions_by_ids(
100            &["ext1"],
101            Some(&ExtensionVersionConstraints {
102                schema_versions: 1..=1,
103                wasm_api_versions: "0.0.1".parse().unwrap()..="0.0.4".parse().unwrap(),
104            }),
105        )
106        .await
107        .unwrap();
108
109    assert_eq!(
110        extensions,
111        &[ExtensionMetadata {
112            id: "ext1".into(),
113            manifest: cloud_api_types::ExtensionApiManifest {
114                name: "Extension 1".into(),
115                version: "0.0.2".into(),
116                authors: vec!["max".into()],
117                description: Some("a good extension".into()),
118                repository: "ext1/repo".into(),
119                schema_version: Some(1),
120                wasm_api_version: Some("0.0.4".into()),
121                provides: BTreeSet::from_iter([
122                    ExtensionProvides::Grammars,
123                    ExtensionProvides::Languages,
124                    ExtensionProvides::LanguageServers,
125                ]),
126            },
127            published_at: t0_chrono,
128            download_count: 0,
129        }]
130    );
131}