Closed PalumboN closed 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
)
Bueno, me anduvo ok la primera pero falló la segunda jajaj. Pero es ése el error. Lo voy a ver en estos días.
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.
Bien, los otros tests que levantaban el puerto 3000 eran
diagram.test.ts
: no lo necesitaba en verdad, nosotros queremos llamar a la función que devuelve el grafo de objetos, no probamos nada de lo que se manda al clientdynamicDiagram.test.ts
: hay 1 solo smoke test de que recibimos un server que no es falsy. Si el test fallaba faltaba envolverlo en un finally para hacer server.close
: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.
Bingo!
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
})
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.
Y confirmo que es ése el test que hace que no veas el resultado
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.