@@ -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
550645end
0 commit comments