Testy API w repozytorium? Da się z HttpClient!
💡

Testy API w repozytorium? Da się z HttpClient!

Jeśli tworzysz JSONowe API napewno na pamięć znasz obsługę takich narzędzi jak Postman, Insomnia, Curl. Jednak tworząc zapytania za ich pomocą nie jest możliwe, aby przechowywać testy API w repozytorium i zarządzać nimi za pomocą kontroli wersji. Ja też myślałem, że się nie da, aż do czasu, gdy trafiłem na to nagranie: https://www.youtube.com/watch?v=n8KCuKhDSZY. Narzędzia od JetBrains posiadają wbudowany genialny plugin – HttpClient. W tym poście przygotowałem dla Ciebie krótki pokaz jego możliwości z wykorzystaniem Ruby Mine i Ruby on Rails. Testy API w repozytorium? Da się! I to bardzo!

Jako środowisko demonstracji posłużę się prostą aplikacją napisaną w Ruby on Rails. Stworzenie tego prostego API z symulowaną autoryzacją zajęło mi 7 minut! Specjalnie mierzyłem sobie czas. Dlatego właśnie kocham RoR! Ale do rzeczy.

Aplikacja ma prostą strukturę. Głównym aktorem jest użytkownik, który może posiadać książki i samochody. Kolekcjoner. Powiedzmy, że to taka typowa aplikacja katalogowa. W dużym uproszczeniu.

Strukturę danych stworzyłem poniższymi migracjami.

image
image
image

Definicja modeli:

image
image
image

I kontrolery.

image
image
image

Routing:

image

ApplicationController, w którego wrzuciłem właściwie całą logikę.

image

W API możemy:

  • Sprawdzić, czy aplikacja działa (akcja home).
  • Pobrać wszystkie książki danego użytkownika z bazy.
  • Pobrać wszystkie samochody danego użytkownika z bazy.
  • Pobrać listę wszystkich użytkowników w bazie.
  • Zalogować się do aplikacji i uzyskać token autoryzacyjny

Dostęp do danych konkretnego użytkownika jest zabezpieczony tokenem, który powinien być dostarczony w headerze Authorization.

Przed odpaleniem utworzyłem w bazie kilku użytkowników, kilka książek i kilka samochodów.

Zaczynamy przygodę z HttpClientem. Wystarczy utworzyć plik z rozszerzeniem .http a RubyMine ogarnie resztę i dostosuje interfejs do odpalania zapytań.

Utworzyłem plik api_test.http.

image

Pierwsze zapytania. Sprawdzam, czy API działa. Wystarczy tylko jedna linijka:

GET http://localhost:3000

I rezultat:

image

Dobra, ale zapewne na jednym zapytaniu się nie skończy. Na szczęście nie muszę za każdym razem wpisywać adresu w kolejnych zapytaniach, co więcej mogę mieć skonfigurowane adresy dla różnych środowisk i odpalać mojego klienta w jednym z nich.

Dodaję plik http-client.env.json, w którym ustawiam środowisko i zmienną url.

{
  "development": {
    "url": "http://localhost:3000"
  }
}

I teraz zamiast naklepanego adresu url mogę użyć zmiennej. IDE mi wszystko pięknie podpowiada.

image

Kolejne zapytania oddzielamy trzema hashami: ###

image

Pora na logowanie

Dodaję nowy request, tym razem typu POST. Zobacz jak łatwo definiuję headery i parametry.

image

Autoryzacja się powiodła i w odpowiedzi dostałem auth_token. Teraz pora go przechwycić, przypisać do zmiennej i wykorzystywać w kolejnych zapytaniach. Służy do tego kod, który umieszczamy w klamrach z procentem {% %}, a jest to po prostu JavaScript.

POST{{url}}/login
Accept: application/json
Content-Type: application/json

{
  "email": "user1@email.com",
  "password": "password"
}


> {%
  auth_token = response.body['auth_token']
  client.global.set("token", auth_token)
%}

###
GEThttp://{{url}}/users/1
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{token}}

Możemy teraz autoryzować nasze zapytania za pomocą tokena:

image

HttpClient ma też coś dla fanów testów. Można pisać testy automatyczne do zapytań! Testy te odpalają się razem z zapytaniami, a ich rezultat jest widoczny w runnerze w IDE.

###
GEThttp://{{url}}/users/1
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{token}}

> {%
 client.test("Get User",function() {
   client.assert(response.body['books_count'] === 5, "Books count returned is wrong")
 })

 client.test("Status",function() {
   client.assert(response.status === 200, "Response status is not 200")
 })
 %}
image

Co teraz? Git commit, git push. I pyk mamy wersjonowane testy API.

image

Repozytorium z powyższym kodem znajdziesz tutaj.