El error que reporté estaba mal planteado, y el fixture que lo corrigió rompió otras cuatro pruebas
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
Un segfault que no era un error, y la API que finalmente eliminé
Una limpieza de la capa de servicio de MusicKit donde eliminar métodos muertos hizo fallar todas las pruebas a la vez - y la solución fue una compilación limpia, no un depurador.
Cierre de las brechas de pruebas: lógica pura, una rama simulada inalcanzable y un cambio a Swift 6
Extracción de algoritmos fuera del alcance de MusicKit, un parámetro simulado que se ignoraba en silencio, y dos pruebas que habían estado pasando por la razón equivocada todo este tiempo.
Mis mocks no podían fallar: inyección de errores y un crash de aislamiento en Swift 6
Cada rama catch era código muerto en las pruebas. Una costura de fallas de 15 líneas resolvió eso, y luego una sola suite de pruebas sin anotar tumbó todo el runner.
También te podría ser útil
Proton VPN
VPN comercial con filtrado NetShield e interruptor de apagado automático.
Como socio de Proton, obtengo ingresos por las compras que califican de los servicios de privacidad y seguridad de Proton (Pass, Mail, VPN, Drive).
Más informaciónAdGuard para iOS
Bloqueo de anuncios y rastreadores en todo el sistema en iOS, sin necesidad de un servidor DNS aparte.
Como afiliado de AdGuard, obtengo ingresos por las compras que califican.
Más informaciónRackNerd VPS
Alojamiento VPS económico para servicios ligeros que funcionan de forma continua.
Como afiliado de RackNerd, obtengo ingresos por las compras que califican.
Más información