test: fix when using timestamps not yet limited by postgresql precision

Sur des colonnes dont le schema ne connait pas le niveau de précision
(créées avant rails 7), rails créé un timestamp avec la précision système
(par exemple 9 décimales sur linux) alors que pg va l'arrondir
a posteriori à 6.

Ce n'est généralement pas un problème en production,
mais se révèle dans les tests typiquement avec des objets crées
par des factories: si un test dépend de ces timestamps,
il faut récupérer la valeur limitée par pg (d'où le reload),
plutôt que celle directement issue de Time.now à la création de l'objet.

Une alternative aurait été de créer une migration pour ces colonnes pour
forcer la précision à 6 et que le schema en aurait pris connaissance:
rails limiterait la précision de lui même dès la création de l'objet.
This commit is contained in:
Colin Darie 2023-11-08 11:30:52 +01:00
parent e60a5f5123
commit f972d36f2f
2 changed files with 5 additions and 4 deletions

View file

@ -160,7 +160,7 @@ describe API::V2::GraphqlController do
context 'include Dossiers' do context 'include Dossiers' do
def cursor_for(item, column) def cursor_for(item, column)
cursor = [item.read_attribute(column).utc.strftime("%Y-%m-%dT%H:%M:%S.%NZ"), item.id].join(';') cursor = [item.reload.read_attribute(column).utc.strftime("%Y-%m-%dT%H:%M:%S.%NZ"), item.id].join(';')
API::V2::Schema.cursor_encoder.encode(cursor, nonce: true) API::V2::Schema.cursor_encoder.encode(cursor, nonce: true)
end end
@ -456,7 +456,7 @@ describe API::V2::GraphqlController do
context 'include deleted Dossiers' do context 'include deleted Dossiers' do
def cursor_for(item) def cursor_for(item)
cursor = [item.deleted_at.utc.strftime("%Y-%m-%dT%H:%M:%S.%NZ"), item.id].join(';') cursor = [item.reload.deleted_at.utc.strftime("%Y-%m-%dT%H:%M:%S.%NZ"), item.id].join(';')
API::V2::Schema.cursor_encoder.encode(cursor, nonce: true) API::V2::Schema.cursor_encoder.encode(cursor, nonce: true)
end end
@ -575,7 +575,7 @@ describe API::V2::GraphqlController do
context 'include pending deleted Dossiers' do context 'include pending deleted Dossiers' do
def cursor_for(item) def cursor_for(item)
cursor = [(item.en_construction? ? item.hidden_by_user_at : item.hidden_by_administration_at).utc.strftime("%Y-%m-%dT%H:%M:%S.%NZ"), item.id].join(';') cursor = [(item.reload.en_construction? ? item.hidden_by_user_at : item.hidden_by_administration_at).utc.strftime("%Y-%m-%dT%H:%M:%S.%NZ"), item.id].join(';')
API::V2::Schema.cursor_encoder.encode(cursor, nonce: true) API::V2::Schema.cursor_encoder.encode(cursor, nonce: true)
end end

View file

@ -173,6 +173,7 @@ RSpec.describe DossierCloneConcern do
context "as a fork" do context "as a fork" do
let(:new_dossier) { dossier.clone(fork: true) } let(:new_dossier) { dossier.clone(fork: true) }
before { dossier.champs_public.reload } # we compare timestamps so we have to get the precision limit from the db }
it { expect(new_dossier.editing_fork_origin).to eq(dossier) } it { expect(new_dossier.editing_fork_origin).to eq(dossier) }
it { expect(new_dossier.champs_public[0].id).not_to eq(dossier.champs_public[0].id) } it { expect(new_dossier.champs_public[0].id).not_to eq(dossier.champs_public[0].id) }
@ -181,7 +182,7 @@ RSpec.describe DossierCloneConcern do
context "piece justificative champ" do context "piece justificative champ" do
let(:champ_pj) { create(:champ_piece_justificative, dossier_id: dossier.id) } let(:champ_pj) { create(:champ_piece_justificative, dossier_id: dossier.id) }
before { dossier.champs_public << champ_pj } before { dossier.champs_public << champ_pj.reload }
it { it {
champ_pj_fork = Champs::PieceJustificativeChamp.where(dossier: new_dossier).first champ_pj_fork = Champs::PieceJustificativeChamp.where(dossier: new_dossier).first