Skip to main content

ferro_cli/doctor/
registry.rs

1//! Registry of doctor checks.
2
3use super::check::DoctorCheck;
4use super::checks::{
5    CopyDirsDockerignoreCollisionCheck, DatabaseUrlSqliteInProdCheck, DbConnectionCheck,
6    DeployEnvParityCheck, DirtyGitTreeCheck, DockerTemplateDriftCheck, GeneratedArtifactsCheck,
7    LocalEnvParityCheck, MigrationsCheck, ToolchainCheck,
8};
9
10/// Returns the canonical ordered list of checks:
11/// toolchain_match → db_connection → migrations_pending → local_env_parity →
12/// deploy_env_parity → copy_dirs_dockerignore_collision →
13/// docker_template_drift → generated_artifacts → database_url_sqlite_in_prod →
14/// git_clean_and_pushed.
15pub fn default_checks() -> Vec<Box<dyn DoctorCheck>> {
16    vec![
17        Box::new(ToolchainCheck),
18        Box::new(DbConnectionCheck),
19        Box::new(MigrationsCheck),
20        Box::new(LocalEnvParityCheck),
21        Box::new(DeployEnvParityCheck),
22        Box::new(CopyDirsDockerignoreCollisionCheck),
23        Box::new(DockerTemplateDriftCheck),
24        Box::new(GeneratedArtifactsCheck),
25        Box::new(DatabaseUrlSqliteInProdCheck),
26        Box::new(DirtyGitTreeCheck),
27    ]
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    #[test]
35    fn default_checks_returns_ten_in_declared_order() {
36        let checks = default_checks();
37        assert_eq!(checks.len(), 10);
38        let names: Vec<&'static str> = checks.iter().map(|c| c.name()).collect();
39        assert_eq!(
40            names,
41            vec![
42                "toolchain_match",
43                "db_connection",
44                "migrations_pending",
45                "local_env_parity",
46                "deploy_env_parity",
47                "copy_dirs_dockerignore_collision",
48                "docker_template_drift",
49                "generated_artifacts",
50                "database_url_sqlite_in_prod",
51                "git_clean_and_pushed",
52            ]
53        );
54    }
55
56    #[test]
57    fn deploy_category_filter_returns_two() {
58        use crate::doctor::check::CheckCategory;
59        let checks = default_checks();
60        let deploy: Vec<&'static str> = checks
61            .iter()
62            .filter(|c| c.category() == CheckCategory::Deploy)
63            .map(|c| c.name())
64            .collect();
65        assert_eq!(
66            deploy,
67            vec!["copy_dirs_dockerignore_collision", "docker_template_drift"]
68        );
69    }
70}