From f972d36f2f65b94a3640ceab98e57680ffb0433e Mon Sep 17 00:00:00 2001 From: Colin Darie Date: Wed, 8 Nov 2023 11:30:52 +0100 Subject: [PATCH] test: fix when using timestamps not yet limited by postgresql precision MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../api/v2/graphql_controller_stored_queries_spec.rb | 6 +++--- spec/models/concern/dossier_clone_concern_spec.rb | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/spec/controllers/api/v2/graphql_controller_stored_queries_spec.rb b/spec/controllers/api/v2/graphql_controller_stored_queries_spec.rb index 380007607..6fa77c40b 100644 --- a/spec/controllers/api/v2/graphql_controller_stored_queries_spec.rb +++ b/spec/controllers/api/v2/graphql_controller_stored_queries_spec.rb @@ -160,7 +160,7 @@ describe API::V2::GraphqlController do context 'include Dossiers' do 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) end @@ -456,7 +456,7 @@ describe API::V2::GraphqlController do context 'include deleted Dossiers' do 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) end @@ -575,7 +575,7 @@ describe API::V2::GraphqlController do context 'include pending deleted Dossiers' do 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) end diff --git a/spec/models/concern/dossier_clone_concern_spec.rb b/spec/models/concern/dossier_clone_concern_spec.rb index b7922de61..e91674b51 100644 --- a/spec/models/concern/dossier_clone_concern_spec.rb +++ b/spec/models/concern/dossier_clone_concern_spec.rb @@ -173,6 +173,7 @@ RSpec.describe DossierCloneConcern do context "as a fork" do 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.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 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 { champ_pj_fork = Champs::PieceJustificativeChamp.where(dossier: new_dossier).first