Skip to content

Commit 751ce5d

Browse files
committed
test in app
Signed-off-by: Aminu Oluwaseun Joshua <[email protected]>
1 parent decf0cc commit 751ce5d

File tree

4 files changed

+90
-47
lines changed

4 files changed

+90
-47
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/app/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ spin-serde = { path = "../serde" }
1313
thiserror = { workspace = true }
1414

1515
[dev-dependencies]
16+
spin-manifest = { path = "../manifest" }
1617
toml = { workspace = true }
17-
tokio = { workspace = true }
18+
tokio = { workspace = true }

crates/app/src/lib.rs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,3 +341,90 @@ pub fn retain_components(
341341
) -> Result<LockedApp> {
342342
App::new("unused", locked).retain_components(components, validators)
343343
}
344+
345+
#[cfg(test)]
346+
mod test {
347+
use std::collections::HashSet;
348+
349+
use spin_manifest::schema::v2::{self, ComponentSpec, Trigger};
350+
351+
use super::*;
352+
353+
fn locked_trigger(
354+
trigger_type: String,
355+
mut trigger: v2::Trigger,
356+
) -> anyhow::Result<LockedTrigger> {
357+
fn reference_id(spec: v2::ComponentSpec) -> toml::Value {
358+
let v2::ComponentSpec::Reference(id) = spec else {
359+
unreachable!("should have already been normalized");
360+
};
361+
id.as_ref().into()
362+
}
363+
364+
if let Some(id) = trigger.component.map(reference_id) {
365+
trigger.config.insert("component".into(), id);
366+
}
367+
368+
Ok(LockedTrigger {
369+
id: trigger.id,
370+
trigger_type,
371+
trigger_config: trigger.config.try_into()?,
372+
})
373+
}
374+
375+
pub fn locked_app() -> LockedApp {
376+
LockedApp {
377+
spin_lock_version: Default::default(),
378+
must_understand: Default::default(),
379+
metadata: Default::default(),
380+
host_requirements: Default::default(),
381+
variables: Default::default(),
382+
triggers: vec![locked_trigger(
383+
"http".to_owned(),
384+
Trigger {
385+
id: Default::default(),
386+
component: Some(ComponentSpec::Reference(
387+
"empty".to_string().try_into().unwrap(),
388+
)),
389+
components: Default::default(),
390+
config: Default::default(),
391+
},
392+
)
393+
.unwrap()],
394+
components: vec![LockedComponent {
395+
id: "empty".to_owned(),
396+
metadata: Default::default(),
397+
source: LockedComponentSource {
398+
content_type: "application/wasm".to_owned(),
399+
content: locked::ContentRef {
400+
source: Some("does-not-exist.wasm".to_owned()),
401+
inline: None,
402+
digest: None,
403+
},
404+
},
405+
env: Default::default(),
406+
files: Default::default(),
407+
config: Default::default(),
408+
dependencies: Default::default(),
409+
host_requirements: Default::default(),
410+
}],
411+
}
412+
}
413+
414+
fn does_nothing_validator(_: &App, _: &[&str]) -> anyhow::Result<()> {
415+
Ok(())
416+
}
417+
418+
#[tokio::test]
419+
async fn test_retain_components_filtering_for_only_component_works() {
420+
let mut locked_app = locked_app();
421+
locked_app = retain_components(locked_app, &["empty"], &[&does_nothing_validator]).unwrap();
422+
let components = locked_app
423+
.components
424+
.iter()
425+
.map(|c| c.id.to_string())
426+
.collect::<HashSet<_>>();
427+
assert!(components.contains("empty"));
428+
assert!(components.len() == 1);
429+
}
430+
}

crates/loader/src/lib.rs

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -91,49 +91,3 @@ fn single_file_manifest(
9191

9292
Ok(manifest)
9393
}
94-
95-
#[cfg(test)]
96-
mod test {
97-
use std::collections::HashSet;
98-
99-
use spin_app::{retain_components, App};
100-
101-
use super::*;
102-
103-
pub async fn build_locked_app(manifest: &toml::Table) -> anyhow::Result<LockedApp> {
104-
let toml_str = toml::to_string(manifest).context("failed serializing manifest")?;
105-
let dir = tempfile::tempdir().context("failed creating tempdir")?;
106-
let path = dir.path().join("spin.toml");
107-
std::fs::write(&path, toml_str).context("failed writing manifest")?;
108-
from_file(&path, FilesMountStrategy::Direct, None).await
109-
}
110-
111-
fn does_nothing_validator(_: &App, _: &[&str]) -> anyhow::Result<()> {
112-
Ok(())
113-
}
114-
115-
#[tokio::test]
116-
async fn test_retain_components_filtering_for_only_component_works() {
117-
let manifest = toml::toml! {
118-
spin_manifest_version = 2
119-
120-
[application]
121-
name = "test-app"
122-
123-
[[trigger.test-trigger]]
124-
component = "empty"
125-
126-
[component.empty]
127-
source = "does-not-exist.wasm"
128-
};
129-
let mut locked_app = build_locked_app(&manifest).await.unwrap();
130-
locked_app = retain_components(locked_app, &["empty"], &[&does_nothing_validator]).unwrap();
131-
let components = locked_app
132-
.components
133-
.iter()
134-
.map(|c| c.id.to_string())
135-
.collect::<HashSet<_>>();
136-
assert!(components.contains("empty"));
137-
assert!(components.len() == 1);
138-
}
139-
}

0 commit comments

Comments
 (0)