Skip to content

Commit 779a212

Browse files
committed
fix(biblioteca): el recuento de cada estado vuelve a coincidir con su listado
Al dar ficha personal a los juegos del préstamo familiar, los recuentos de la barra lateral empezaron a contarlos y el listado seguía escondiéndolos: «Sin clasificar 1744» llevaba a «ningún juego coincide». Un número que lleva a una pantalla vacía es peor que no tener número. `list_statuses` y `list_collections` aplican ahora las dos mismas exclusiones que `list_games` por defecto —los prestados sin confirmar y los archivados no están en la biblioteca, así que tampoco en sus recuentos—, que es lo que ya hacía `library_stats`. Las tres consultas describen lo mismo y ahora lo dicen igual. Clasificar un juego prestado sigue sirviendo: dentro del ámbito de Steam Family el filtro por estado lo encuentra, porque allí se piden a propósito. Dos pruebas lo fijan: que el recuento de un estado coincida con lo que enseña al pulsarlo, y que el ámbito de Family sí devuelva los prestados por estado. De paso, los archivados dejan de inflar los recuentos, que era un desajuste anterior del mismo tipo.
1 parent 47f8e94 commit 779a212

2 files changed

Lines changed: 73 additions & 3 deletions

File tree

src-tauri/src/db/mod.rs

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2396,7 +2396,7 @@ mod durability_tests {
23962396

23972397
#[cfg(test)]
23982398
mod pruebas_del_recuento_de_familia {
2399-
use super::{library, migrations, seed_defaults};
2399+
use super::{library, migrations, organization, seed_defaults};
24002400
use rusqlite::Connection;
24012401

24022402
fn base() -> Connection {
@@ -2500,6 +2500,59 @@ mod pruebas_del_recuento_de_familia {
25002500
assert!(url.ends_with("library_600x900_2x.jpg"), "quedó en {url}");
25012501
}
25022502

2503+
#[test]
2504+
fn el_recuento_de_un_estado_coincide_con_lo_que_enseña_al_pulsarlo() {
2505+
// Un número en la barra lateral que lleva a «ningún juego coincide» es
2506+
// peor que no tener número. Pasó al dar ficha personal al catálogo de
2507+
// Family: el recuento los contaba y el listado los escondía.
2508+
let connection = base();
2509+
juego_propio(&connection, 10);
2510+
juego_prestado(&connection, 20);
2511+
juego_prestado(&connection, 30);
2512+
2513+
let estados = organization::list_statuses(&connection).expect("estados");
2514+
let sin_clasificar = estados
2515+
.iter()
2516+
.find(|estado| estado.id == "unclassified")
2517+
.expect("existe el estado por defecto");
2518+
2519+
let request = crate::models::GameListRequest {
2520+
status_id: Some("unclassified".to_string()),
2521+
..Default::default()
2522+
};
2523+
let listado = library::list_games(&connection, &request, None).expect("listar");
2524+
2525+
assert_eq!(
2526+
sin_clasificar.game_count as usize,
2527+
listado.items.len(),
2528+
"la barra lateral ofrece {} y el listado enseña {}",
2529+
sin_clasificar.game_count,
2530+
listado.items.len()
2531+
);
2532+
assert_eq!(
2533+
sin_clasificar.game_count, 1,
2534+
"sólo el propio está en la biblioteca"
2535+
);
2536+
}
2537+
2538+
#[test]
2539+
fn el_ambito_de_familia_sí_enseña_los_prestados_por_estado() {
2540+
// Y clasificar un juego prestado tiene que servir de algo: dentro de su
2541+
// ámbito, el filtro por estado lo encuentra.
2542+
let connection = base();
2543+
juego_prestado(&connection, 20);
2544+
2545+
let request = crate::models::GameListRequest {
2546+
status_id: Some("unclassified".to_string()),
2547+
ownership_source: Some("family_shared".to_string()),
2548+
..Default::default()
2549+
};
2550+
let listado = library::list_games(&connection, &request, None).expect("listar");
2551+
2552+
assert_eq!(listado.items.len(), 1);
2553+
assert_eq!(listado.items[0].app_id, 20);
2554+
}
2555+
25032556
#[test]
25042557
fn sin_catalogo_de_familia_la_cifra_es_cero_y_no_una_ausencia() {
25052558
// Cero es una respuesta: significa que no hay nada prestado. La interfaz

src-tauri/src/db/organization.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,20 @@ struct GameFacts {
4343

4444
pub fn list_statuses(connection: &Connection) -> AppResult<Vec<StatusDefinition>> {
4545
let mut statement = connection.prepare(
46-
"SELECT s.id, s.name, s.color, s.position, s.built_in, COUNT(p.app_id)
46+
// Las mismas dos exclusiones que aplica `library::list_games` por
47+
// defecto: los juegos prestados sin confirmar y los archivados no están
48+
// en la biblioteca, así que tampoco pueden estar en sus recuentos.
49+
// Cuando el catálogo de Family pasó a tener ficha personal, esta
50+
// consulta empezó a contarlo y la barra ofrecía mil setecientos juegos
51+
// que el listado escondía.
52+
"SELECT s.id, s.name, s.color, s.position, s.built_in,
53+
COUNT(CASE WHEN g.app_id IS NOT NULL THEN 1 END)
4754
FROM statuses s
4855
LEFT JOIN game_personal p ON p.status_id = s.id
56+
LEFT JOIN games g ON g.app_id = p.app_id
57+
AND NOT (g.ownership_source = 'family_shared'
58+
AND g.family_availability <> 'confirmed')
59+
AND NOT EXISTS (SELECT 1 FROM game_archive a WHERE a.app_id = g.app_id)
4960
GROUP BY s.id
5061
ORDER BY s.position ASC, s.name COLLATE NOCASE ASC",
5162
)?;
@@ -152,10 +163,16 @@ pub fn reorder_statuses(connection: &mut Connection, ordered_ids: &[String]) ->
152163

153164
pub fn list_collections(connection: &Connection) -> AppResult<Vec<CollectionSummary>> {
154165
let mut statement = connection.prepare(
166+
// Mismo criterio que en los estados: la cifra tiene que coincidir con lo
167+
// que se encuentra al pulsarla.
155168
"SELECT c.id, c.name, c.description, c.color, c.icon, c.kind, c.match_mode,
156-
c.position, COUNT(cg.app_id)
169+
c.position, COUNT(CASE WHEN g.app_id IS NOT NULL THEN 1 END)
157170
FROM collections c
158171
LEFT JOIN collection_games cg ON cg.collection_id = c.id
172+
LEFT JOIN games g ON g.app_id = cg.app_id
173+
AND NOT (g.ownership_source = 'family_shared'
174+
AND g.family_availability <> 'confirmed')
175+
AND NOT EXISTS (SELECT 1 FROM game_archive a WHERE a.app_id = g.app_id)
159176
GROUP BY c.id
160177
ORDER BY c.position ASC, c.name COLLATE NOCASE ASC",
161178
)?;

0 commit comments

Comments
 (0)