Skip to content

Commit 87a1764

Browse files
committed
Add tests for child relations support
Fix Attacher#atomic_persist for embeded models. TODO: Fix nested atributes with cascade_callbacks support.
1 parent 4ceef53 commit 87a1764

2 files changed

Lines changed: 98 additions & 1 deletion

File tree

lib/shrine/plugins/mongoid.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ def mongoid_reload
100100
record_copy = record.dup
101101
record_copy.id = record.id
102102

103-
yield record_copy.reload
103+
record_copy.reload unless record_copy.embedded?
104+
105+
yield record_copy
104106
end
105107

106108
# Returns true if the data attribute represents a Hash field. Used by

test/mongoid_test.rb

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,4 +547,99 @@ def validate
547547
end
548548
end
549549
end
550+
551+
describe "child relations support" do
552+
before do
553+
User = @user.class
554+
Photo = Class.new {
555+
include Mongoid::Document
556+
field :title, type: String
557+
field :image_data, type: Hash
558+
}
559+
Photo.include @shrine::Attachment.new(:image)
560+
end
561+
562+
after do
563+
Object.send(:remove_const, "Photo")
564+
Object.send(:remove_const, "User")
565+
end
566+
567+
describe "nested attributes support" do
568+
describe "for referenced models" do
569+
before do
570+
Photo.store_in collection: "photos"
571+
Photo.belongs_to :user
572+
User.has_many :photos, dependent: :destroy
573+
User.accepts_nested_attributes_for :photos, allow_destroy: true
574+
end
575+
576+
it "stores files for nested models" do
577+
user = User.create!(name: "Moe")
578+
user.update!(photos_attributes: [{ image: fakeio }])
579+
photo = user.photos.first
580+
assert photo.image_data["storage"] == "store"
581+
end
582+
583+
describe "and not yet existing parent" do
584+
it "stores files for nested models" do
585+
user =
586+
User.create!(name: "Moe", photos_attributes: [{ image: fakeio }])
587+
photo = user.photos.first
588+
assert photo.image_data["storage"] == "store"
589+
end
590+
end
591+
end
592+
593+
describe "for embedded models" do
594+
before do
595+
Photo.embedded_in :user
596+
User.embeds_many :photos, cascade_callbacks: true
597+
User.accepts_nested_attributes_for :photos, allow_destroy: true
598+
end
599+
600+
it "stores files for nested models" do
601+
user = User.create!(name: "Jacob")
602+
user.update!(photos_attributes: [{ image: fakeio }])
603+
photo = user.photos.first
604+
assert photo.image_data["storage"] == "store"
605+
end
606+
607+
describe "and not yet existing parent" do
608+
it "stores files for nested models" do
609+
user = User.create!(name: "Moe",
610+
photos_attributes: [{ image: fakeio }])
611+
photo = user.photos.first
612+
assert photo.image_data["storage"] == :store
613+
end
614+
end
615+
end
616+
end
617+
618+
619+
describe "(embedded)" do
620+
before do
621+
Photo.embedded_in :user
622+
User.embeds_one :photo, cascade_callbacks: true
623+
end
624+
625+
describe "Attacher" do
626+
describe "#atomic_persist" do
627+
it "persists the record" do
628+
photo = Photo.new(user: @user)
629+
attacher = @shrine::Attacher.from_model(photo, :image)
630+
631+
file = attacher.attach(fakeio)
632+
photo.save
633+
634+
photo.title = "me"
635+
attacher.atomic_persist
636+
637+
assert_equal "me", photo.title
638+
assert_equal "me", @user.reload.photo.title
639+
assert_equal file, attacher.file
640+
end
641+
end
642+
end
643+
end
644+
end
550645
end

0 commit comments

Comments
 (0)