Merge pull request #2746 from basecamp/fix-exports

Permit variant records in imports
This commit is contained in:
Stanko Krtalić
2026-03-23 12:50:24 +01:00
committed by GitHub
2 changed files with 49 additions and 4 deletions
+9 -4
View File
@@ -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 }
+40
View File
@@ -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,