uqbar-project / wollok-ts-cli

Wollok Command Line Interface
GNU General Public License v3.0
9 stars 7 forks source link

No se está reportando un test que falla #182

Closed PalumboN closed 1 month ago

PalumboN commented 2 months ago

Me pasó que tenía 2 tests que fallaban pero al hacer npm test todo estaba piola.

Investigando llegué a veces que al terminar de correr los tests me quedaba la consola de Wollok enchufada (?

Al parecer los tests del REPL son en parte responsables, hay que hacerle close() o algo así en el after. Igual creo que hay otros tests que interfieren también.

fdodino commented 1 month ago

ahí lo pude replicar @PalumboN :

it('should quit successfully if project has validation errors but skip validation config is passed', async () => {
    const repl = await callRepl('fileWithValidationErrors.wlk', buildOptionsFor('validation-errors', true))
    repl.emit('line', ':r')  // <-- acá
    expect(processExitSpy.calledWith(0)).to.be.true
  })

cuando no lo hacías salir del REPL, no liberaba el puerto 3000 donde estaba el diagrama dinámico. El problema estaba acá:

export async function replFn(autoImportPath: string | undefined, options: Options): Promise<Interface> {
  logger.info(`${replIcon}  Initializing Wollok REPL ${autoImportPath ? `for file ${valueDescription(autoImportPath)} ` : ''}on ${valueDescription(options.project)}`)

  let interpreter = await initializeInterpreter(autoImportPath, options)
  const autoImportName = autoImportPath && interpreter.evaluation.environment.replNode().name
  const repl = Repl({ ... })
  let dynamicDiagramClient = await initializeClient(options, repl, interpreter) // <== esta línea

La solución es meter un stub para que no llame al diagrama dinámico en los tests full REPL, si total lo que nos interesa es el comportamiento del REPL (tenemos otros tests que verifican el diagrama dinámico: diagram.test.ts y dynamicDiagramClient.test.ts)

fdodino commented 1 month ago

Bueno, me anduvo ok la primera pero falló la segunda jajaj. Pero es ése el error. Lo voy a ver en estos días.

fdodino commented 1 month ago

Sí, efectivamente es éso pero lo bueno es que hay una opción para skippear el diagrama y con éso los tests funcionan (si le pongo :r y no sale del REPL falla el test pero no deja abierto el puerto 3000, y cuando lo arreglo los tests pasan).

Lo que posiblemente haya que hacer es controlar un poco más que no levante un socket, ya sea usando un stub o bien confirmando que se cierre el socket independientemente de que el test haya pasado o no.

fdodino commented 1 month ago

Bien, los otros tests que levantaban el puerto 3000 eran

image

it('should work for root path', async () => {
    const { enabled, app, server } = await initializeClient(options, repl, interpreter)
    try {
      expect(enabled).to.be.true
      const result = await chai.request(app).get('/index.html')
      expect(result).to.have.status(200)
    } finally {
      server!.close()  // <== antes no tenía el finally, si fallaba no cerraba el server
    }
  })

La prueba que hice fue duplicar el test y sin el finally pedirle expect(result).to.have.status(2004), para ver que si fallaba uno el segundo no ejecutaba y tiraba un exit code 13 porque el puerto 3000 ya está ocupado.

Voy a revisar en run.test.ts que hay otro test de humo de que si levantás un proyecto con game sin errores funciona, pero espera recibir un connect para terminar el test.

fdodino commented 1 month ago

Bingo!

image

Le puse xobject pepita { a la primera línea del basic-Example/example.wollok y lo que pasa es que nunca llama al done. Después se cae por timeout:

    it('smoke test - should work if program has no errors', done => {
      run('mainGame.PepitaGame', {
        project: join('examples', 'run-examples', 'basic-example'),
        skipValidations: false,
        game: true,
        startDiagram: false,
        assets,
        port: '3000',
        host: 'localhost',
      })
      const clientSocket = ioc('http://localhost:3000')
      clientSocket.on('connect', done) // Game finish on client connection
    })
fdodino commented 1 month ago

bueno, me está sacando canas verdes. Logré evitar que levante el server si tiene error el archivo de assets, pero ahora si ejecuto el test y funciona, el resultado final queda encolado y por algún motivo raro no se muestra. Lo seguiré viendo mañana, pero ese smoke test es muy desgraciado.

fdodino commented 1 month ago

Y confirmo que es ése el test que hace que no veas el resultado