Hoje eu enfrentei o pior desafio: A falta de conhecimento das ferramentas que to usando kkkk.
Eu to escrevendo testes de integração pro meu backend (eu não tenho muita lógica no meu código então ainda não teve necessidade de fazer algo unitário). E bicho, eu to usando o framework actix-web e a linguagem rust pela primeira vez neste app como quem acompanha sabe.
Eu tava primeiro apanhando contra a próprio lib do Rust que roda comandos no shell. Não estava conseguindo fazer com que eu deletasse todos os container docker antes de inicializar os testes nem a pau mas deu pra resolver assim:

Como da pra ver, o que mudou foi que passei a rodar os comandos separadamente, isso permitiu que fizesse funcionar, eu gostaria de não precisar ter de fazer isto e sim usar o $(docker ps -a -q )
como um dos args
da chamada do Command::new mas ok 😂.
Depois disso tudo, foi organizar os testes pra não terem problemas de concorrência, eu não consegui resolver agora mas resolvi paleativamente da seguinte forma:
- tenho um mutex pra testes que querem acessar o banco do container (isto aqui eu testei e não funcionou mas vou aprimorar)
- Limitar a quantidade de threads que rodam os testes pra 1. Eu utilizei o comando
cargo test -- test-threads=1
Depois disto, foi aprender como testar os endpoints do actix-web de forma que eu não precisasse fazer um malabarismo pra escrever as requisições e que eu pudesse utilizar o borrow checker pra checar problemas de tipo pra mim no meu teste.
Outra coisa que me ajudou bastante foi simplesmente ler todas as structs e funções dentro do módulo actix_web::test
:

Então aprendi sobre o TestRequest
que o actix-web tem (https://docs.rs/actix-web/latest/actix_web/test/struct.TestRequest.html) e com ele eu consegui fazer muitas coisas como aprender como extrair os responses dos testrequest 😂, outra batalha mas consegui fazer muita coisa ao aprender a extrair os dados de forma simples, e extrair um response do request, é preciso utilizar a função read_body_json
, isso já vai ajudar bastante a encurtar o caminho do teste.
Outra besteirinha foi resolver um problema de move and borrowing
no meu código, eu tenho uma struct que representa o dado sendo enviado pro request, mas eu preciso utilizar ela novamente (no teste) pra checar se os dados retornados do banco são os mesmo que enviei pelo request, pra isso, eu não posso passar o ownership
do meu objeto com a struct pra função de TestRequest, eu preciso passar somente a referência
já que o testrequest só precisa dos dados da minha struct mas não manipular ela.

Como da pra ver, eu passo request_info por valor para o test_res na linha 172, isso é como não fazer caso você queira utilizar o valor depois.
E com a variável new_place_suggestion na linha 164, eu só passo a referência para aquele espaço da memória, desta forma eu ainda tenho ownership da variável após criar o request.
Isso é muita loucura mas Rust com isso garante que não vai ter problemas de memória no código.
Por enquanto, foi isto, escrevi e consegui fazer alguns casos de uso passarem que são caminho feliz mas ainda falta escrever muitos testes. Desanimei estes dias pois estava apanhando bastante pra Rust pra escrever esta “mini infra” de testes.
Mas vou ficar postando aqui no final como tá a situação dos testes do backend (assim eu vejo o progresso), depois de resolver os problemas acima, eu fui e implementei os testes de place_suggestion que estão em ok:
