require 'test_helper' class GenericTest < MiniTest::Spec # TODO: rename/restructure to CollectionTest. let(:new_album) { OpenStruct.new.extend(representer) } let(:album) { OpenStruct.new(:songs => ["Fuck Armageddon"]).extend(representer) } let(:song) { OpenStruct.new(:title => "Resist Stance") } let(:song_representer) { Module.new do include Representable::Hash; property :title end } describe "::collection" do representer! do collection :songs end it "doesn't initialize property" do new_album.from_hash({}) _(new_album.songs).must_be_nil end it "leaves properties untouched" do album.from_hash({}) # TODO: test property. _(album.songs).must_equal ["Fuck Armageddon"] # when the collection is not present in the incoming hash, this propery stays untouched. end # when collection is nil, it doesn't get rendered: for_formats( :hash => [Representable::Hash, {}], :xml => [Representable::XML, ""], :yaml => [Representable::YAML, "--- {}\n"], # FIXME: this doesn't look right. ) do |format, mod, output, input| describe "nil collections" do let(:format) { format } representer!(:module => mod) do collection :songs self.representation_wrap = :album if format == :xml end let(:album) { Album.new.extend(representer) } it "doesn't render collection in #{format}" do render(album).must_equal_document output end end end # when collection is set but empty, render the empty collection. for_formats( :hash => [Representable::Hash, {"songs" => []}], #:xml => [Representable::XML, ""], :yaml => [Representable::YAML, "---\nsongs: []\n"], ) do |format, mod, output, input| describe "empty collections" do let(:format) { format } representer!(:module => mod) do collection :songs self.representation_wrap = :album if format == :xml end let(:album) { OpenStruct.new(:songs => []).extend(representer) } it "renders empty collection in #{format}" do render(album).must_equal_document output end end end # when collection is [], suppress rendering when render_empty: false. for_formats( :hash => [Representable::Hash, {}], #:xml => [Representable::XML, ""], :yaml => [Representable::YAML, "--- {}\n"], ) do |format, mod, output, input| describe "render_empty [#{format}]" do let(:format) { format } representer!(:module => mod) do collection :songs, :render_empty => false self.representation_wrap = :album if format == :xml end let(:album) { OpenStruct.new(:songs => []).extend(representer) } it { render(album).must_equal_document output } end end end # wrap_test for_formats( :hash => [Representable::Hash, {}], # :xml => [Representable::XML, "\n \n Alive\n \n", "You've Taken Everything/open_struct>"], # :yaml => [Representable::YAML, "---\nsong:\n name: Alive\n", "---\nsong:\n name: You've Taken Everything\n"], ) do |format, mod, input| describe "parsing [#{format}] with wrap where wrap is missing" do representer!(:module => mod) do self.representation_wrap = :song property :title end it "doesn't change represented object" do _(song.extend(representer).send("from_#{format}", input).title).must_equal "Resist Stance" end end end end