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

Tech : Correction d'un test bagottant #5311

Closed
wants to merge 1 commit into from
Closed

Conversation

rsebille
Copy link
Contributor

Test cases and assertion in this file are setup to be in UTC timezone,
but the `expired` trait use the one in the settings (`Europe/Paris`) so
around midnight we don't always get the same date.
@rsebille rsebille added the no-changelog Ne doit pas figurer dans le journal des changements. label Dec 23, 2024
@rsebille rsebille self-assigned this Dec 23, 2024
@@ -309,7 +309,7 @@ def test_populate_job_seekers():
1,
1,
1,
job_application_2.eligibility_diagnosis.created_at.date(),
timezone.localdate(job_application_2.eligibility_diagnosis.created_at, timezone=datetime.UTC),
Copy link
Contributor

Choose a reason for hiding this comment

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

Pourquoi UTC ? Si on veut la date de création du diag, cela me semble plus logique de convertir le timestamp en se basant sur Europe/Paris non ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Venant du modèle, created_at est un datetime.datetime avec la TZ "Europe/Paris".
De ce que j'ai compris là où ça part en eau de boudin c'est après, la table ainsi que les données sont créées directement via psycopg ce qui fait qu'a priori la TZ n'est pas configurée au niveau de la connexion (ce qui est le cas pour django.db.connection qu'on utilise pour lire les données) donc on est en UTC mais on envois un timestamptz donc PG fait la conversion :

[email protected]:itou=# SHOW TIMEZONE;
 Etc/UTC
[email protected]:itou=# SELECT '2024-11-06 00:30:00+00'::timestamptz::date;
 2024-11-06
[email protected]:itou=# SELECT '2024-11-06 00:30:00+01'::timestamptz::date;
 2024-11-05
[email protected]:itou=# SHOW TIMEZONE;
 Europe/Paris
[email protected]:itou=# SELECT '2024-11-06 00:30:00+00'::timestamptz::date;
 2024-11-06
[email protected]:itou=# SELECT '2024-11-06 00:30:00+01'::timestamptz::date;
 2024-11-06

On se retrouve donc avec la date UTC et non pas Europoe/Paris stockée dans la DB, vu que beaucoup de tests du fichier mentionne explicitement la TZ UTC au moment des comparaisons c'est (j'espère) le comportement voulu, et quitte à faire une erreur autant qu'elle soit (à peu près) la même partout, mais oui c'est pas ouf...

Copy link
Contributor

@xavfernandez xavfernandez Jan 6, 2025

Choose a reason for hiding this comment

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

Ça ne me choque pas de stocker la date en UTC.
Mais quand on demande à quelle date a été créé un diagnostic, cela me semble plus logique de répondre en utilisant la TZ Europe/Paris. Mais du coup l'erreur originelle vient de

"fn": lambda o: getattr(get_latest_diagnosis(o), "created_at", None),

en envoyant une datetime dans une colonne de type date sans faire de conversion explicite.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Si la logique était de stocker les dates en Europe/Paris, alors oui.
Par contre cette situation et conversion arrive aussi pour plein d'autres champs donc la logique, par voie de fait, est actuellement de stocker les dates en UTC.
Je doute qu'on se lance dans ce changement/correction à plus ou moins court terme car un certain nombre de ces champs ne devraient pas être tronqué en fait, mais derrière ça veux dire tout adapter dans les modèles DBT et metabase 😓.

Copy link
Contributor

@xavfernandez xavfernandez left a comment

Choose a reason for hiding this comment

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

Ça devrait effectivement corriger le test mais je maintiens que c'est le code qui devrait être corrigé: passer un datetime à postgresql pour qu'il remplisse un champ date ne me semble pas être une bonne idée.

Copy link
Contributor

@francoisfreitag francoisfreitag left a comment

Choose a reason for hiding this comment

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

Je suis d’accord avec Xavier : #5338
😇

@rsebille
Copy link
Contributor Author

rsebille commented Jan 6, 2025

Je suis d’accord avec Xavier : #5338 😇

Je ne suis pas en désaccord, mais quasiment tout les champs "type": "date" de la synchro sont dans ce cas donc ça m'embête de ne pas tous les accorder ensemble, encore plus quand d'autres champs de la même table sont également concernés.
Et vu que je ne suis pas encore descendu dans le trou de terrier de regarder ce qu'on en fait dans les modèles DBT et encore moins ce que Metabase en fait ensuite, ça me semble préférable d'avoir une logique peut-être erronée mais cohérente (et "explicable") que de changer des bouts par-ci par-là.

@francoisfreitag
Copy link
Contributor

francoisfreitag commented Jan 6, 2025

On peut étendre le fix à d’autres champs, c’est un pénible, mais je trouve ça préférable à avoir un test qui attend une valeur fausse, surtout sans un commentaire expliquant pourquoi on attend cette valeur.

À la lecture des changements proposés, je penserais que le code actuel fait « ce qu’il faut » et que le test le vérifie.

@francoisfreitag
Copy link
Contributor

Il ne semble y avoir que 21 occurrence de "type": "date", avec quelques vraies dates et la plupart des bugs.

Ça me semble finalement pas si pénible.

@francoisfreitag
Copy link
Contributor

C’est sûr qu’utiliser timestamp with timezone serait encore mieux, mais ça risque de casser pas mal de choses...

@rsebille
Copy link
Contributor Author

rsebille commented Jan 7, 2025

C’est sûr qu’utiliser timestamp with timezone serait encore mieux, mais ça risque de casser pas mal de choses...

Oui, quitte à corriger ça me semble préférable que le production (les emplois) envois la donnée la plus précise sans trop réfléchir et que ça soit le consommateur qui décide (que ça soit la précision ou la timezone) comment il l'utilise, moins de responsabilité, moins de problèmes :).
En soit il y a rien de bien compliqué techniquement que ça soit coté emplois ou pilotage, faut juste s'y mettre et tirer les fils mais donc ça prend un peu plus de temps ;), pour ça que corriger le test en attendant me semblais être le bon compromis.

@francoisfreitag
Copy link
Contributor

Je proposerais bien le compromis suivant :
Localiser la date, ce qui ne devrait rien casser au pilotage et corriger quelques erreurs (je suppose rarissimes) de chiffres. Le jour où l’info plus précise est nécessaire, il sera intéressant d’étudier les ramifications du changement de type de données.

Qu’en penses-tu ?

@rsebille
Copy link
Contributor Author

rsebille commented Jan 8, 2025

Je proposerais bien le compromis suivant : Localiser la date, ce qui ne devrait rien casser au pilotage et corriger quelques erreurs (je suppose rarissimes) de chiffres. Le jour où l’info plus précise est nécessaire, il sera intéressant d’étudier les ramifications du changement de type de données.

Qu’en penses-tu ?

Si tu veux.

@francoisfreitag
Copy link
Contributor

francoisfreitag commented Jan 9, 2025

Yep, c’est proposé dans #5338

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
no-changelog Ne doit pas figurer dans le journal des changements.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants