Saltar al contenido
Development

El error que reporté estaba mal planteado, y el fixture que lo corrigió rompió otras cuatro pruebas

Por Victor Da Luz
iosswifttestingdev-logdeep-cut-atlas

Yo mismo registré este issue, a partir de un reporte de error: “no permitir álbumes duplicados en la playlist.” Lo redacté como un problema de tiempo de escritura, agregar una verificación antes de insertar una pista para que un álbum duplicado no pudiera colarse dos veces en la playlist. Ya existía la deduplicación a nivel de pista; supuse que el hueco estaba a nivel de álbum.

Antes de tocar código, una pasada de investigación que había lanzado marcó un problema con mi propio issue: la protección propuesta era redundante en todos los casos donde en verdad se activaría (las re-adiciones exactas ya las capturaba la verificación existente a nivel de pista), e inútil para el único caso que de verdad podría producir un duplicado, una edición deluxe o remasterizada, cuyos títulos de pista difieren lo justo como para escabullirse de una clave basada en el título. Estaba a punto de construir una corrección para un error que no podía pasar, y de pasar por alto el que sí podía.

Entonces, en lugar de parchar el issue tal como estaba registrado, volví a lo que en realidad quería como usuario de esta app, y eso replanteó todo: si el álbum está en la playlist, no debería aparecer en la pestaña Discover en absoluto, y la opción de agregarlo debería estar deshabilitada en todos lados con un mensaje de que ya está ahí. No una protección en tiempo de escritura, sino una exclusión en tiempo de lectura. Si un álbum ya está en la playlist, que no se muestre como algo para agregar, para empezar.

La implementación fue directa una vez delimitada correctamente: calcular el conjunto de claves de álbum ya presentes en la playlist, filtrarlas del feed de Discover, y verificar pertenencia antes de mostrar un botón “Add” en cualquier otro lugar. Agregué un fixture de regresión permanente a los datos simulados para esto, un álbum real del catálogo (“Fragments” de Bonobo) presente también como entrada de la playlist, para que la exclusión tenga algo concreto contra qué probarse en las pruebas y en el simulador.

Ese mismo fixture fue lo que rompió cuatro pruebas sin relación. Agregar un quinto grupo de playlist al fixture simulado compartido no cambió nada estructuralmente, pero cuatro pruebas separadas tenían supuestos fijos incrustados, groups.count == 4, una lista de sugerencias que esperaba incluir un álbum que ahora, correctamente, quedaba excluido por ya estar en la colección. Ninguna de esas pruebas estaba mal escrita en su momento, simplemente se habían vuelto dependientes en silencio de un número que nunca debió ser determinante. Correr la suite completa en lugar de solo la prueba nueva atrapó las cuatro antes de que se publicaran.

Verificar en un dispositivo real sacó a la luz otras dos cosas, ninguna de las cuales era la función que se estaba probando. La pestaña Playlist se quedaba intermitentemente atascada en “Loading playlist…” para siempre, sin error, sin reintento, rastreado hasta una consulta concurrente recién introducida (el prefetch en segundo plano propio de Discover ahora también pide el contenido de la playlist al iniciar) que competía con la propia carga de la pestaña Playlist, y terminaba en una captura silenciosa e irrecuperable de cancelación que ya estaba en el código. Y un reporte sobre configuración de filtros resultó no ser un error en absoluto: un filtro de sugerencias “More from artist” que una sesión pasada había delimitado deliberadamente de forma independiente al filtro principal de la playlist, documentado como tal en un comentario que aparentemente yo mismo había escrito y después olvidado. Ambos recibieron su propio issue en lugar de quedar mezclados en silencio con este, o, peor, ser adivinados y “corregidos” mal.

Lecturas relacionadas