test: assert delegated handlers pop exactly one navigation stack frame
test_handler_delegation! asserted only that the current route equalled the base block after Esc. When the delegated block was itself the base block the stack read [base, base], so that assertion held whether or not the sub-handler popped, and the case asserted nothing. Capture the navigation stack depth before delegating and assert it drops by exactly one, which also catches a handler that pops and then re-pushes. Depth is read through a test-only accessor on App; the navigation_stack field stays private. Main tab blocks clear errors on Esc rather than popping, by design, so they cannot be probed this way at all. Drop them from the delegation value lists; the remaining values in each list already exercise the same dispatch arm.
This commit is contained in:
6 files changed
+10
-29
No files matched your search
@@ -371,6 +371,10 @@ impl App<'_> {
|
|||||||
..App::default()
|
..App::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_navigation_stack_depth(&self) -> usize {
|
||||||
|
self.navigation_stack.len()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
|||||||
@@ -333,10 +333,16 @@ mod test_utils {
|
|||||||
let mut app = App::test_default_fully_populated();
|
let mut app = App::test_default_fully_populated();
|
||||||
app.push_navigation_stack($base.into());
|
app.push_navigation_stack($base.into());
|
||||||
app.push_navigation_stack($active_block.into());
|
app.push_navigation_stack($active_block.into());
|
||||||
|
let navigation_stack_depth_before_delegation = app.get_navigation_stack_depth();
|
||||||
|
|
||||||
$handler::new(DEFAULT_KEYBINDINGS.esc.key, &mut app, $active_block, None).handle();
|
$handler::new(DEFAULT_KEYBINDINGS.esc.key, &mut app, $active_block, None).handle();
|
||||||
|
|
||||||
pretty_assertions::assert_eq!(app.get_current_route(), $base.into());
|
pretty_assertions::assert_eq!(app.get_current_route(), $base.into());
|
||||||
|
pretty_assertions::assert_eq!(
|
||||||
|
app.get_navigation_stack_depth(),
|
||||||
|
navigation_stack_depth_before_delegation - 1,
|
||||||
|
"Expected the delegated handler to pop exactly one route off the navigation stack"
|
||||||
|
);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -160,7 +160,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_library_blocks_to_library_handler(
|
fn test_delegates_library_blocks_to_library_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveLidarrBlock::Artists,
|
|
||||||
ActiveLidarrBlock::ArtistsSortPrompt,
|
ActiveLidarrBlock::ArtistsSortPrompt,
|
||||||
ActiveLidarrBlock::FilterArtists,
|
ActiveLidarrBlock::FilterArtists,
|
||||||
ActiveLidarrBlock::FilterArtistsError,
|
ActiveLidarrBlock::FilterArtistsError,
|
||||||
@@ -187,7 +186,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_downloads_blocks_to_downloads_handler(
|
fn test_delegates_downloads_blocks_to_downloads_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveLidarrBlock::Downloads,
|
|
||||||
ActiveLidarrBlock::DeleteDownloadPrompt,
|
ActiveLidarrBlock::DeleteDownloadPrompt,
|
||||||
ActiveLidarrBlock::UpdateDownloadsPrompt
|
ActiveLidarrBlock::UpdateDownloadsPrompt
|
||||||
)]
|
)]
|
||||||
@@ -203,7 +201,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_blocklist_blocks_to_blocklist_handler(
|
fn test_delegates_blocklist_blocks_to_blocklist_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveLidarrBlock::Blocklist,
|
|
||||||
ActiveLidarrBlock::BlocklistItemDetails,
|
ActiveLidarrBlock::BlocklistItemDetails,
|
||||||
ActiveLidarrBlock::DeleteBlocklistItemPrompt,
|
ActiveLidarrBlock::DeleteBlocklistItemPrompt,
|
||||||
ActiveLidarrBlock::BlocklistClearAllItemsPrompt,
|
ActiveLidarrBlock::BlocklistClearAllItemsPrompt,
|
||||||
@@ -221,7 +218,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_history_blocks_to_history_handler(
|
fn test_delegates_history_blocks_to_history_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveLidarrBlock::History,
|
|
||||||
ActiveLidarrBlock::HistoryItemDetails,
|
ActiveLidarrBlock::HistoryItemDetails,
|
||||||
ActiveLidarrBlock::HistorySortPrompt,
|
ActiveLidarrBlock::HistorySortPrompt,
|
||||||
ActiveLidarrBlock::FilterHistory,
|
ActiveLidarrBlock::FilterHistory,
|
||||||
@@ -241,7 +237,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_root_folders_blocks_to_root_folders_handler(
|
fn test_delegates_root_folders_blocks_to_root_folders_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveLidarrBlock::RootFolders,
|
|
||||||
ActiveLidarrBlock::AddRootFolderPrompt,
|
ActiveLidarrBlock::AddRootFolderPrompt,
|
||||||
ActiveLidarrBlock::DeleteRootFolderPrompt
|
ActiveLidarrBlock::DeleteRootFolderPrompt
|
||||||
)]
|
)]
|
||||||
@@ -258,7 +253,6 @@ mod tests {
|
|||||||
fn test_delegates_indexers_blocks_to_indexers_handler(
|
fn test_delegates_indexers_blocks_to_indexers_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveLidarrBlock::DeleteIndexerPrompt,
|
ActiveLidarrBlock::DeleteIndexerPrompt,
|
||||||
ActiveLidarrBlock::Indexers,
|
|
||||||
ActiveLidarrBlock::AllIndexerSettingsPrompt,
|
ActiveLidarrBlock::AllIndexerSettingsPrompt,
|
||||||
ActiveLidarrBlock::IndexerSettingsConfirmPrompt,
|
ActiveLidarrBlock::IndexerSettingsConfirmPrompt,
|
||||||
ActiveLidarrBlock::IndexerSettingsMaximumSizeInput,
|
ActiveLidarrBlock::IndexerSettingsMaximumSizeInput,
|
||||||
@@ -278,7 +272,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_system_blocks_to_system_handler(
|
fn test_delegates_system_blocks_to_system_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveLidarrBlock::System,
|
|
||||||
ActiveLidarrBlock::SystemLogs,
|
ActiveLidarrBlock::SystemLogs,
|
||||||
ActiveLidarrBlock::SystemQueuedEvents,
|
ActiveLidarrBlock::SystemQueuedEvents,
|
||||||
ActiveLidarrBlock::SystemTasks,
|
ActiveLidarrBlock::SystemTasks,
|
||||||
|
|||||||
@@ -123,7 +123,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_system_blocks_to_system_handler(
|
fn test_delegates_system_blocks_to_system_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveRadarrBlock::System,
|
|
||||||
ActiveRadarrBlock::SystemLogs,
|
ActiveRadarrBlock::SystemLogs,
|
||||||
ActiveRadarrBlock::SystemQueuedEvents,
|
ActiveRadarrBlock::SystemQueuedEvents,
|
||||||
ActiveRadarrBlock::SystemTasks,
|
ActiveRadarrBlock::SystemTasks,
|
||||||
@@ -142,7 +141,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_library_blocks_to_library_handler(
|
fn test_delegates_library_blocks_to_library_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveRadarrBlock::Movies,
|
|
||||||
ActiveRadarrBlock::MoviesSortPrompt,
|
ActiveRadarrBlock::MoviesSortPrompt,
|
||||||
ActiveRadarrBlock::SearchMovie,
|
ActiveRadarrBlock::SearchMovie,
|
||||||
ActiveRadarrBlock::SearchMovieError,
|
ActiveRadarrBlock::SearchMovieError,
|
||||||
@@ -186,7 +184,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_collections_blocks_to_collections_handler(
|
fn test_delegates_collections_blocks_to_collections_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveRadarrBlock::Collections,
|
|
||||||
ActiveRadarrBlock::SearchCollection,
|
ActiveRadarrBlock::SearchCollection,
|
||||||
ActiveRadarrBlock::CollectionsSortPrompt,
|
ActiveRadarrBlock::CollectionsSortPrompt,
|
||||||
ActiveRadarrBlock::SearchCollectionError,
|
ActiveRadarrBlock::SearchCollectionError,
|
||||||
@@ -213,7 +210,6 @@ mod tests {
|
|||||||
fn test_delegates_indexers_blocks_to_indexers_handler(
|
fn test_delegates_indexers_blocks_to_indexers_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveRadarrBlock::DeleteIndexerPrompt,
|
ActiveRadarrBlock::DeleteIndexerPrompt,
|
||||||
ActiveRadarrBlock::Indexers,
|
|
||||||
ActiveRadarrBlock::AllIndexerSettingsPrompt,
|
ActiveRadarrBlock::AllIndexerSettingsPrompt,
|
||||||
ActiveRadarrBlock::IndexerSettingsAvailabilityDelayInput,
|
ActiveRadarrBlock::IndexerSettingsAvailabilityDelayInput,
|
||||||
ActiveRadarrBlock::IndexerSettingsConfirmPrompt,
|
ActiveRadarrBlock::IndexerSettingsConfirmPrompt,
|
||||||
@@ -237,7 +233,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_downloads_blocks_to_downloads_handler(
|
fn test_delegates_downloads_blocks_to_downloads_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveRadarrBlock::Downloads,
|
|
||||||
ActiveRadarrBlock::DeleteDownloadPrompt,
|
ActiveRadarrBlock::DeleteDownloadPrompt,
|
||||||
ActiveRadarrBlock::UpdateDownloadsPrompt
|
ActiveRadarrBlock::UpdateDownloadsPrompt
|
||||||
)]
|
)]
|
||||||
@@ -253,7 +248,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_root_folders_blocks_to_root_folders_handler(
|
fn test_delegates_root_folders_blocks_to_root_folders_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveRadarrBlock::RootFolders,
|
|
||||||
ActiveRadarrBlock::AddRootFolderPrompt,
|
ActiveRadarrBlock::AddRootFolderPrompt,
|
||||||
ActiveRadarrBlock::DeleteRootFolderPrompt
|
ActiveRadarrBlock::DeleteRootFolderPrompt
|
||||||
)]
|
)]
|
||||||
@@ -269,7 +263,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_blocklist_blocks_to_blocklist_handler(
|
fn test_delegates_blocklist_blocks_to_blocklist_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveRadarrBlock::Blocklist,
|
|
||||||
ActiveRadarrBlock::BlocklistItemDetails,
|
ActiveRadarrBlock::BlocklistItemDetails,
|
||||||
ActiveRadarrBlock::DeleteBlocklistItemPrompt,
|
ActiveRadarrBlock::DeleteBlocklistItemPrompt,
|
||||||
ActiveRadarrBlock::BlocklistClearAllItemsPrompt,
|
ActiveRadarrBlock::BlocklistClearAllItemsPrompt,
|
||||||
@@ -287,7 +280,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_history_blocks_to_history_handler(
|
fn test_delegates_history_blocks_to_history_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveRadarrBlock::History,
|
|
||||||
ActiveRadarrBlock::HistoryItemDetails,
|
ActiveRadarrBlock::HistoryItemDetails,
|
||||||
ActiveRadarrBlock::HistorySortPrompt,
|
ActiveRadarrBlock::HistorySortPrompt,
|
||||||
ActiveRadarrBlock::FilterHistory,
|
ActiveRadarrBlock::FilterHistory,
|
||||||
|
|||||||
@@ -160,7 +160,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_library_blocks_to_library_handler(
|
fn test_delegates_library_blocks_to_library_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveReadarrBlock::Authors,
|
|
||||||
ActiveReadarrBlock::AuthorsSortPrompt,
|
ActiveReadarrBlock::AuthorsSortPrompt,
|
||||||
ActiveReadarrBlock::FilterAuthors,
|
ActiveReadarrBlock::FilterAuthors,
|
||||||
ActiveReadarrBlock::FilterAuthorsError,
|
ActiveReadarrBlock::FilterAuthorsError,
|
||||||
@@ -180,7 +179,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_blocklist_blocks_to_blocklist_handler(
|
fn test_delegates_blocklist_blocks_to_blocklist_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveReadarrBlock::Blocklist,
|
|
||||||
ActiveReadarrBlock::BlocklistItemDetails,
|
ActiveReadarrBlock::BlocklistItemDetails,
|
||||||
ActiveReadarrBlock::DeleteBlocklistItemPrompt,
|
ActiveReadarrBlock::DeleteBlocklistItemPrompt,
|
||||||
ActiveReadarrBlock::BlocklistClearAllItemsPrompt,
|
ActiveReadarrBlock::BlocklistClearAllItemsPrompt,
|
||||||
@@ -198,7 +196,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_downloads_blocks_to_downloads_handler(
|
fn test_delegates_downloads_blocks_to_downloads_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveReadarrBlock::Downloads,
|
|
||||||
ActiveReadarrBlock::DeleteDownloadPrompt,
|
ActiveReadarrBlock::DeleteDownloadPrompt,
|
||||||
ActiveReadarrBlock::UpdateDownloadsPrompt
|
ActiveReadarrBlock::UpdateDownloadsPrompt
|
||||||
)]
|
)]
|
||||||
@@ -214,7 +211,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_history_blocks_to_history_handler(
|
fn test_delegates_history_blocks_to_history_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveReadarrBlock::History,
|
|
||||||
ActiveReadarrBlock::HistoryItemDetails,
|
ActiveReadarrBlock::HistoryItemDetails,
|
||||||
ActiveReadarrBlock::HistorySortPrompt,
|
ActiveReadarrBlock::HistorySortPrompt,
|
||||||
ActiveReadarrBlock::SearchHistory,
|
ActiveReadarrBlock::SearchHistory,
|
||||||
@@ -234,7 +230,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_root_folders_blocks_to_root_folders_handler(
|
fn test_delegates_root_folders_blocks_to_root_folders_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveReadarrBlock::RootFolders,
|
|
||||||
ActiveReadarrBlock::AddRootFolderPrompt,
|
ActiveReadarrBlock::AddRootFolderPrompt,
|
||||||
ActiveReadarrBlock::DeleteRootFolderPrompt
|
ActiveReadarrBlock::DeleteRootFolderPrompt
|
||||||
)]
|
)]
|
||||||
@@ -250,7 +245,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_indexers_blocks_to_indexers_handler(
|
fn test_delegates_indexers_blocks_to_indexers_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveReadarrBlock::Indexers,
|
|
||||||
ActiveReadarrBlock::DeleteIndexerPrompt,
|
ActiveReadarrBlock::DeleteIndexerPrompt,
|
||||||
ActiveReadarrBlock::TestIndexer,
|
ActiveReadarrBlock::TestIndexer,
|
||||||
ActiveReadarrBlock::TestAllIndexers,
|
ActiveReadarrBlock::TestAllIndexers,
|
||||||
@@ -274,7 +268,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_system_blocks_to_system_handler(
|
fn test_delegates_system_blocks_to_system_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveReadarrBlock::System,
|
|
||||||
ActiveReadarrBlock::SystemLogs,
|
ActiveReadarrBlock::SystemLogs,
|
||||||
ActiveReadarrBlock::SystemQueuedEvents,
|
ActiveReadarrBlock::SystemQueuedEvents,
|
||||||
ActiveReadarrBlock::SystemTasks,
|
ActiveReadarrBlock::SystemTasks,
|
||||||
|
|||||||
@@ -165,7 +165,6 @@ mod tests {
|
|||||||
ActiveSonarrBlock::SearchSeriesHistory,
|
ActiveSonarrBlock::SearchSeriesHistory,
|
||||||
ActiveSonarrBlock::SearchSeriesHistoryError,
|
ActiveSonarrBlock::SearchSeriesHistoryError,
|
||||||
ActiveSonarrBlock::SeasonDetails,
|
ActiveSonarrBlock::SeasonDetails,
|
||||||
ActiveSonarrBlock::Series,
|
|
||||||
ActiveSonarrBlock::SeriesDetails,
|
ActiveSonarrBlock::SeriesDetails,
|
||||||
ActiveSonarrBlock::SeriesHistory,
|
ActiveSonarrBlock::SeriesHistory,
|
||||||
ActiveSonarrBlock::SeriesHistorySortPrompt,
|
ActiveSonarrBlock::SeriesHistorySortPrompt,
|
||||||
@@ -186,7 +185,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_downloads_blocks_to_downloads_handler(
|
fn test_delegates_downloads_blocks_to_downloads_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveSonarrBlock::Downloads,
|
|
||||||
ActiveSonarrBlock::DeleteDownloadPrompt,
|
ActiveSonarrBlock::DeleteDownloadPrompt,
|
||||||
ActiveSonarrBlock::UpdateDownloadsPrompt
|
ActiveSonarrBlock::UpdateDownloadsPrompt
|
||||||
)]
|
)]
|
||||||
@@ -202,7 +200,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_blocklist_blocks_to_blocklist_handler(
|
fn test_delegates_blocklist_blocks_to_blocklist_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveSonarrBlock::Blocklist,
|
|
||||||
ActiveSonarrBlock::BlocklistItemDetails,
|
ActiveSonarrBlock::BlocklistItemDetails,
|
||||||
ActiveSonarrBlock::DeleteBlocklistItemPrompt,
|
ActiveSonarrBlock::DeleteBlocklistItemPrompt,
|
||||||
ActiveSonarrBlock::BlocklistClearAllItemsPrompt,
|
ActiveSonarrBlock::BlocklistClearAllItemsPrompt,
|
||||||
@@ -220,7 +217,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_history_blocks_to_history_handler(
|
fn test_delegates_history_blocks_to_history_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveSonarrBlock::History,
|
|
||||||
ActiveSonarrBlock::HistoryItemDetails,
|
ActiveSonarrBlock::HistoryItemDetails,
|
||||||
ActiveSonarrBlock::HistorySortPrompt,
|
ActiveSonarrBlock::HistorySortPrompt,
|
||||||
ActiveSonarrBlock::FilterHistory,
|
ActiveSonarrBlock::FilterHistory,
|
||||||
@@ -240,7 +236,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_root_folders_blocks_to_root_folders_handler(
|
fn test_delegates_root_folders_blocks_to_root_folders_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveSonarrBlock::RootFolders,
|
|
||||||
ActiveSonarrBlock::AddRootFolderPrompt,
|
ActiveSonarrBlock::AddRootFolderPrompt,
|
||||||
ActiveSonarrBlock::DeleteRootFolderPrompt
|
ActiveSonarrBlock::DeleteRootFolderPrompt
|
||||||
)]
|
)]
|
||||||
@@ -257,7 +252,6 @@ mod tests {
|
|||||||
fn test_delegates_indexers_blocks_to_indexers_handler(
|
fn test_delegates_indexers_blocks_to_indexers_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveSonarrBlock::DeleteIndexerPrompt,
|
ActiveSonarrBlock::DeleteIndexerPrompt,
|
||||||
ActiveSonarrBlock::Indexers,
|
|
||||||
ActiveSonarrBlock::AllIndexerSettingsPrompt,
|
ActiveSonarrBlock::AllIndexerSettingsPrompt,
|
||||||
ActiveSonarrBlock::IndexerSettingsConfirmPrompt,
|
ActiveSonarrBlock::IndexerSettingsConfirmPrompt,
|
||||||
ActiveSonarrBlock::IndexerSettingsMaximumSizeInput,
|
ActiveSonarrBlock::IndexerSettingsMaximumSizeInput,
|
||||||
@@ -277,7 +271,6 @@ mod tests {
|
|||||||
#[rstest]
|
#[rstest]
|
||||||
fn test_delegates_system_blocks_to_system_handler(
|
fn test_delegates_system_blocks_to_system_handler(
|
||||||
#[values(
|
#[values(
|
||||||
ActiveSonarrBlock::System,
|
|
||||||
ActiveSonarrBlock::SystemLogs,
|
ActiveSonarrBlock::SystemLogs,
|
||||||
ActiveSonarrBlock::SystemQueuedEvents,
|
ActiveSonarrBlock::SystemQueuedEvents,
|
||||||
ActiveSonarrBlock::SystemTasks,
|
ActiveSonarrBlock::SystemTasks,
|
||||||
|
|||||||
Reference in new issue
Block a user