Pruebas y depuración
Todo lo de aquí se ejecuta en tu equipo con yonto-plugin.
Ejecuta tu plugin en el mismo motor QuickJS, con el mismo global yonto y los mismos límites que una televisión, así que un plugin que pasa aquí no es un plugin que solo funciona en tu máquina.
La mayoría de los comandos reciben el directorio del plugin y usan por defecto el directorio en el que estás.
yonto-plugin init my-site --template blank --name "My site"Escribe un plugin nuevo en ./my-site a partir de una plantilla, con su id y su nombre ya rellenados.
Las plantillas son blank y video-blog, y Escribe un plugin explica qué es cada una.
yonto-plugin lintComprueba el manifiesto con su esquema, compila el archivo y calcula el contractVersion que necesita el código.
No hace ninguna petición.
Rechaza una función obligatoria que falte, una entrada de allowedHosts que no pueda ser un host y un contractVersion inferior al que usa el código.
Avisa si es superior.
lint lee tu código y no lo ejecuta.
Llamar a una función del host a través de una variable, o construir el objeto de exportación extendiendo otro, se lee con cautela, así que escribe la forma simple siempre que puedas.
yonto-plugin run . search '"sourdough"'yonto-plugin run . getMediaList '"latest"' '{"page":1}'Llama a una función e imprime su JSON y las peticiones que hizo. Los argumentos son JSON, así que una cadena necesita dos niveles de comillas.
yonto-plugin doctorRecorre el plugin como lo hace la app: categorías, luego una lista, luego la página 2, luego un título de esa lista, luego una búsqueda y luego las funciones opcionales que exporta. Cada paso se alimenta del anterior. Su código de salida está pensado para la integración continua.
La regla que importa: una respuesta correcta pero vacía es un fallo.
Un sitio que cambia su marcado deja un plugin que “funciona” y no devuelve nada, sin ningún error en ninguna parte.
doctor lo llama EMPTY_RESULT.
También avisa de un valor que la app sustituiría en silencio, como type: "MOVIE".
Ajustes
Sección titulada «Ajustes»Un plugin cuyo configSchema tiene un campo obligatorio no puede ejecutarse sin uno.
Pon uno en doctor.json, junto al plugin, o define YONTO_PLUGIN_CONFIG='{"feedUrl":"…"}' para una ejecución, que tiene prioridad.
Los valores son cadenas, y aquí se rechaza un número porque funcionaría en este host y en ningún otro.
doctor.json se sube al repositorio, así que mantenlo con forma de datos de prueba y nunca pongas en él una clave real.
Grabaciones
Sección titulada «Grabaciones»yonto-plugin doctor --recordyonto-plugin doctor --replay--record escribe cada respuesta en fixtures/, con el valor de cada cookie reemplazado por redacted.
--replay las sirve con la red desactivada.
Graba una vez contra el sitio real y, a partir de entonces, podrás comprobar un cambio en un segundo, sin conexión, y también cualquiera que clone tu plugin.
Un sitio que necesita una cookie de sesión no puede tener grabaciones, porque una cookie nunca debe subirse al repositorio. Prueba ese con pruebas unitarias normales sobre páginas guardadas.
Escribir pruebas
Sección titulada «Escribir pruebas»El motor de la CLI es también una biblioteca, así que la lógica de tu propio plugin puede tener pruebas con node --test.
La plantilla video-blog tiene la más pequeña en el tools/plugin-cli/test/templates.test.js de kangzj/yonto-plugins: reproduce la grabación y responde con un transporte con guion para probar un error.
Comprueba la regla y no la redacción, de modo que una prueba sobre un error verifique que el motivo no nombra la fuente y no se rompa cuando lo reformules.
Probarlo en la app
Sección titulada «Probarlo en la app»Sirve el directorio con python3 -m http.server e instala su dirección .js en Ajustes, Plugins, Instalar desde una URL.
Desde un emulador de Android, tu equipo es 10.0.2.2.
Desde una televisión real, es la dirección de tu equipo en la red local.
El instalador lee los bytes y no la extensión, así que un .js suelto funciona y no hace falta empaquetar nada.
Si la instalación se rechaza, el cuadro de diálogo dice por qué. Se rechaza un archivo de más de 1 MiB o una descarga que tarde más de 30 segundos, y un plugin suele ocupar decenas de kilobytes.