-
Notifications
You must be signed in to change notification settings - Fork 31
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Refactor Smoove GBFS controller #1867
Conversation
a4b932d
to
d7d083c
Compare
} | ||
) | ||
|> render("gbfs.json") | ||
{:ok, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Il y a beaucoup de lignes de code modifiées mais c'est en réalité beaucoup de refactor en
{:ok, } |> render_response(conn)
@@ -0,0 +1,52 @@ | |||
defmodule GBFS.SmooveControllerTest do |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Un copier/coller quasi complet de https://github.com/etalab/transport-site/blob/master/apps/gbfs/test/gbfs/controllers/jcdecaux_test.exs
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Idéalement il faudrait essayer d'adapter les tests pour éviter d'ajouter d'usage de use_cassette
(cf #1853) et idem pour with_mock
(car mock
modifie la définition globale des modules, il n'y a pas de modification par processus jjh42/mock#129), au profit de Mox (https://github.com/dashbitco/mox).
Si tu en as l'énergie!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@thbar Tu aurais un exemple de PR où on a abandonné use_cassette
et utilisé autre chose ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je n'ai pas trouvé facilement d'exemple précisément pour ça, mais on a quelque chose d'approchant dans le travail réalisé par @fchabouis dans #1863.
Je vais essayer de décrire rapidement la guideline générale pour enlever autant with_mock
que use_cassette
(il manquera des points à traiter oralement à un moment, mais ça suffira pour avancer) :
- Identifier les points "frontière" (boundaries) dans le code, ceux qui font appel à la dépendance externe par un moyen ou un autre. Dans le cas de ce contrôleur, ça sera l'appel à
HTTPoison.get
, qui est ici:
transport-site/apps/gbfs/lib/gbfs/controllers/smoove_controller.ex
Lines 107 to 109 in 8a2d13e
defp get_stations(url) do | |
with {:ok, %{status_code: 200, body: body}} <- HTTPoison.get(url), | |
body when not is_nil(body) <- :iconv.convert("iso8859-1", "latin1", body) do |
- Dégager une "behaviour" ou un wrapper (mais là pour httpoison le travail a déjà été fait ici et il se trouve que HTTPoison lui-même est une "behaviour", ce qui fait que Mox peut le mocker directement
- Faire appel à ce wrapper dans le code du contrôleur (comme fait dans Utilisation d'un Mock pour tester url_extractor.ex #1863) plutôt que de faire l'appel direct à HTTPoison
- Modifier les tests pour créer des assertions en utilisant Mox. La configuration de "test" (ici) substitue l'implémentation de
httpoison_impl
avec un Mock, et on peut asserter dessus ensuite (https://github.com/etalab/transport-site/pull/1863/files#diff-cd2bd95618a14fbcafc59bb740eece7ee030f2c29af4bd5ea0add7c3062bc171R8)
Attention, il est recommandé de faire un "verify" des mocks (ce qui n'est pas fait dans #1863 je le remarque) avec setup :verify_on_exit!
ou avec verify!()
.
Voilà pour l'idée générale ; ça paraît un peu compliqué initialement, toutefois au final ça a le mérite de définir des boundaries claires et de rendre le code très testable et substituable.
À ta dispo si besoin de clarifications!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Merci beaucoup, fait dans le commit suivant ! Je pourrai faire de même pour JC Decaux dans une autre PR.
fn a -> | ||
%{ | ||
"name" => Atom.to_string(a), | ||
"url" => apply(Routes, String.to_atom("#{contract_id}_url"), [conn, a]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pour info on peut avoir à faire attention avec les conversions vers les atoms, si la donnée d'input est arbitraire / extérieure (https://til.hashrocket.com/posts/gkwwfy9xvw-converting-strings-to-atoms-safely).
Là dans ce cas ma compréhension est que la liste des contract_id est fixe et contrôlée par nous, donc pas de problème.
conn | ||
|> assign(:data, get_station_information(url)) | ||
|> render("gbfs.json") | ||
conn.assigns.smoove_params.url |> get_station_information() |> render_response(conn) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tiens curieux que le formateur Elixir laisse ça sous cette forme (et credo) derrière, je me serais attendu à ce qu'il impose un passage à la ligne.
@@ -0,0 +1,52 @@ | |||
defmodule GBFS.SmooveControllerTest do |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Idéalement il faudrait essayer d'adapter les tests pour éviter d'ajouter d'usage de use_cassette
(cf #1853) et idem pour with_mock
(car mock
modifie la définition globale des modules, il n'y a pas de modification par processus jjh42/mock#129), au profit de Mox (https://github.com/dashbitco/mox).
Si tu en as l'énergie!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Super ; merci d'avoir fait le refacto sur les tests, c'est top.
C'est bon pour moi ; je suggère de faire une requête après le déploiement pour vérifier que tout va bien (du fait du swap de l'implémentation par rapport aux tests), mais sinon tout est OK.
56f4d95
to
77fe355
Compare
J'ai pu tester les endpoints en local sans problème et j'ai supprimé la dépendance iconv dans le dernier commit 👌 |
Fixes #1866
Refactor du controlleur GBFS pour Smoove en suivant JC Decaux