chore: cleanups and refactorings for cleaner code
This commit is contained in:
@@ -1,109 +0,0 @@
|
||||
//! App launch smoke tests.
|
||||
//!
|
||||
//! Validates that the core UI types can be constructed
|
||||
//! and that the message routing works at the type level.
|
||||
//!
|
||||
//! NOTE: muda::Menu on macOS requires the actual main thread (not just
|
||||
//! single-threaded test mode). Menu construction and BdsApp::new() cannot
|
||||
//! be tested via `cargo test`. The full smoke test is launching the binary:
|
||||
//! cargo run -p bds-ui
|
||||
|
||||
use bds_core::i18n::UiLocale;
|
||||
use bds_ui::app::Message;
|
||||
use bds_ui::state::navigation::{PanelTab, SidebarView};
|
||||
use bds_ui::state::tabs::{Tab, TabType};
|
||||
use bds_ui::state::toast::ToastLevel;
|
||||
use std::path::PathBuf;
|
||||
|
||||
// ── Smoke: Message enum is well-formed ──
|
||||
|
||||
#[test]
|
||||
fn message_variants_constructable() {
|
||||
let _noop = Message::Noop;
|
||||
let _menu = Message::MenuEvent(muda::MenuId::new("test"));
|
||||
assert!(format!("{:?}", Message::Noop).contains("Noop"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn message_clone_works() {
|
||||
let msg = Message::MenuEvent(muda::MenuId::new("file-open"));
|
||||
let cloned = msg.clone();
|
||||
assert!(format!("{cloned:?}").contains("MenuEvent"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn new_message_variants_constructable() {
|
||||
// Navigation
|
||||
let _view = Message::SetActiveView(SidebarView::Posts);
|
||||
let _toggle_sb = Message::ToggleSidebar;
|
||||
let _toggle_p = Message::TogglePanel;
|
||||
|
||||
// Tabs
|
||||
let tab = Tab {
|
||||
id: "test".to_string(),
|
||||
tab_type: TabType::Post,
|
||||
title: "Test".to_string(),
|
||||
is_transient: false,
|
||||
is_dirty: false,
|
||||
};
|
||||
let _open = Message::OpenTab(tab);
|
||||
let _close = Message::CloseTab("test".into());
|
||||
let _select = Message::SelectTab("test".into());
|
||||
let _pin = Message::PinTab("test".into());
|
||||
|
||||
// Project
|
||||
let _switch = Message::SwitchProject("id".into());
|
||||
let _create = Message::CreateProject {
|
||||
name: "X".into(),
|
||||
data_path: None,
|
||||
};
|
||||
let _delete = Message::DeleteProject("id".into());
|
||||
|
||||
// Dialogs
|
||||
let _folder = Message::FolderPicked(Some(PathBuf::from("/tmp")));
|
||||
let _media = Message::MediaFilesPicked(None);
|
||||
|
||||
// Tasks
|
||||
let _tick = Message::TaskTick;
|
||||
|
||||
// macOS lifecycle
|
||||
let _file = Message::FileOpenRequested(PathBuf::from("/test"));
|
||||
let _url = Message::UrlOpenRequested("bds://open".into());
|
||||
|
||||
// Panel
|
||||
let _panel = Message::SetPanelTab(PanelTab::Output);
|
||||
|
||||
// Settings
|
||||
let _offline = Message::SetOfflineMode(true);
|
||||
let _locale = Message::SetUiLocale(UiLocale::De);
|
||||
let _toggle_locale = Message::ToggleLocaleDropdown;
|
||||
let _toggle_project = Message::ToggleProjectDropdown;
|
||||
let _init_menu = Message::InitMenuBar;
|
||||
|
||||
// Blog actions
|
||||
let _rebuild = Message::RebuildDatabase;
|
||||
let _reindex = Message::ReindexText;
|
||||
let _regen_cal = Message::RegenerateCalendar;
|
||||
let _validate = Message::ValidateTranslations;
|
||||
let _generate = Message::GenerateSite;
|
||||
let _diff = Message::RunMetadataDiff;
|
||||
let _finished = Message::EngineTaskDone {
|
||||
task_id: 1,
|
||||
label: "test".into(),
|
||||
result: Ok("ok".into()),
|
||||
};
|
||||
|
||||
// Toast
|
||||
let _show = Message::ShowToast(ToastLevel::Info, "hello".into());
|
||||
let _dismiss = Message::DismissToast(1);
|
||||
let _expire = Message::ExpireToasts;
|
||||
}
|
||||
|
||||
// ── Smoke: BdsApp type is accessible from integration tests ──
|
||||
|
||||
#[test]
|
||||
fn bds_app_type_is_public() {
|
||||
fn _assert_types() {
|
||||
let _: fn() -> (bds_ui::BdsApp, iced::Task<Message>) = bds_ui::BdsApp::new;
|
||||
}
|
||||
}
|
||||
@@ -4,99 +4,6 @@
|
||||
//! and keyboard shortcut coverage.
|
||||
|
||||
use bds_core::i18n::{UiLocale, translate};
|
||||
use bds_ui::platform::menu::MenuAction;
|
||||
use bds_ui::state::toast::{Toast, ToastLevel};
|
||||
|
||||
// ── Toast system ──
|
||||
|
||||
#[test]
|
||||
fn toast_ids_are_monotonically_increasing() {
|
||||
let a = Toast::new(ToastLevel::Info, "first".into());
|
||||
let b = Toast::new(ToastLevel::Warning, "second".into());
|
||||
let c = Toast::new(ToastLevel::Error, "third".into());
|
||||
assert!(b.id > a.id);
|
||||
assert!(c.id > b.id);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn toast_level_variants() {
|
||||
let info = Toast::new(ToastLevel::Info, "info".into());
|
||||
let success = Toast::new(ToastLevel::Success, "ok".into());
|
||||
let warning = Toast::new(ToastLevel::Warning, "warn".into());
|
||||
let error = Toast::new(ToastLevel::Error, "err".into());
|
||||
|
||||
assert_eq!(info.level, ToastLevel::Info);
|
||||
assert_eq!(success.level, ToastLevel::Success);
|
||||
assert_eq!(warning.level, ToastLevel::Warning);
|
||||
assert_eq!(error.level, ToastLevel::Error);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn fresh_toast_is_not_expired() {
|
||||
let t = Toast::new(ToastLevel::Info, "test".into());
|
||||
assert!(!t.is_expired());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn toast_preserves_message() {
|
||||
let t = Toast::new(ToastLevel::Error, "something failed".into());
|
||||
assert_eq!(t.message, "something failed");
|
||||
}
|
||||
|
||||
// ── Menu enable/disable rules ──
|
||||
// (These test the expected invariants, not the BdsApp method directly,
|
||||
// since BdsApp::new() requires main thread for muda.)
|
||||
|
||||
#[test]
|
||||
fn menu_actions_that_need_project() {
|
||||
let project_actions = [
|
||||
MenuAction::NewPost,
|
||||
MenuAction::ImportMedia,
|
||||
MenuAction::OpenDataFolder,
|
||||
MenuAction::EditMenu,
|
||||
MenuAction::RebuildDatabase,
|
||||
MenuAction::ReindexText,
|
||||
MenuAction::MetadataDiff,
|
||||
MenuAction::RegenerateCalendar,
|
||||
MenuAction::ValidateTranslations,
|
||||
MenuAction::GenerateSitemap,
|
||||
MenuAction::ValidateSite,
|
||||
];
|
||||
// All should have i18n keys
|
||||
for action in &project_actions {
|
||||
let key = action.i18n_key();
|
||||
let label = translate(UiLocale::En, key);
|
||||
assert_ne!(label, key, "missing translation for {key}");
|
||||
}
|
||||
assert_eq!(project_actions.len(), 11);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn menu_actions_that_need_tab() {
|
||||
let tab_actions = [
|
||||
MenuAction::Save,
|
||||
MenuAction::OpenInBrowser,
|
||||
MenuAction::Find,
|
||||
MenuAction::Replace,
|
||||
];
|
||||
for action in &tab_actions {
|
||||
let key = action.i18n_key();
|
||||
let label = translate(UiLocale::En, key);
|
||||
assert_ne!(label, key, "missing translation for {key}");
|
||||
}
|
||||
assert_eq!(tab_actions.len(), 4);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn menu_actions_gated_by_offline() {
|
||||
let online_only = [MenuAction::FillMissingTranslations, MenuAction::UploadSite];
|
||||
for action in &online_only {
|
||||
let key = action.i18n_key();
|
||||
let label = translate(UiLocale::En, key);
|
||||
assert_ne!(label, key, "missing translation for {key}");
|
||||
}
|
||||
assert_eq!(online_only.len(), 2);
|
||||
}
|
||||
|
||||
// ── Dialog i18n ──
|
||||
|
||||
@@ -115,39 +22,6 @@ fn dialog_keys_exist_in_all_locales() {
|
||||
}
|
||||
}
|
||||
|
||||
// ── Keyboard shortcut coverage ──
|
||||
|
||||
#[test]
|
||||
fn accelerator_actions_match_spec() {
|
||||
// M2 spec: these actions must have keyboard shortcuts
|
||||
let accelerated = [
|
||||
MenuAction::NewPost, // Cmd+N
|
||||
MenuAction::ImportMedia, // Cmd+I
|
||||
MenuAction::Save, // Cmd+S
|
||||
MenuAction::Find, // Cmd+F
|
||||
MenuAction::Replace, // Cmd+H
|
||||
MenuAction::EditPreferences, // Cmd+,
|
||||
MenuAction::ViewPosts, // Cmd+1
|
||||
MenuAction::ViewMedia, // Cmd+2
|
||||
MenuAction::ToggleSidebar, // Cmd+B
|
||||
MenuAction::TogglePanel, // Cmd+J
|
||||
MenuAction::PublishSelected, // Cmd+Shift+P
|
||||
MenuAction::PreviewPost, // Cmd+Shift+V
|
||||
MenuAction::GenerateSitemap, // Cmd+R
|
||||
MenuAction::ValidateSite, // Cmd+Shift+L
|
||||
MenuAction::UploadSite, // Cmd+Shift+U
|
||||
];
|
||||
// All must be valid MenuAction variants with i18n keys
|
||||
for action in &accelerated {
|
||||
assert!(!action.i18n_key().is_empty());
|
||||
}
|
||||
assert_eq!(
|
||||
accelerated.len(),
|
||||
15,
|
||||
"M2 spec has 15 accelerator-bound actions"
|
||||
);
|
||||
}
|
||||
|
||||
// ── Toast i18n keys ──
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -28,12 +28,6 @@ fn all_menu_actions_translate_in_all_locales() {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn menu_action_count_matches_spec() {
|
||||
// M2 spec: 28 custom menu actions
|
||||
assert_eq!(MenuAction::ALL.len(), 28);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn no_duplicate_i18n_keys() {
|
||||
let mut keys = std::collections::HashSet::new();
|
||||
|
||||
Reference in New Issue
Block a user