From 49fbb8267669d49d4d47286711a0ebf3c8bee84a Mon Sep 17 00:00:00 2001 From: "Stanko K.R." Date: Mon, 23 Mar 2026 12:30:40 +0100 Subject: [PATCH] Permit variant records in imports --- app/models/account/data_transfer/manifest.rb | 13 +++++-- test/models/account/export_test.rb | 40 ++++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/app/models/account/data_transfer/manifest.rb b/app/models/account/data_transfer/manifest.rb index f7a7791e1..11aaf6a49 100644 --- a/app/models/account/data_transfer/manifest.rb +++ b/app/models/account/data_transfer/manifest.rb @@ -26,14 +26,14 @@ class Account::DataTransfer::Manifest [ Account::DataTransfer::AccountRecordSet.new(account), Account::DataTransfer::UserRecordSet.new(account), - *build_record_sets( + *record_sets_for( ::User::Settings, ::Tag, ::Board, ::Column ), Account::DataTransfer::EntropyRecordSet.new(account), - *build_record_sets( + *record_sets_for( ::Board::Publication, ::Webhook, ::Access, @@ -58,18 +58,23 @@ class Account::DataTransfer::Manifest ::Webhook::Delivery ), Account::DataTransfer::ActiveStorage::BlobRecordSet.new(account), + record_set_for(::ActiveStorage::VariantRecord), Account::DataTransfer::ActiveStorage::AttachmentRecordSet.new(account), Account::DataTransfer::ActionText::RichTextRecordSet.new(account), Account::DataTransfer::ActiveStorage::FileRecordSet.new(account) ].then { set_importable_model_names(it) } end - def build_record_sets(*models) + def record_sets_for(*models) models.map do |model| - Account::DataTransfer::RecordSet.new(account: account, model: model) + record_set_for(model) end end + def record_set_for(model) + Account::DataTransfer::RecordSet.new(account: account, model: model) + end + def set_importable_model_names(record_sets) model_names = record_sets.filter_map { |record_set| record_set.model&.name } record_sets.each { |record_set| record_set.importable_model_names = model_names } diff --git a/test/models/account/export_test.rb b/test/models/account/export_test.rb index 4c7d261b9..9bb4bffaa 100644 --- a/test/models/account/export_test.rb +++ b/test/models/account/export_test.rb @@ -91,6 +91,46 @@ class Account::ExportTest < ActiveSupport::TestCase end end + test "build includes variant records and their attachments in zip" do + blob = ActiveStorage::Blob.create_and_upload!( + io: file_fixture("moon.jpg").open, + filename: "moon.jpg", + content_type: "image/jpeg" + ) + variant_record = ActiveStorage::VariantRecord.create!( + blob: blob, + variation_digest: "test_digest" + ) + variant_blob = ActiveStorage::Blob.create_and_upload!( + io: file_fixture("moon.jpg").open, + filename: "moon_variant.jpg", + content_type: "image/jpeg" + ) + ActiveStorage::Attachment.create!( + name: "image", + record: variant_record, + blob: variant_blob + ) + + export = Account::Export.create!(account: Current.account, user: users(:david)) + export.build + + assert export.completed? + export.file.open do |file| + reader = ZipKit::FileReader.read_zip_structure(io: file) + filenames = reader.map(&:filename) + + variant_entries = filenames.select { |f| f.start_with?("data/active_storage_variant_records/") } + variant_ids = variant_entries.map { |f| File.basename(f, ".json") } + assert_includes variant_ids, variant_record.id, "Export should include variant record" + + attachment_entries = filenames.select { |f| f.start_with?("data/active_storage_attachments/") } + attachment_ids = attachment_entries.map { |f| File.basename(f, ".json") } + variant_attachment = variant_record.reload.image_attachment + assert_includes attachment_ids, variant_attachment.id, "Export should include variant attachment" + end + end + test "build succeeds when rich text references missing blob" do blob = ActiveStorage::Blob.create_and_upload!( io: file_fixture("moon.jpg").open,