representable 2.4.1 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +7 -12
- data/CHANGES.md +6 -27
- data/README.md +28 -1326
- data/lib/representable.rb +4 -14
- data/lib/representable/binding.rb +3 -7
- data/lib/representable/definition.rb +1 -2
- data/lib/representable/populator.rb +35 -0
- data/lib/representable/version.rb +1 -1
- data/test/definition_test.rb +0 -7
- data/test/exec_context_test.rb +2 -2
- data/test/instance_test.rb +0 -19
- data/test/realistic_benchmark.rb +0 -13
- data/test/representable_test.rb +0 -16
- data/test/skip_test.rb +1 -1
- data/test/test_helper.rb +0 -2
- metadata +3 -65
- data/lib/representable/deprecations.rb +0 -127
- data/lib/representable/parse_strategies.rb +0 -93
- data/test-with-deprecations/as_test.rb +0 -65
- data/test-with-deprecations/benchmarking.rb +0 -83
- data/test-with-deprecations/binding_test.rb +0 -46
- data/test-with-deprecations/blaaaaaaaa_test.rb +0 -69
- data/test-with-deprecations/cached_test.rb +0 -147
- data/test-with-deprecations/class_test.rb +0 -119
- data/test-with-deprecations/coercion_test.rb +0 -52
- data/test-with-deprecations/config/inherit_test.rb +0 -135
- data/test-with-deprecations/config_test.rb +0 -122
- data/test-with-deprecations/decorator_scope_test.rb +0 -28
- data/test-with-deprecations/decorator_test.rb +0 -96
- data/test-with-deprecations/default_test.rb +0 -34
- data/test-with-deprecations/defaults_options_test.rb +0 -93
- data/test-with-deprecations/definition_test.rb +0 -264
- data/test-with-deprecations/example.rb +0 -310
- data/test-with-deprecations/examples/object.rb +0 -31
- data/test-with-deprecations/exec_context_test.rb +0 -93
- data/test-with-deprecations/features_test.rb +0 -70
- data/test-with-deprecations/filter_test.rb +0 -57
- data/test-with-deprecations/for_collection_test.rb +0 -74
- data/test-with-deprecations/generic_test.rb +0 -116
- data/test-with-deprecations/getter_setter_test.rb +0 -21
- data/test-with-deprecations/hash_bindings_test.rb +0 -87
- data/test-with-deprecations/hash_test.rb +0 -160
- data/test-with-deprecations/heritage_test.rb +0 -62
- data/test-with-deprecations/if_test.rb +0 -79
- data/test-with-deprecations/include_exclude_test.rb +0 -88
- data/test-with-deprecations/inherit_test.rb +0 -159
- data/test-with-deprecations/inline_test.rb +0 -272
- data/test-with-deprecations/instance_test.rb +0 -266
- data/test-with-deprecations/is_representable_test.rb +0 -77
- data/test-with-deprecations/json_test.rb +0 -355
- data/test-with-deprecations/lonely_test.rb +0 -239
- data/test-with-deprecations/mongoid_test.rb +0 -31
- data/test-with-deprecations/nested_test.rb +0 -115
- data/test-with-deprecations/object_test.rb +0 -60
- data/test-with-deprecations/parse_pipeline_test.rb +0 -64
- data/test-with-deprecations/parse_strategy_test.rb +0 -279
- data/test-with-deprecations/pass_options_test.rb +0 -27
- data/test-with-deprecations/pipeline_test.rb +0 -277
- data/test-with-deprecations/populator_test.rb +0 -105
- data/test-with-deprecations/prepare_test.rb +0 -67
- data/test-with-deprecations/private_options_test.rb +0 -18
- data/test-with-deprecations/reader_writer_test.rb +0 -19
- data/test-with-deprecations/realistic_benchmark.rb +0 -115
- data/test-with-deprecations/render_nil_test.rb +0 -21
- data/test-with-deprecations/represent_test.rb +0 -88
- data/test-with-deprecations/representable_test.rb +0 -511
- data/test-with-deprecations/schema_test.rb +0 -148
- data/test-with-deprecations/serialize_deserialize_test.rb +0 -33
- data/test-with-deprecations/skip_test.rb +0 -81
- data/test-with-deprecations/stringify_hash_test.rb +0 -41
- data/test-with-deprecations/test_helper.rb +0 -135
- data/test-with-deprecations/test_helper_test.rb +0 -25
- data/test-with-deprecations/uncategorized_test.rb +0 -67
- data/test-with-deprecations/user_options_test.rb +0 -15
- data/test-with-deprecations/wrap_test.rb +0 -152
- data/test-with-deprecations/xml_bindings_test.rb +0 -62
- data/test-with-deprecations/xml_test.rb +0 -503
- data/test-with-deprecations/yaml_test.rb +0 -162
- data/test/parse_strategy_test.rb +0 -279
@@ -1,148 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
# Include Inherit Module And Decorator Test
|
4
|
-
class SchemaTest < MiniTest::Spec
|
5
|
-
module Genre
|
6
|
-
include Representable
|
7
|
-
property :genre
|
8
|
-
end
|
9
|
-
|
10
|
-
module LinkFeature
|
11
|
-
def self.included(base)
|
12
|
-
base.extend(Link)
|
13
|
-
end
|
14
|
-
|
15
|
-
module Link
|
16
|
-
def link
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
|
22
|
-
module Module
|
23
|
-
include Representable::Hash
|
24
|
-
feature LinkFeature
|
25
|
-
|
26
|
-
property :title
|
27
|
-
property :label do # extend: LabelModule
|
28
|
-
property :name
|
29
|
-
link # feature
|
30
|
-
|
31
|
-
property :location do
|
32
|
-
property :city
|
33
|
-
link # feature.
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
property :album, :extend => lambda { raise "don't manifest me!" } # this is not an inline decorator, don't manifest it.
|
38
|
-
|
39
|
-
|
40
|
-
include Genre # Schema::Included::included is called!
|
41
|
-
end
|
42
|
-
|
43
|
-
|
44
|
-
class WithLocationStreetRepresenter < Representable::Decorator
|
45
|
-
include Representable::Hash
|
46
|
-
feature LinkFeature
|
47
|
-
|
48
|
-
property :title
|
49
|
-
property :label do # extend: LabelModule
|
50
|
-
property :name
|
51
|
-
link # feature
|
52
|
-
|
53
|
-
property :location do
|
54
|
-
property :city
|
55
|
-
link # feature.
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe "3-level deep with features" do
|
61
|
-
let (:label) { OpenStruct.new(:name => "Epitaph", :location => OpenStruct.new(:city => "Sanfran", :name => "DON'T SHOW ME!")) }
|
62
|
-
|
63
|
-
# Module does correctly include features in inlines.
|
64
|
-
it { band.extend(Module).to_hash.must_equal({"label"=>{"name"=>"Epitaph", "location"=>{"city"=>"Sanfran"}}, "genre"=>"Punkrock"}) }
|
65
|
-
|
66
|
-
# Decorator does correctly include features in inlines.
|
67
|
-
it { Decorator.new(band).to_hash.must_equal({"label"=>{"name"=>"Epitaph", "location"=>{"city"=>"Sanfran"}}, "genre"=>"Punkrock"}) }
|
68
|
-
end
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
class Decorator < Representable::Decorator
|
73
|
-
feature Representable::Hash
|
74
|
-
|
75
|
-
include Module
|
76
|
-
end
|
77
|
-
|
78
|
-
# puts Decorator.representable_attrs[:definitions].inspect
|
79
|
-
|
80
|
-
let (:label) { OpenStruct.new(:name => "Fat Wreck", :city => "San Francisco", :employees => [OpenStruct.new(:name => "Mike")], :location => OpenStruct.new(:city => "Sanfran")) }
|
81
|
-
let (:band) { OpenStruct.new(:genre => "Punkrock", :label => label) }
|
82
|
-
|
83
|
-
|
84
|
-
# it { FlatlinersDecorator.new( OpenStruct.new(label: OpenStruct.new) ).
|
85
|
-
# to_hash.must_equal({}) }
|
86
|
-
it do
|
87
|
-
Decorator.new(band).to_hash.must_equal({"genre"=>"Punkrock", "label"=>{"name"=>"Fat Wreck", "location"=>{"city"=>"Sanfran"}}})
|
88
|
-
end
|
89
|
-
|
90
|
-
|
91
|
-
class InheritDecorator < Representable::Decorator
|
92
|
-
include Representable::Hash
|
93
|
-
|
94
|
-
include Module
|
95
|
-
|
96
|
-
property :label, inherit: true do # decorator.rb:27:in `initialize': superclass must be a Class (Module given)
|
97
|
-
property :city
|
98
|
-
|
99
|
-
property :location, :inherit => true do
|
100
|
-
property :city
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
it do
|
106
|
-
InheritDecorator.new(band).to_hash.must_equal({"genre"=>"Punkrock", "label"=>{"name"=>"Fat Wreck", "city"=>"San Francisco", "location"=>{"city"=>"Sanfran"}}})
|
107
|
-
end
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
class InheritFromDecorator < InheritDecorator
|
112
|
-
property :label, inherit: true do
|
113
|
-
collection :employees do
|
114
|
-
property :name
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
require "pp"
|
120
|
-
pp InheritFromDecorator.representable_attrs.get(:label)[:extend].(nil).representable_attrs
|
121
|
-
|
122
|
-
it do
|
123
|
-
InheritFromDecorator.new(band).to_hash.must_equal({"genre"=>"Punkrock", "label"=>{"name"=>"Fat Wreck", "city"=>"San Francisco", "employees"=>[{"name"=>"Mike"}], "location"=>{"city"=>"Sanfran"}}})
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
|
128
|
-
class ApplyTest < MiniTest::Spec
|
129
|
-
class AlbumDecorator < Representable::Decorator
|
130
|
-
include Representable::Hash
|
131
|
-
|
132
|
-
property :title
|
133
|
-
|
134
|
-
property :hit do
|
135
|
-
property :title
|
136
|
-
end
|
137
|
-
|
138
|
-
collection :songs do
|
139
|
-
property :title
|
140
|
-
end
|
141
|
-
|
142
|
-
property :band do # yepp, people do crazy stuff like that.
|
143
|
-
property :label do
|
144
|
-
property :name
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class SerializeDeserializeTest < BaseTest
|
4
|
-
subject { Struct.new(:song).new.extend(representer) }
|
5
|
-
|
6
|
-
describe "deserialize" do
|
7
|
-
representer! do
|
8
|
-
property :song,
|
9
|
-
:instance => lambda { |fragment, *| fragment.to_s.upcase },
|
10
|
-
:prepare => lambda { |fragment, *| fragment },
|
11
|
-
:deserialize => lambda { |object, fragment, args|
|
12
|
-
"#{object} #{fragment} #{args.inspect}"
|
13
|
-
}
|
14
|
-
end
|
15
|
-
|
16
|
-
it { subject.from_hash({"song" => Object}, {:volume => 9}).song.must_equal "OBJECT Object {:volume=>9}" }
|
17
|
-
end
|
18
|
-
|
19
|
-
describe "serialize" do
|
20
|
-
representer! do
|
21
|
-
property :song,
|
22
|
-
:representable => true,
|
23
|
-
:prepare => lambda { |fragment, *| fragment },
|
24
|
-
:serialize => lambda { |object, args|
|
25
|
-
"#{object} #{args.inspect}"
|
26
|
-
}
|
27
|
-
end
|
28
|
-
|
29
|
-
before { subject.song = "Arrested In Shanghai" }
|
30
|
-
|
31
|
-
it { subject.to_hash({:volume => 9}).must_equal({"song"=>"Arrested In Shanghai {:volume=>9}"}) }
|
32
|
-
end
|
33
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class SkipParseTest < MiniTest::Spec
|
4
|
-
representer! do
|
5
|
-
property :title, skip_parse: lambda { |fragment, opts| opts[:skip?] and fragment == "skip me" }
|
6
|
-
property :band,
|
7
|
-
skip_parse: lambda { |fragment, opts| opts[:skip?] and fragment["name"].nil? }, class: OpenStruct do
|
8
|
-
property :name
|
9
|
-
end
|
10
|
-
|
11
|
-
collection :airplays,
|
12
|
-
skip_parse: lambda { |fragment, opts| opts[:skip?] and fragment["station"].nil? }, class: OpenStruct do
|
13
|
-
property :station
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
let (:song) { OpenStruct.new.extend(representer) }
|
18
|
-
|
19
|
-
# do parse.
|
20
|
-
it do
|
21
|
-
song.from_hash({
|
22
|
-
"title" => "Victim Of Fate",
|
23
|
-
"band" => {"name" => "Mute 98"},
|
24
|
-
"airplays" => [{"station" => "JJJ"}]
|
25
|
-
}, skip?: true)
|
26
|
-
|
27
|
-
song.title.must_equal "Victim Of Fate"
|
28
|
-
song.band.name.must_equal "Mute 98"
|
29
|
-
song.airplays[0].station.must_equal "JJJ"
|
30
|
-
end
|
31
|
-
|
32
|
-
# skip parsing.
|
33
|
-
let (:airplay) { OpenStruct.new(station: "JJJ") }
|
34
|
-
|
35
|
-
it do
|
36
|
-
song.from_hash({
|
37
|
-
"title" => "skip me",
|
38
|
-
"band" => {},
|
39
|
-
"airplays" => [{"station" => "JJJ"}, {}],
|
40
|
-
}, skip?: true)
|
41
|
-
|
42
|
-
song.title.must_equal nil
|
43
|
-
song.band.must_equal nil
|
44
|
-
song.airplays.must_equal [airplay]
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
class SkipRenderTest < MiniTest::Spec
|
49
|
-
representer! do
|
50
|
-
property :title
|
51
|
-
property :band,
|
52
|
-
skip_render: lambda { |object, opts| opts[:skip?] and object.name == "Rancid" } do
|
53
|
-
property :name
|
54
|
-
end
|
55
|
-
|
56
|
-
collection :airplays,
|
57
|
-
skip_render: lambda { |object, opts| puts object.inspect; opts[:skip?] and object.station == "Radio Dreyeckland" } do
|
58
|
-
property :station
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
let (:song) { OpenStruct.new(title: "Black Night", band: OpenStruct.new(name: "Time Again")).extend(representer) }
|
63
|
-
let (:skip_song) { OpenStruct.new(title: "Time Bomb", band: OpenStruct.new(name: "Rancid")).extend(representer) }
|
64
|
-
|
65
|
-
# do render.
|
66
|
-
it { song.to_hash(skip?: true).must_equal({"title"=>"Black Night", "band"=>{"name"=>"Time Again"}}) }
|
67
|
-
# skip.
|
68
|
-
it { skip_song.to_hash(skip?: true).must_equal({"title"=>"Time Bomb"}) }
|
69
|
-
|
70
|
-
# do render all collection items.
|
71
|
-
it do
|
72
|
-
song = OpenStruct.new(airplays: [OpenStruct.new(station: "JJJ"), OpenStruct.new(station: "ABC")]).extend(representer)
|
73
|
-
song.to_hash(skip?: true).must_equal({"airplays"=>[{"station"=>"JJJ"}, {"station"=>"ABC"}]})
|
74
|
-
end
|
75
|
-
|
76
|
-
# skip middle item.
|
77
|
-
it do
|
78
|
-
song = OpenStruct.new(airplays: [OpenStruct.new(station: "JJJ"), OpenStruct.new(station: "Radio Dreyeckland"), OpenStruct.new(station: "ABC")]).extend(representer)
|
79
|
-
song.to_hash(skip?: true).must_equal({"airplays"=>[{"station"=>"JJJ"}, {"station"=>"ABC"}]})
|
80
|
-
end
|
81
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class StringifyHashTest < MiniTest::Spec
|
4
|
-
describe "#from_hash" do
|
5
|
-
representer!(:name => :song_representer) do
|
6
|
-
|
7
|
-
include Representable::Hash
|
8
|
-
include Representable::Hash::AllowSymbols
|
9
|
-
|
10
|
-
property :title
|
11
|
-
end
|
12
|
-
|
13
|
-
representer!(:inject => :song_representer) do
|
14
|
-
include Representable::Hash::AllowSymbols
|
15
|
-
|
16
|
-
property :song, :extend => song_representer, :class => OpenStruct
|
17
|
-
end
|
18
|
-
|
19
|
-
it "parses symbols, too" do
|
20
|
-
OpenStruct.new.extend(representer).from_hash({:song => {:title => "Der Optimist"}}).song.title.must_equal "Der Optimist"
|
21
|
-
end
|
22
|
-
|
23
|
-
it "still parses strings" do
|
24
|
-
OpenStruct.new.extend(representer).from_hash({"song" => {"title" => "Der Optimist"}}).song.title.must_equal "Der Optimist"
|
25
|
-
end
|
26
|
-
|
27
|
-
describe "with :wrap" do
|
28
|
-
representer!(:inject => :song_representer) do
|
29
|
-
include Representable::Hash::AllowSymbols
|
30
|
-
|
31
|
-
self.representation_wrap = :album
|
32
|
-
property :song, :extend => song_representer, :class => OpenStruct
|
33
|
-
end
|
34
|
-
|
35
|
-
it "parses symbols, too" do
|
36
|
-
OpenStruct.new.extend(representer).from_hash({:album => {:song => {:title => "Der Optimist"}}}).song.title.must_equal "Der Optimist"
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
@@ -1,135 +0,0 @@
|
|
1
|
-
require 'representable'
|
2
|
-
|
3
|
-
require "json"
|
4
|
-
require "psych"
|
5
|
-
|
6
|
-
require 'representable/json'
|
7
|
-
require 'representable/xml'
|
8
|
-
require 'representable/yaml'
|
9
|
-
require 'minitest/autorun'
|
10
|
-
require 'test_xml/mini_test'
|
11
|
-
|
12
|
-
require "representable/debug"
|
13
|
-
|
14
|
-
class Album
|
15
|
-
attr_accessor :songs, :best_song
|
16
|
-
def initialize(songs=nil, best_song=nil)
|
17
|
-
@songs = songs
|
18
|
-
@best_song = best_song
|
19
|
-
end
|
20
|
-
|
21
|
-
def ==(other)
|
22
|
-
songs == other.songs and best_song == other.best_song
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
class Song
|
27
|
-
attr_accessor :name, :track # never change this, track rendered with Rails#to_json.
|
28
|
-
def initialize(name=nil, track=nil)
|
29
|
-
@name = name
|
30
|
-
@track = track
|
31
|
-
end
|
32
|
-
|
33
|
-
def ==(other)
|
34
|
-
name == other.name and track == other.track
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
module XmlHelper
|
39
|
-
def xml(document)
|
40
|
-
Nokogiri::XML(document).root
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
module AssertJson
|
45
|
-
module Assertions
|
46
|
-
def assert_json(expected, actual, msg=nil)
|
47
|
-
msg = message(msg, "") { diff expected, actual }
|
48
|
-
assert(expected.split("").sort == actual.split("").sort, msg)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
MiniTest::Spec.class_eval do
|
54
|
-
include AssertJson::Assertions
|
55
|
-
include XmlHelper
|
56
|
-
|
57
|
-
def self.for_formats(formats)
|
58
|
-
formats.each do |format, cfg|
|
59
|
-
mod, output, input = cfg
|
60
|
-
yield format, mod, output, input
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def render(object, *args)
|
65
|
-
AssertableDocument.new(object.send("to_#{format}", *args), format)
|
66
|
-
end
|
67
|
-
|
68
|
-
def parse(object, input, *args)
|
69
|
-
object.send("from_#{format}", input, *args)
|
70
|
-
end
|
71
|
-
|
72
|
-
class AssertableDocument
|
73
|
-
attr_reader :document
|
74
|
-
|
75
|
-
def initialize(document, format)
|
76
|
-
@document, @format = document, format
|
77
|
-
end
|
78
|
-
|
79
|
-
def must_equal_document(*args)
|
80
|
-
return document.must_equal_xml(*args) if @format == :xml
|
81
|
-
document.must_equal(*args)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def self.representer!(options={}, &block)
|
86
|
-
fmt = options # we need that so the 2nd call to ::let (within a ::describe) remembers the right format.
|
87
|
-
|
88
|
-
name = options[:name] || :representer
|
89
|
-
format = options[:module] || Representable::Hash
|
90
|
-
|
91
|
-
let(name) do
|
92
|
-
mod = options[:decorator] ? Class.new(Representable::Decorator) : Module.new
|
93
|
-
|
94
|
-
inject_representer(mod, fmt)
|
95
|
-
|
96
|
-
mod.module_eval do
|
97
|
-
include format
|
98
|
-
instance_exec(&block)
|
99
|
-
end
|
100
|
-
|
101
|
-
mod
|
102
|
-
end
|
103
|
-
|
104
|
-
def inject_representer(mod, options)
|
105
|
-
return unless options[:inject]
|
106
|
-
|
107
|
-
injected_name = options[:inject]
|
108
|
-
injected = send(injected_name) # song_representer
|
109
|
-
mod.singleton_class.instance_eval do
|
110
|
-
define_method(injected_name) { injected }
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
module TestMethods
|
116
|
-
def representer_for(modules=[Representable::Hash], &block)
|
117
|
-
Module.new do
|
118
|
-
extend TestMethods
|
119
|
-
include *modules
|
120
|
-
module_exec(&block)
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
alias_method :representer!, :representer_for
|
125
|
-
end
|
126
|
-
include TestMethods
|
127
|
-
end
|
128
|
-
|
129
|
-
class BaseTest < MiniTest::Spec
|
130
|
-
let (:new_album) { OpenStruct.new.extend(representer) }
|
131
|
-
let (:album) { OpenStruct.new(:songs => ["Fuck Armageddon"]).extend(representer) }
|
132
|
-
let (:song) { OpenStruct.new(:title => "Resist Stance") }
|
133
|
-
let (:song_representer) { Module.new do include Representable::Hash; property :title end }
|
134
|
-
|
135
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class TestHelperTest < MiniTest::Spec
|
4
|
-
describe "#assert_json" do
|
5
|
-
it "tests for equality" do
|
6
|
-
assert_json "{\"songs\":{\"one\":\"65\",\"two\":\"Emo Boy\"}}", "{\"songs\":{\"one\":\"65\",\"two\":\"Emo Boy\"}}"
|
7
|
-
end
|
8
|
-
|
9
|
-
it "allows different key orders" do
|
10
|
-
assert_json "{\"songs\":{\"one\":\"65\",\"two\":\"Emo Boy\"}}", "{\"songs\":{\"two\":\"Emo Boy\",\"one\":\"65\"}}"
|
11
|
-
end
|
12
|
-
|
13
|
-
it "complains when expected hash is subset" do
|
14
|
-
assert_raises MiniTest::Assertion do
|
15
|
-
assert_json "{\"songs\":{\"one\":\"65\"}}", "{\"songs\":{\"two\":\"Emo Boy\",\"one\":\"65\"}}"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
it "complains when source hash is subset" do
|
20
|
-
assert_raises MiniTest::Assertion do
|
21
|
-
assert_json "{\"songs\":{\"two\":\"Emo Boy\",\"one\":\"65\"}}", "{\"songs\":{\"one\":\"65\"}}"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|