Skip to content
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

Merged
merged 5 commits into from
Oct 20, 2021
Merged

Refactor Smoove GBFS controller #1867

merged 5 commits into from
Oct 20, 2021

Conversation

AntoineAugusti
Copy link
Member

Fixes #1866

Refactor du controlleur GBFS pour Smoove en suivant JC Decaux

  • Gestion de possibles erreurs HTTP
  • Ajout de tests
  • Ajout de la version GBFS

}
)
|> render("gbfs.json")
{:ok,
Copy link
Member Author

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
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

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!

Copy link
Member Author

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 ?

Copy link
Contributor

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) :

  1. 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:

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

  1. 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
  2. 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
  3. 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!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member Author

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.

@AntoineAugusti AntoineAugusti marked this pull request as ready for review October 20, 2021 09:46
fn a ->
%{
"name" => Atom.to_string(a),
"url" => apply(Routes, String.to_atom("#{contract_id}_url"), [conn, a])
Copy link
Contributor

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)
Copy link
Contributor

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
Copy link
Contributor

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!

@AntoineAugusti
Copy link
Member Author

@thbar Merci de tes conseils précieux pour réécrire les tests ! J'ai supprimé la cassette et le mock dans ea25adf

@AntoineAugusti AntoineAugusti requested a review from thbar October 20, 2021 11:34
@thbar thbar self-requested a review October 20, 2021 12:20
Copy link
Contributor

@thbar thbar left a 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.

@AntoineAugusti
Copy link
Member Author

J'ai pu tester les endpoints en local sans problème et j'ai supprimé la dépendance iconv dans le dernier commit 👌

@AntoineAugusti AntoineAugusti merged commit 390f887 into master Oct 20, 2021
@AntoineAugusti AntoineAugusti deleted the smoove-gbfs-version branch October 20, 2021 13:40
@AntoineAugusti
Copy link
Member Author

💆 ✅ 🚲
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Spécifier version GBFS pour Smoove
3 participants