require "test_helper" class WrapTest < MiniTest::Spec class HardcoreBand include Representable::Hash end class SoftcoreBand < HardcoreBand end let(:band) { HardcoreBand.new } it "returns false per default" do assert_nil SoftcoreBand.new.send(:representation_wrap) end it "infers a printable class name if set to true" do HardcoreBand.representation_wrap = true assert_equal "hardcore_band", band.send(:representation_wrap) end it "can be set explicitely" do HardcoreBand.representation_wrap = "breach" assert_equal "breach", band.send(:representation_wrap) end for_formats( :hash => [Representable::Hash, {"Blink182"=>{"genre"=>"Pop"}}, {"Blink182"=>{"genre"=>"Poppunk"}}], :json => [Representable::JSON, "{\"Blink182\":{\"genre\":\"Pop\"}}", "{\"Blink182\":{\"genre\":\"Poppunk\"}}"], :xml => [Representable::XML, "Pop", "Poppunk"], # :yaml => [Representable::YAML, "---\nBlink182:\n"], # TODO: fix YAML. ) do |format, mod, output, input| describe "[#{format}] dynamic wrap" do let(:band) { representer.prepare(Struct.new(:name, :genre).new("Blink", "Pop")) } let(:format) { format } representer!(:module => mod) do self.representation_wrap = lambda { |number:, **| "#{name}#{number}" } property :genre end it { render(band, {:number => 182}).must_equal_document(output) } it { _(parse(band, input, {:number => 182}).genre).must_equal "Poppunk" } # TODO: better test. also, xml parses _any_ wrap. end end end class HashDisableWrapTest < MiniTest::Spec Band = Struct.new(:name, :label) Album = Struct.new(:band) Label = Struct.new(:name) class BandDecorator < Representable::Decorator include Representable::Hash self.representation_wrap = :bands property :name property :label do # this should have a wrap! self.representation_wrap = :important property :name end end let(:band) { BandDecorator.prepare(Band.new("Social Distortion")) } # direct, local api. it do _(band.to_hash).must_equal({"bands" => {"name"=>"Social Distortion"}}) _(band.to_hash(wrap: false)).must_equal({"name"=>"Social Distortion"}) _(band.to_hash(wrap: :band)).must_equal(:band=>{"name"=>"Social Distortion"}) end it do _(band.from_hash({"bands" => {"name"=>"Social Distortion"}}).name).must_equal "Social Distortion" _(band.from_hash({"name"=>"Social Distortion"}, wrap: false).name).must_equal "Social Distortion" _(band.from_hash({band: {"name"=>"Social Distortion"}}, wrap: :band).name).must_equal "Social Distortion" end class AlbumDecorator < Representable::Decorator include Representable::Hash self.representation_wrap = :albums property :band, decorator: BandDecorator, wrap: false, class: Band end let(:album) { AlbumDecorator.prepare(Album.new(Band.new("Social Distortion", Label.new("Epitaph")))) } # band has wrap turned off per property definition, however, label still has wrap. it "renders" do _(album.to_hash).must_equal({"albums" => {"band" => {"name"=>"Social Distortion", "label"=>{"important"=>{"name"=>"Epitaph"}}}}}) end it "parses" do _(album.from_hash({"albums" => {"band" => {"name"=>"Rvivr"}}}).band.name).must_equal "Rvivr" end end class XMLDisableWrapTest < MiniTest::Spec Band = Struct.new(:name, :label) Album = Struct.new(:band) Label = Struct.new(:name) class BandDecorator < Representable::Decorator include Representable::XML self.representation_wrap = :bands # when nested, it uses this. property :name # property :label do # this should have a wrap! # self.representation_wrap = :important # property :name # end end let(:band) { BandDecorator.prepare(Band.new("Social Distortion")) } it do band.to_xml.must_equal_xml "Social Distortion" band.to_xml(wrap: "combo").must_equal_xml "Social Distortion" end class AlbumDecorator < Representable::Decorator include Representable::XML self.representation_wrap = :albums property :band, decorator: BandDecorator, wrap: "po", class: Band end let(:album) { AlbumDecorator.prepare(Album.new(Band.new("Social Distortion", Label.new("Epitaph")))) } # band has wrap turned of per property definition, however, label still has wrap. it "rendersxx" do skip _(album.to_xml).must_equal({"albums" => {"band" => {"name"=>"Social Distortion", "label"=>{"important"=>{"name"=>"Epitaph"}}}}}) end # it "parses" do # album.from_hash({"albums" => {"band" => {"name"=>"Rvivr"}}}).band.name.must_equal "Rvivr" # end end