representable 3.0.3 → 3.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -1
- data/CHANGES.md +5 -0
- data/README.md +1 -1
- data/TODO +1 -3
- data/TODO-4.0.md +72 -0
- data/lib/representable/declarative.rb +3 -3
- data/lib/representable/deserializer.rb +1 -1
- data/lib/representable/serializer.rb +1 -1
- data/lib/representable/version.rb +1 -1
- data/lib/representable/xml.rb +6 -4
- data/lib/representable/xml/binding.rb +19 -12
- data/lib/representable/xml/namespace.rb +122 -0
- data/representable.gemspec +2 -2
- data/test/as_test.rb +2 -2
- data/test/binding_test.rb +7 -7
- data/test/cached_test.rb +13 -13
- data/test/class_test.rb +2 -2
- data/test/coercion_test.rb +1 -1
- data/test/config_test.rb +5 -5
- data/test/decorator_scope_test.rb +1 -1
- data/test/decorator_test.rb +8 -8
- data/test/default_test.rb +1 -1
- data/test/defaults_options_test.rb +3 -3
- data/test/definition_test.rb +9 -11
- data/test/examples/object.rb +1 -5
- data/test/exec_context_test.rb +2 -2
- data/test/features_test.rb +3 -3
- data/test/filter_test.rb +2 -2
- data/test/for_collection_test.rb +8 -8
- data/test/generic_test.rb +11 -11
- data/test/hash_bindings_test.rb +1 -1
- data/test/hash_test.rb +13 -13
- data/test/heritage_test.rb +16 -13
- data/test/if_test.rb +3 -3
- data/test/include_exclude_test.rb +2 -2
- data/test/inherit_test.rb +3 -3
- data/test/inline_test.rb +13 -13
- data/test/instance_test.rb +2 -2
- data/test/json_test.rb +4 -6
- data/test/lonely_test.rb +15 -15
- data/test/nested_test.rb +6 -6
- data/test/object_test.rb +4 -4
- data/test/parse_pipeline_test.rb +0 -2
- data/test/pipeline_test.rb +7 -7
- data/test/populator_test.rb +7 -7
- data/test/prepare_test.rb +2 -2
- data/test/represent_test.rb +10 -10
- data/test/representable_test.rb +7 -7
- data/test/schema_test.rb +3 -6
- data/test/skip_test.rb +6 -6
- data/test/test_helper.rb +16 -6
- data/test/wrap_test.rb +8 -8
- data/test/xml_namespace_test.rb +186 -0
- data/test/xml_test.rb +53 -34
- data/test/yaml_test.rb +11 -11
- metadata +9 -7
- data/lib/representable/TODO.getting_serious +0 -11
data/test/cached_test.rb
CHANGED
@@ -53,15 +53,15 @@ class CachedTest < MiniTest::Spec
|
|
53
53
|
|
54
54
|
|
55
55
|
describe "serialization" do
|
56
|
-
let
|
56
|
+
let(:album_hash) { {"name"=>"Louder And Even More Dangerous", "songs"=>[{"title"=>"Southbound:{:volume=>10}"}, {"title"=>"Jailbreak:{:volume=>10}"}]} }
|
57
57
|
|
58
|
-
let
|
59
|
-
let
|
60
|
-
let
|
61
|
-
let
|
58
|
+
let(:song) { Model::Song.new("Jailbreak") }
|
59
|
+
let(:song2) { Model::Song.new("Southbound") }
|
60
|
+
let(:album) { Model::Album.new("Live And Dangerous", [song, song2, Model::Song.new("Emerald")]) }
|
61
|
+
let(:representer) { AlbumRepresenter.new(album) }
|
62
62
|
|
63
63
|
it do
|
64
|
-
album2 = Model::Album.new("Louder And Even More Dangerous", [song2, song])
|
64
|
+
# album2 = Model::Album.new("Louder And Even More Dangerous", [song2, song])
|
65
65
|
|
66
66
|
# makes sure options are passed correctly.
|
67
67
|
representer.to_hash(user_options: {volume: 9}).must_equal({"name"=>"Live And Dangerous",
|
@@ -81,20 +81,20 @@ class CachedTest < MiniTest::Spec
|
|
81
81
|
data = Profiler.profile { representer.to_hash }
|
82
82
|
|
83
83
|
# 3 songs get decorated.
|
84
|
-
data.must_match
|
84
|
+
data.must_match(/3\s*Representable::Function::Decorate#call/m)
|
85
85
|
# These weird Regexp bellow are a quick workaround to accomodate
|
86
86
|
# the different profiler result formats.
|
87
87
|
# - "3 <Class::Representable::Decorator>#prepare" -> At MRI Ruby
|
88
88
|
# - "3 Representable::Decorator.prepare" -> At JRuby
|
89
89
|
|
90
90
|
# 3 nested decorator is instantiated for 3 Songs, though.
|
91
|
-
data.must_match
|
91
|
+
data.must_match(/3\s*(<Class::)?Representable::Decorator\>?[\#.]prepare/m)
|
92
92
|
# no Binding is instantiated at runtime.
|
93
93
|
data.wont_match "Representable::Binding#initialize"
|
94
94
|
# 2 mappers for Album, Song
|
95
95
|
# data.must_match "2 Representable::Mapper::Methods#initialize"
|
96
96
|
# title, songs, 3x title, composer
|
97
|
-
data.must_match
|
97
|
+
data.must_match(/8\s*Representable::Binding[#\.]render_pipeline/m)
|
98
98
|
data.wont_match "render_functions"
|
99
99
|
data.wont_match "Representable::Binding::Factories#render_functions"
|
100
100
|
end
|
@@ -102,7 +102,7 @@ class CachedTest < MiniTest::Spec
|
|
102
102
|
|
103
103
|
|
104
104
|
describe "deserialization" do
|
105
|
-
let
|
105
|
+
let(:album_hash) {
|
106
106
|
{
|
107
107
|
"name"=>"Louder And Even More Dangerous",
|
108
108
|
"songs"=>[
|
@@ -125,7 +125,7 @@ class CachedTest < MiniTest::Spec
|
|
125
125
|
album.songs[1].title.must_equal "Jailbreak"
|
126
126
|
album.songs[1].composer.name.must_equal "Phil Lynott"
|
127
127
|
album.songs[2].title.must_equal "Emerald"
|
128
|
-
album.songs[2].composer.
|
128
|
+
album.songs[2].composer.must_be_nil
|
129
129
|
|
130
130
|
# TODO: test options.
|
131
131
|
end
|
@@ -139,12 +139,12 @@ class CachedTest < MiniTest::Spec
|
|
139
139
|
# only 2 nested decorators are instantiated, Song, and Artist.
|
140
140
|
# Didn't like the regexp?
|
141
141
|
# MRI and JRuby has different output formats. See note above.
|
142
|
-
data.must_match
|
142
|
+
data.must_match(/5\s*(<Class::)?Representable::Decorator>?[#\.]prepare/)
|
143
143
|
# a total of 5 properties in the object graph.
|
144
144
|
data.wont_match "Representable::Binding#initialize"
|
145
145
|
|
146
146
|
data.wont_match "parse_functions" # no pipeline creation.
|
147
|
-
data.must_match
|
147
|
+
data.must_match(/10\s*Representable::Binding[#\.]parse_pipeline/)
|
148
148
|
# three mappers for Album, Song, composer
|
149
149
|
# data.must_match "3 Representable::Mapper::Methods#initialize"
|
150
150
|
# # 6 deserializers as the songs collection uses 2.
|
data/test/class_test.rb
CHANGED
@@ -54,7 +54,7 @@ class ClassTest < BaseTest
|
|
54
54
|
|
55
55
|
|
56
56
|
describe "lambda receiving fragment and args" do
|
57
|
-
let
|
57
|
+
let(:klass) { Class.new do
|
58
58
|
class << self
|
59
59
|
attr_accessor :args
|
60
60
|
end
|
@@ -75,7 +75,7 @@ class ClassTest < BaseTest
|
|
75
75
|
|
76
76
|
|
77
77
|
describe "collection: lambda receiving fragment and args" do
|
78
|
-
let
|
78
|
+
let(:klass) { Class.new do
|
79
79
|
class << self
|
80
80
|
attr_accessor :args
|
81
81
|
end
|
data/test/coercion_test.rb
CHANGED
@@ -17,7 +17,7 @@ class VirtusCoercionTest < MiniTest::Spec
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
let
|
20
|
+
let(:album) { OpenStruct.new(:title => "Dire Straits", :length => 41.34,
|
21
21
|
:band => OpenStruct.new(:founded => "1977"),
|
22
22
|
:songs => [OpenStruct.new(:ok => 1), OpenStruct.new(:ok => 0)]) }
|
23
23
|
|
data/test/config_test.rb
CHANGED
@@ -7,7 +7,7 @@ class ConfigTest < MiniTest::Spec
|
|
7
7
|
|
8
8
|
describe "wrapping" do
|
9
9
|
it "returns false per default" do
|
10
|
-
|
10
|
+
assert_nil subject.wrap_for("Punk", nil)
|
11
11
|
end
|
12
12
|
|
13
13
|
# it "infers a printable class name if set to true" do
|
@@ -23,13 +23,13 @@ class ConfigTest < MiniTest::Spec
|
|
23
23
|
|
24
24
|
describe "#[]" do
|
25
25
|
# does return nil for non-existent
|
26
|
-
it { subject[:hello].
|
26
|
+
it { subject[:hello].must_be_nil }
|
27
27
|
end
|
28
28
|
|
29
29
|
# describe "#[]" do
|
30
30
|
# before { subject.add(:title, {:me => true}) }
|
31
31
|
|
32
|
-
# it { subject[:unknown].
|
32
|
+
# it { subject[:unknown].must_be_nil }
|
33
33
|
# it { subject.get(:title)[:me].must_equal true }
|
34
34
|
# it { subject["title"][:me].must_equal true }
|
35
35
|
# end
|
@@ -59,7 +59,7 @@ class ConfigTest < MiniTest::Spec
|
|
59
59
|
# this is actually tested in context in inherit_test.
|
60
60
|
it "overrides former definition" do
|
61
61
|
subject.add(:title, {:peer => Module})
|
62
|
-
subject.get(:title)[:me].
|
62
|
+
subject.get(:title)[:me].must_be_nil
|
63
63
|
subject.get(:title)[:peer].must_equal Module
|
64
64
|
end
|
65
65
|
|
@@ -84,7 +84,7 @@ class ConfigTest < MiniTest::Spec
|
|
84
84
|
subject.get(:genre).must_be_kind_of Representable::Definition
|
85
85
|
|
86
86
|
subject.remove(:genre)
|
87
|
-
subject.get(:genre).
|
87
|
+
subject.get(:genre).must_be_nil
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
@@ -6,7 +6,7 @@ class DecoratorScopeTest < MiniTest::Spec
|
|
6
6
|
property :title, :getter => lambda { |*| title_from_representer }, :decorator_scope => true
|
7
7
|
end
|
8
8
|
|
9
|
-
let
|
9
|
+
let(:representer_with_method) {
|
10
10
|
Module.new do
|
11
11
|
include Representable::Hash
|
12
12
|
property :title, :decorator_scope => true
|
data/test/decorator_test.rb
CHANGED
@@ -19,13 +19,13 @@ class DecoratorTest < MiniTest::Spec
|
|
19
19
|
property :value
|
20
20
|
end
|
21
21
|
|
22
|
-
let
|
23
|
-
let
|
22
|
+
let(:song) { Song.new("Mama, I'm Coming Home") }
|
23
|
+
let(:album) { Album.new([song]) }
|
24
24
|
|
25
|
-
let
|
25
|
+
let(:rating) { OpenStruct.new(system: 'MPAA', value: 'R') }
|
26
26
|
|
27
27
|
describe "inheritance" do
|
28
|
-
let
|
28
|
+
let(:inherited_decorator) do
|
29
29
|
Class.new(AlbumRepresentation) do
|
30
30
|
property :best_song
|
31
31
|
end.new(Album.new([song], "Stand Up"))
|
@@ -34,7 +34,7 @@ class DecoratorTest < MiniTest::Spec
|
|
34
34
|
it { inherited_decorator.to_hash.must_equal({"songs"=>[{"name"=>"Mama, I'm Coming Home"}], "best_song"=>"Stand Up"}) }
|
35
35
|
end
|
36
36
|
|
37
|
-
let
|
37
|
+
let(:decorator) { AlbumRepresentation.new(album) }
|
38
38
|
|
39
39
|
let(:rating_decorator) { RatingRepresentation.new(rating) }
|
40
40
|
|
@@ -43,7 +43,7 @@ class DecoratorTest < MiniTest::Spec
|
|
43
43
|
album.wont_respond_to :to_hash
|
44
44
|
song.wont_respond_to :to_hash # DISCUSS: weak test, how to assert blank slate?
|
45
45
|
# no @representable_attrs in decorated objects
|
46
|
-
song.
|
46
|
+
song.wont_be(:instance_variable_defined?, :@representable_attrs)
|
47
47
|
|
48
48
|
rating_decorator.to_hash.must_equal({"system" => "MPAA", "value" => "R"})
|
49
49
|
end
|
@@ -80,8 +80,8 @@ class DecoratorTest < MiniTest::Spec
|
|
80
80
|
representer.new(album).from_hash({"songs"=>[{"name"=>"Atomic Garden"}]})
|
81
81
|
|
82
82
|
# no @representable_attrs in decorated objects
|
83
|
-
song.
|
84
|
-
album.
|
83
|
+
song.wont_be(:instance_variable_defined?, :@representable_attrs)
|
84
|
+
album.wont_be(:instance_variable_defined?, :@representable_attrs)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
end
|
data/test/default_test.rb
CHANGED
@@ -9,7 +9,7 @@ class DefaultTest < MiniTest::Spec
|
|
9
9
|
end
|
10
10
|
|
11
11
|
describe "#from_hash" do
|
12
|
-
let
|
12
|
+
let(:song) { Song.new.extend(representer) }
|
13
13
|
|
14
14
|
it { song.from_hash({}).must_equal Song.new(nil, "Huber Breeze") }
|
15
15
|
# default doesn't apply when empty string.
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DefaultsOptionsTest < BaseTest
|
4
|
-
let
|
5
|
-
let
|
6
|
-
let
|
4
|
+
let(:format) { :hash }
|
5
|
+
let(:song) { Struct.new(:title, :author_name, :song_volume, :description).new("Revolution", "Some author", 20, nil) }
|
6
|
+
let(:prepared) { representer.prepare song }
|
7
7
|
|
8
8
|
describe "hash options combined with dynamic options" do
|
9
9
|
representer! do
|
data/test/definition_test.rb
CHANGED
@@ -6,15 +6,13 @@ class DefinitionTest < MiniTest::Spec
|
|
6
6
|
# TODO: test that we DON'T clone options, that must happen in
|
7
7
|
describe "#initialize" do
|
8
8
|
it do
|
9
|
-
opts = nil
|
10
|
-
|
11
9
|
# new yields the defaultized options HASH.
|
12
10
|
definition = Definition.new(:song, :extend => Module) do |options|
|
13
11
|
options[:awesome] = true
|
14
12
|
options[:parse_filter] << 1
|
15
13
|
|
16
14
|
# default variables
|
17
|
-
options[:as].
|
15
|
+
options[:as].must_be_nil
|
18
16
|
options[:extend].must_equal Module
|
19
17
|
end
|
20
18
|
definition.name.must_equal "song"
|
@@ -27,14 +25,14 @@ class DefinitionTest < MiniTest::Spec
|
|
27
25
|
end
|
28
26
|
|
29
27
|
describe "#[]" do
|
30
|
-
let
|
28
|
+
let(:definition) { Definition.new(:song) }
|
31
29
|
# default is nil.
|
32
|
-
it { definition[:bla].
|
30
|
+
it { definition[:bla].must_be_nil }
|
33
31
|
end
|
34
32
|
|
35
33
|
# merge!
|
36
34
|
describe "#merge!" do
|
37
|
-
let
|
35
|
+
let(:definition) { Definition.new(:song, :whatever => true) }
|
38
36
|
|
39
37
|
# merges new options.
|
40
38
|
it { definition.merge!(:something => true)[:something].must_equal true }
|
@@ -61,7 +59,7 @@ class DefinitionTest < MiniTest::Spec
|
|
61
59
|
end
|
62
60
|
|
63
61
|
describe "with :parse_filter" do
|
64
|
-
let
|
62
|
+
let(:definition) { Definition.new(:title, :parse_filter => 1) }
|
65
63
|
|
66
64
|
# merges :parse_filter and :render_filter.
|
67
65
|
it do
|
@@ -85,11 +83,11 @@ class DefinitionTest < MiniTest::Spec
|
|
85
83
|
|
86
84
|
# delete!
|
87
85
|
describe "#delete!" do
|
88
|
-
let
|
86
|
+
let(:definition) { Definition.new(:song, serialize: "remove me!") }
|
89
87
|
|
90
88
|
before { definition[:serialize].(nil).must_equal "remove me!" }
|
91
89
|
|
92
|
-
it { definition.delete!(:serialize)[:serialize].
|
90
|
+
it { definition.delete!(:serialize)[:serialize].must_be_nil }
|
93
91
|
end
|
94
92
|
|
95
93
|
# #inspect
|
@@ -104,7 +102,7 @@ class DefinitionTest < MiniTest::Spec
|
|
104
102
|
end
|
105
103
|
|
106
104
|
it "responds to #representer_module" do
|
107
|
-
|
105
|
+
assert_nil Representable::Definition.new(:song).representer_module
|
108
106
|
assert_equal Hash, Representable::Definition.new(:song, :extend => Hash).representer_module
|
109
107
|
end
|
110
108
|
|
@@ -217,7 +215,7 @@ class DefinitionTest < MiniTest::Spec
|
|
217
215
|
describe ":default => value" do
|
218
216
|
it "responds to #default" do
|
219
217
|
@def = Representable::Definition.new(:song)
|
220
|
-
|
218
|
+
assert_nil @def[:default]
|
221
219
|
end
|
222
220
|
|
223
221
|
it "accepts a default value" do
|
data/test/examples/object.rb
CHANGED
@@ -7,8 +7,6 @@ require "pp"
|
|
7
7
|
source = OpenStruct.new(name: "30 Years Live", songs: [
|
8
8
|
OpenStruct.new(id: 1, title: "Dear Beloved"), OpenStruct.new(id: 2, title: "Fuck Armageddon")])
|
9
9
|
|
10
|
-
pp source
|
11
|
-
|
12
10
|
require "representable/object"
|
13
11
|
|
14
12
|
class AlbumRepresenter < Representable::Decorator
|
@@ -26,6 +24,4 @@ Song = Struct.new(:title)
|
|
26
24
|
|
27
25
|
target = Album.new
|
28
26
|
|
29
|
-
AlbumRepresenter.new(target).from_object(source)
|
30
|
-
|
31
|
-
pp target
|
27
|
+
AlbumRepresenter.new(target).from_object(source)
|
data/test/exec_context_test.rb
CHANGED
@@ -7,8 +7,8 @@ class ExecContextTest < MiniTest::Spec
|
|
7
7
|
# :yaml => [Representable::YAML, "---\nsong:\n name: Alive\n", "---\nsong:\n name: You've Taken Everything\n"],
|
8
8
|
) do |format, mod, input, output|
|
9
9
|
|
10
|
-
let
|
11
|
-
let
|
10
|
+
let(:song) { representer.prepare(Song.new("Timing")) }
|
11
|
+
let(:format) { format }
|
12
12
|
|
13
13
|
|
14
14
|
describe "exec_context: nil" do
|
data/test/features_test.rb
CHANGED
@@ -20,11 +20,11 @@ class FeaturesTest < MiniTest::Spec
|
|
20
20
|
end
|
21
21
|
}
|
22
22
|
|
23
|
-
let
|
23
|
+
let(:song) { OpenStruct.new(:details => Object.new) }
|
24
24
|
|
25
25
|
describe "Module" do
|
26
26
|
representer! do
|
27
|
-
instance_exec
|
27
|
+
instance_exec(&definition)
|
28
28
|
end
|
29
29
|
|
30
30
|
it { song.extend(representer).to_hash.must_equal({"title"=>"Is It A Lie", "length"=>"2:31", "details"=>{"title"=>"Is It A Lie"}}) }
|
@@ -33,7 +33,7 @@ class FeaturesTest < MiniTest::Spec
|
|
33
33
|
|
34
34
|
describe "Decorator" do
|
35
35
|
representer!(:decorator => true) do
|
36
|
-
instance_exec
|
36
|
+
instance_exec(&definition)
|
37
37
|
end
|
38
38
|
|
39
39
|
it { representer.new(song).to_hash.must_equal({"title"=>"Is It A Lie", "length"=>"2:31", "details"=>{"title"=>"Is It A Lie"}}) }
|
data/test/filter_test.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class FilterPipelineTest < MiniTest::Spec
|
4
|
-
let
|
5
|
-
let
|
4
|
+
let(:block1) { lambda { |input, options| "1: #{input}" } }
|
5
|
+
let(:block2) { lambda { |input, options| "2: #{input}" } }
|
6
6
|
|
7
7
|
subject { Representable::Pipeline[block1, block2] }
|
8
8
|
|
data/test/for_collection_test.rb
CHANGED
@@ -7,8 +7,8 @@ class ForCollectionTest < MiniTest::Spec
|
|
7
7
|
property :name
|
8
8
|
end
|
9
9
|
|
10
|
-
let
|
11
|
-
let
|
10
|
+
let(:songs) { [Song.new("Days Go By"), Song.new("Can't Take Them All")] }
|
11
|
+
let(:json) { "[{\"name\":\"Days Go By\"},{\"name\":\"Can't Take Them All\"}]" }
|
12
12
|
|
13
13
|
|
14
14
|
# Module.for_collection
|
@@ -20,9 +20,9 @@ class ForCollectionTest < MiniTest::Spec
|
|
20
20
|
) do |format, mod, output, input|
|
21
21
|
|
22
22
|
describe "Module::for_collection [#{format}]" do
|
23
|
-
let
|
23
|
+
let(:format) { format }
|
24
24
|
|
25
|
-
let
|
25
|
+
let(:representer) {
|
26
26
|
Module.new do
|
27
27
|
include mod
|
28
28
|
property :name#, :as => :title
|
@@ -40,9 +40,9 @@ class ForCollectionTest < MiniTest::Spec
|
|
40
40
|
end
|
41
41
|
|
42
42
|
describe "Module::for_collection without configuration [#{format}]" do
|
43
|
-
let
|
43
|
+
let(:format) { format }
|
44
44
|
|
45
|
-
let
|
45
|
+
let(:representer) {
|
46
46
|
Module.new do
|
47
47
|
include mod
|
48
48
|
property :name
|
@@ -55,8 +55,8 @@ class ForCollectionTest < MiniTest::Spec
|
|
55
55
|
|
56
56
|
|
57
57
|
describe "Decorator::for_collection [#{format}]" do
|
58
|
-
let
|
59
|
-
let
|
58
|
+
let(:format) { format }
|
59
|
+
let(:representer) {
|
60
60
|
Class.new(Representable::Decorator) do
|
61
61
|
include mod
|
62
62
|
property :name
|
data/test/generic_test.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class GenericTest < MiniTest::Spec # TODO: rename/restructure to CollectionTest.
|
4
|
-
let
|
5
|
-
let
|
6
|
-
let
|
7
|
-
let
|
4
|
+
let(:new_album) { OpenStruct.new.extend(representer) }
|
5
|
+
let(:album) { OpenStruct.new(:songs => ["Fuck Armageddon"]).extend(representer) }
|
6
|
+
let(:song) { OpenStruct.new(:title => "Resist Stance") }
|
7
|
+
let(:song_representer) { Module.new do include Representable::Hash; property :title end }
|
8
8
|
|
9
9
|
|
10
10
|
describe "::collection" do
|
@@ -14,7 +14,7 @@ class GenericTest < MiniTest::Spec # TODO: rename/restructure to CollectionTest.
|
|
14
14
|
|
15
15
|
it "doesn't initialize property" do
|
16
16
|
new_album.from_hash({})
|
17
|
-
new_album.songs.
|
17
|
+
new_album.songs.must_be_nil
|
18
18
|
end
|
19
19
|
|
20
20
|
it "leaves properties untouched" do
|
@@ -32,14 +32,14 @@ class GenericTest < MiniTest::Spec # TODO: rename/restructure to CollectionTest.
|
|
32
32
|
) do |format, mod, output, input|
|
33
33
|
|
34
34
|
describe "nil collections" do
|
35
|
-
let
|
35
|
+
let(:format) { format }
|
36
36
|
|
37
37
|
representer!(:module => mod) do
|
38
38
|
collection :songs
|
39
39
|
self.representation_wrap = :album if format == :xml
|
40
40
|
end
|
41
41
|
|
42
|
-
let
|
42
|
+
let(:album) { Album.new.extend(representer) }
|
43
43
|
|
44
44
|
it "doesn't render collection in #{format}" do
|
45
45
|
render(album).must_equal_document output
|
@@ -55,14 +55,14 @@ class GenericTest < MiniTest::Spec # TODO: rename/restructure to CollectionTest.
|
|
55
55
|
) do |format, mod, output, input|
|
56
56
|
|
57
57
|
describe "empty collections" do
|
58
|
-
let
|
58
|
+
let(:format) { format }
|
59
59
|
|
60
60
|
representer!(:module => mod) do
|
61
61
|
collection :songs
|
62
62
|
self.representation_wrap = :album if format == :xml
|
63
63
|
end
|
64
64
|
|
65
|
-
let
|
65
|
+
let(:album) { OpenStruct.new(:songs => []).extend(representer) }
|
66
66
|
|
67
67
|
it "renders empty collection in #{format}" do
|
68
68
|
render(album).must_equal_document output
|
@@ -79,14 +79,14 @@ class GenericTest < MiniTest::Spec # TODO: rename/restructure to CollectionTest.
|
|
79
79
|
) do |format, mod, output, input|
|
80
80
|
|
81
81
|
describe "render_empty [#{format}]" do
|
82
|
-
let
|
82
|
+
let(:format) { format }
|
83
83
|
|
84
84
|
representer!(:module => mod) do
|
85
85
|
collection :songs, :render_empty => false
|
86
86
|
self.representation_wrap = :album if format == :xml
|
87
87
|
end
|
88
88
|
|
89
|
-
let
|
89
|
+
let(:album) { OpenStruct.new(:songs => []).extend(representer) }
|
90
90
|
|
91
91
|
it { render(album).must_equal_document output }
|
92
92
|
end
|