Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Usando condicionais e loops em cypress

No ambiente de FQA que trabalho é comum que algumas API's só funcionem no "tranco" então eu posso por exemplo, usar outras condicionais, ou loops como while para chamar a api antes de seguir com o teste e2e? por exemplo, eu preciso chamar "na mão" a api até ela retornar 200 para só assim retornar com o teste, pense em fazer algo parecido com isso aqui:

describe('testes e2e', ()=>{
    context('API problemática', ()=>{
        beforeEach('chama a api até funcionar', ()=>{
            cy.request({
                method: 'POST',
                url: 'https://api-problematica.com/endpoint',
                body: {
                    chave1: valor1,
                    chave2: valor2
                }
            }).then((response)=>{
                while (response.status !== 200) {
                    cy.request()
                }
            })
        })
    })
})

minha dúvia é como implementar o while e se funcionaria.

1 resposta
solução!

não dá pra usar while do jeito tradicional com cypress porque tudo no cypress é assíncrono e baseado em promessas. se você colocar um while assim, vai travar ou não funcionar como espera.

uma forma de fazer isso é usando recursão com funções. exemplo simples:

function tentaAteDarCerto(tentativas = 0) {
  if (tentativas > 5) throw new Error('api não respondeu com 200');

  cy.request({
    method: 'POST',
    url: 'https://api-problematica.com/endpoint',
    body: {
      chave1: 'valor1',
      chave2: 'valor2'
    },
    failOnStatusCode: false
  }).then((response) => {
    if (response.status !== 200) {
      cy.wait(1000); // espera 1s antes de tentar de novo
      tentaAteDarCerto(tentativas + 1);
    }
  });
}

describe('testes e2e', () => {
  context('API problemática', () => {
    beforeEach(() => {
      tentaAteDarCerto();
    });

    it('faz alguma coisa depois que a api respondeu 200', () => {
      // seu teste aqui
    });
  });
});

resumindo: usa função recursiva com cy.request e controle de tentativas, não while.