rails--rails/activestorage/lib/active_storage/fixture_set.rb

77 lines
2.7 KiB
Ruby

# frozen_string_literal: true
require "active_support/testing/file_fixtures"
require "active_record/secure_token"
module ActiveStorage
# Fixtures are a way of organizing data that you want to test against; in
# short, sample data.
#
# To learn more about fixtures, read the
# {ActiveRecord::FixtureSet}[rdoc-ref:ActiveRecord::FixtureSet] documentation.
#
# === YAML
#
# Like other Active Record-backed models,
# {ActiveStorage::Attachment}[rdoc-ref:ActiveStorage::Attachment] and
# {ActiveStorage::Blob}[rdoc-ref:ActiveStorage::Blob] records inherit from
# {ActiveRecord::Base}[rdoc-ref:ActiveRecord::Base] instances and therefore
# can be populated by fixtures.
#
# Consider a hypothetical <tt>Article</tt> model class, its related
# fixture data, as well as fixture data for related ActiveStorage::Attachment
# and ActiveStorage::Blob records:
#
# # app/models/article.rb
# class Article < ApplicationRecord
# has_one_attached :thumbnail
# end
#
# # fixtures/active_storage/blobs.yml
# first_thumbnail_blob: <%= ActiveStorage::FixtureSet.blob filename: "first.png" %>
#
# # fixtures/active_storage/attachments.yml
# first_thumbnail_attachment:
# name: thumbnail
# record: first (Article)
# blob: first_thumbnail_blob
#
# When processed, Active Record will insert database records for each fixture
# entry and will ensure the Active Storage relationship is intact.
class FixtureSet
include ActiveSupport::Testing::FileFixtures
include ActiveRecord::SecureToken
# Generate a YAML-encoded representation of an ActiveStorage::Blob
# instance's attributes, resolve the file relative to the directory mentioned
# by <tt>ActiveSupport::Testing::FileFixtures.file_fixture</tt>, and upload
# the file to the Service
#
# === Examples
#
# # tests/fixtures/action_text/blobs.yml
# second_thumbnail_blob: <%= ActiveStorage::FixtureSet.blob(
# filename: "second.svg",
# ) %>
#
# third_thumbnail_blob: <%= ActiveStorage::FixtureSet.blob(
# filename: "third.svg",
# content_type: "image/svg+xml",
# service_name: "public"
# ) %>
#
def self.blob(filename:, **attributes)
new.prepare Blob.new(filename: filename, key: generate_unique_secure_token), **attributes
end
def prepare(instance, **attributes)
io = file_fixture(instance.filename.to_s).open
instance.unfurl(io)
instance.assign_attributes(attributes)
instance.upload_without_unfurling(io)
instance.attributes.transform_values { |value| value.is_a?(Hash) ? value.to_json : value }.compact.to_json
end
end
end