Class: ActiveStorage::FixtureSet

Inherits:
Object
  • Object
show all
Includes:
ActiveRecord::SecureToken, ActiveSupport::Testing::FileFixtures
Defined in:
lib/active_storage/fixture_set.rb

Overview

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 documentation.

YAML

Like other Active Record-backed models, ActiveStorage::Attachment and ActiveStorage::Blob records inherit from ActiveRecord::Base instances and therefore can be populated by fixtures.

Consider a hypothetical Article 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 Method Summary collapse

Instance Method Summary collapse

Class Method Details

.blob(filename:, **attributes) ⇒ Object

Generate a YAML-encoded representation of an ActiveStorage::Blob instance's attributes, resolve the file relative to the directory mentioned by ActiveSupport::Testing::FileFixtures.file_fixture, 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"
) %>


63
64
65
# File 'lib/active_storage/fixture_set.rb', line 63

def self.blob(filename:, **attributes)
  new.prepare Blob.new(filename: filename, key: generate_unique_secure_token), **attributes
end

Instance Method Details

#prepare(instance, **attributes) ⇒ Object



67
68
69
70
71
72
73
74
# File 'lib/active_storage/fixture_set.rb', line 67

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