Pular para o conteúdo

Testar um bot sem rede

A sonda injeta updates e devolve o que o bot teria enviado — sem token, sem celular.

Um bot que só pode ser testado conversando com ele no celular não tem teste: não roda no CI, não repete, e não diz o que quebrou.

dataforge
adopt Arcane.Telegram as Tg
adopt Arcane.Test as T

action test_o_start_cumprimenta_pelo_nome():
    t := Tg.testar(meu_bot())
    t.comando("start")
    T.assert_true("Ana" in t.ultima())

action test_o_botao_edita_a_mensagem():
    t := Tg.testar(meu_bot())
    t.clicar("ajuda")
    T.assert_eq(t.quantas("answerCallbackQuery"), 1)

O que a sonda faz#

AgirPerguntar
t.mandar(texto)t.ultima() — a última mensagem enviada
t.comando(nome, ...)t.respostas() — todas elas
t.clicar(dados)t.disse(trecho) — se alguma contém o trecho
t.enviar_foto() · t.enviar_documento()t.ultimo_teclado()
t.consultar(texto)t.chamadas(metodo) · t.quantas(metodo)
t.entrar()t.estado(chave) · t.falhou() · t.falhas()

O dublê aceita qualquer método que ele não conheça, anotando a chamada em vez de estourar um erro: um dublê que precisa acompanhar cada método novo do cliente envelhece no primeiro recurso acrescentado.

Testar uma conversa inteira#

dataforge
action test_o_cadastro_valida_o_email():
    t := Tg.testar(meu_bot())
    t.comando("cadastro")
    t.mandar("Ana")
    t.mandar("sem arroba")
    T.assert_true("invalido" in t.ultima())
    t.mandar("ana@exemplo.br")
    T.assert_true(t.disse("Pronto"))
    T.assert_eq(t.estado("__conversa__"), void)