Merge pull request #9071 from tchak/import-revisions

chore(recovery): import/export revision
This commit is contained in:
Paul Chavard 2023-05-24 07:32:54 +00:00 committed by GitHub
commit bba66f7a36
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 92 additions and 1 deletions

View file

@ -0,0 +1,17 @@
module Recovery
class RevisionExporter
FILE_PATH = Rails.root.join('lib', 'data', 'revision', 'export.dump')
attr_reader :revisions, :file_path
def initialize(revision_ids:, file_path: FILE_PATH)
@revisions = ProcedureRevision.where(id: revision_ids)
.preload(revision_types_de_champ: :type_de_champ)
.to_a
@file_path = file_path
end
def dump
@file_path.binwrite(Marshal.dump(@revisions))
end
end
end

View file

@ -0,0 +1,22 @@
module Recovery
class RevisionImporter
attr_reader :revisions
def initialize(file_path: Recovery::RevisionExporter::FILE_PATH)
# rubocop:disable Security/MarshalLoad
@revisions = Marshal.load(File.read(file_path))
# rubocop:enable Security/MarshalLoad
end
def load
@revisions.each do |revision|
ProcedureRevisionTypeDeChamp.transaction do
revision.revision_types_de_champ.each do |coordinate|
ProcedureRevisionTypeDeChamp.upsert(coordinate.attributes)
TypeDeChamp.upsert(coordinate.type_de_champ.attributes.except('type_champs'))
end
end
end
end
end
end

View file

@ -1,4 +1,4 @@
describe 'Recovery::LifeCycle' do describe 'Dossier::Recovery::LifeCycle' do
describe '.load_export_destroy_and_import' do describe '.load_export_destroy_and_import' do
let(:procedure) do let(:procedure) do
create(:procedure, create(:procedure,

View file

@ -0,0 +1,52 @@
describe 'Recovery::Revision::LifeCycle' do
describe '.load_export_destroy_and_import' do
let(:procedure) { create(:procedure, types_de_champ_public: [{ type: :yes_no, libelle: 'YES!!!' }, {}]) }
let(:dossier) { create(:dossier, :with_populated_champs, procedure:) }
let(:yes_no_type_de_champ) { procedure.published_revision.types_de_champ.first }
let(:file_path) { Rails.root.join('spec', 'fixtures', 'revision_export.dump') }
let(:exporter) { Recovery::RevisionExporter.new(revision_ids: [procedure.published_revision.id], file_path:) }
let(:importer) { Recovery::RevisionImporter.new(file_path:) }
def cleanup_export_file
file_path.delete if file_path.exist?
end
before do
cleanup_export_file
procedure.publish!
exporter.dump
end
after { cleanup_export_file }
context "when type de champ missing" do
before do
dossier
procedure.published_revision.remove_type_de_champ(yes_no_type_de_champ.stable_id)
end
it do
expect { DossierPreloader.load_one(dossier) }.to raise_error(ArgumentError)
expect(dossier.champs_public.size).to eq(1)
expect(dossier.champs.size).to eq(2)
importer.load
expect { DossierPreloader.load_one(dossier) }.not_to raise_error(ArgumentError)
expect(dossier.champs_public.size).to eq(2)
end
end
context "when type de champ libelle updated" do
before do
dossier
yes_no_type_de_champ.update!(libelle: 'new libelle')
end
it do
expect(yes_no_type_de_champ.libelle).to eq('new libelle')
importer.load
yes_no_type_de_champ.reload
expect(yes_no_type_de_champ.libelle).to eq('YES!!!')
end
end
end
end