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}