Rename SpecificPackageManager trait PackageManager, add some unit tests
This commit is contained in:
parent
1245db813b
commit
d2ef322761
6 changed files with 380 additions and 46 deletions
|
|
@ -10,35 +10,35 @@ pub mod list;
|
|||
pub use list::{PackageList, IntoPackageList};
|
||||
|
||||
pub mod pacman;
|
||||
use pacman::ArchlinuxPackageManager;
|
||||
use pacman::PacmanManager;
|
||||
pub mod apt;
|
||||
use apt::DebianPackageManager;
|
||||
use apt::AptManager;
|
||||
|
||||
pub mod builder;
|
||||
pub use builder::{PackageArgsBuilder, NoManager};
|
||||
|
||||
pub type PackageStatus = ();
|
||||
|
||||
#[derive(Clone, Debug, Serialize)]
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
|
||||
pub struct PackageArgs {
|
||||
name: PackageList,
|
||||
state: PackageState,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Serialize)]
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
|
||||
pub enum PackageState {
|
||||
Present,
|
||||
Absent,
|
||||
Latest,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub struct PackageModule<Manager> {
|
||||
manager: Manager,
|
||||
args: PackageArgs,
|
||||
}
|
||||
|
||||
impl Module<PackageArgs, (), PackageError> for PackageModule<Box<dyn SpecificPackageManager>> {
|
||||
impl Module<PackageArgs, (), PackageError> for PackageModule<Box<dyn PackageManager>> {
|
||||
fn serialize_args(&self) -> serde_json::Value {
|
||||
serde_json::to_value(&self.args).unwrap()
|
||||
}
|
||||
|
|
@ -62,13 +62,13 @@ impl Module<PackageArgs, (), PackageError> for PackageModule<Box<dyn SpecificPac
|
|||
}
|
||||
}
|
||||
|
||||
impl ModuleSetup<PackageModule<Box<dyn SpecificPackageManager>>, PackageArgs, (), PackageError> for PackageModule<NoManager> {
|
||||
fn with_facts(self, facts: &Facts) -> PackageModule<Box<dyn SpecificPackageManager>> {
|
||||
impl ModuleSetup<PackageModule<Box<dyn PackageManager>>, PackageArgs, (), PackageError> for PackageModule<NoManager> {
|
||||
fn with_facts(self, facts: &Facts) -> PackageModule<Box<dyn PackageManager>> {
|
||||
let Self { args, .. } = self;
|
||||
|
||||
let manager: Box<dyn SpecificPackageManager> = match facts.os.family() {
|
||||
OsFamily::Debian => Box::new(DebianPackageManager),
|
||||
OsFamily::Archlinux => Box::new(ArchlinuxPackageManager),
|
||||
let manager: Box<dyn PackageManager> = match facts.os.family() {
|
||||
OsFamily::Debian => Box::new(AptManager),
|
||||
OsFamily::Archlinux => Box::new(PacmanManager),
|
||||
};
|
||||
|
||||
PackageModule {
|
||||
|
|
@ -97,9 +97,82 @@ impl From<std::io::Error> for PackageError {
|
|||
}
|
||||
}
|
||||
|
||||
pub trait SpecificPackageManager: std::fmt::Debug {
|
||||
pub trait PackageManager: std::fmt::Debug {
|
||||
fn name(&self) -> &'static str;
|
||||
fn update(&self) -> Result<(), PackageError>;
|
||||
fn install(&self, list: PackageList) -> Result<(), PackageError>;
|
||||
fn remove(&self, list: PackageList) -> Result<(), PackageError>;
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn ensure_present() {
|
||||
let pkg = PackageModule::new()
|
||||
.name("hello")
|
||||
.state(PackageState::Present)
|
||||
.with_apt()
|
||||
.build();
|
||||
|
||||
assert_eq!(
|
||||
pkg.serialize_args(),
|
||||
serde_json::json!({
|
||||
"name": vec!("hello"),
|
||||
"state": PackageState::Present,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ensure_present_multi() {
|
||||
let pkg = PackageModule::new()
|
||||
.name(&[ "hello", "sl" ])
|
||||
.state(PackageState::Present)
|
||||
.with_apt()
|
||||
.build();
|
||||
|
||||
assert_eq!(
|
||||
pkg.serialize_args(),
|
||||
serde_json::json!({
|
||||
"name": vec!("hello", "sl"),
|
||||
"state": PackageState::Present,
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ensure_absent() {
|
||||
let pkg = PackageModule::new()
|
||||
.name("hello")
|
||||
.state(PackageState::Absent)
|
||||
.with_apt()
|
||||
.build();
|
||||
|
||||
assert_eq!(
|
||||
pkg.serialize_args(),
|
||||
serde_json::json!({
|
||||
"name": vec!("hello"),
|
||||
"state": PackageState::Absent,
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ensure_absent_multi() {
|
||||
let pkg = PackageModule::new()
|
||||
.name(&[ "hello", "sl" ])
|
||||
.state(PackageState::Absent)
|
||||
.with_apt()
|
||||
.build();
|
||||
|
||||
assert_eq!(
|
||||
pkg.serialize_args(),
|
||||
serde_json::json!({
|
||||
"name": vec!("hello", "sl"),
|
||||
"state": PackageState::Absent,
|
||||
})
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue