flickrmocks 0.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. data/.autotest +36 -0
  2. data/.document +5 -0
  3. data/.gitignore +23 -0
  4. data/.rspec +3 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +59 -0
  7. data/Rakefile +76 -0
  8. data/VERSION +1 -0
  9. data/autotest/discover.rb +1 -0
  10. data/flickrmocks.gemspec +155 -0
  11. data/lib/flickr_mocks/api/api.rb +42 -0
  12. data/lib/flickr_mocks/api/flickr.rb +27 -0
  13. data/lib/flickr_mocks/api/helpers.rb +19 -0
  14. data/lib/flickr_mocks/api/options.rb +55 -0
  15. data/lib/flickr_mocks/api/sanitize.rb +29 -0
  16. data/lib/flickr_mocks/fixtures.rb +35 -0
  17. data/lib/flickr_mocks/flickraw/custom_clone.rb +19 -0
  18. data/lib/flickr_mocks/flickraw/custom_compare.rb +25 -0
  19. data/lib/flickr_mocks/flickraw/custom_marshal.rb +39 -0
  20. data/lib/flickr_mocks/flickraw/flickraw.rb +14 -0
  21. data/lib/flickr_mocks/helpers.rb +52 -0
  22. data/lib/flickr_mocks/models/helpers.rb +14 -0
  23. data/lib/flickr_mocks/models/photo.rb +101 -0
  24. data/lib/flickr_mocks/models/photo_details.rb +86 -0
  25. data/lib/flickr_mocks/models/photo_dimensions.rb +103 -0
  26. data/lib/flickr_mocks/models/photo_search.rb +115 -0
  27. data/lib/flickr_mocks/models/photo_size.rb +60 -0
  28. data/lib/flickr_mocks/models/photo_sizes.rb +93 -0
  29. data/lib/flickr_mocks/models/photos.rb +133 -0
  30. data/lib/flickr_mocks/stubs.rb +103 -0
  31. data/lib/flickr_mocks/version.rb +4 -0
  32. data/lib/flickrmocks.rb +27 -0
  33. data/spec/api/api_spec.rb +84 -0
  34. data/spec/api/flickr_spec.rb +48 -0
  35. data/spec/api/helper_spec.rb +37 -0
  36. data/spec/api/options_spec.rb +152 -0
  37. data/spec/api/sanitize_spec.rb +90 -0
  38. data/spec/base/fixtures_spec.rb +89 -0
  39. data/spec/base/flickraw/custom_clone_spec.rb +70 -0
  40. data/spec/base/flickraw/custom_compare_spec.rb +98 -0
  41. data/spec/base/flickraw/custom_marshal_spec.rb +45 -0
  42. data/spec/base/helpers_spec.rb +63 -0
  43. data/spec/base/stubs_spec.rb +180 -0
  44. data/spec/base/version_spec.rb +15 -0
  45. data/spec/fixtures/author_photos.marshal +0 -0
  46. data/spec/fixtures/empty_photos.marshal +0 -0
  47. data/spec/fixtures/expected_methods.marshal +17 -0
  48. data/spec/fixtures/interesting_photos.marshal +0 -0
  49. data/spec/fixtures/photo.marshal +0 -0
  50. data/spec/fixtures/photo_details.marshal +0 -0
  51. data/spec/fixtures/photo_size.marshal +0 -0
  52. data/spec/fixtures/photo_sizes.marshal +0 -0
  53. data/spec/fixtures/photos.marshal +0 -0
  54. data/spec/models/helpers_spec.rb +25 -0
  55. data/spec/models/photo_details_spec.rb +224 -0
  56. data/spec/models/photo_dimensions_spec.rb +208 -0
  57. data/spec/models/photo_search_spec.rb +255 -0
  58. data/spec/models/photo_size_spec.rb +122 -0
  59. data/spec/models/photo_sizes_spec.rb +168 -0
  60. data/spec/models/photo_spec.rb +278 -0
  61. data/spec/models/photos_spec.rb +305 -0
  62. data/spec/shared_examples/array_accessor.rb +157 -0
  63. data/spec/shared_examples/collection.rb +49 -0
  64. data/spec/shared_examples/image_url_helpers.rb +56 -0
  65. data/spec/shared_examples/size_accessor.rb +13 -0
  66. data/spec/spec_helper.rb +24 -0
  67. data/tasks/fixtures.rb +164 -0
  68. metadata +259 -0
@@ -0,0 +1,122 @@
1
+ require 'spec_helper'
2
+
3
+ describe APP::PhotoSize do
4
+ let(:klass){APP::PhotoSize}
5
+ let(:fixtures){ APP::Fixtures.new}
6
+ let(:size_fixture){fixtures.photo_size}
7
+
8
+ subject {klass.new size_fixture}
9
+
10
+ context "#initialize" do
11
+ context "size fixture" do
12
+ it "returns object of proper class" do
13
+ subject.should be_a(APP::PhotoSize)
14
+ end
15
+ end
16
+ context "FlickRaw::ResponseList object" do
17
+ it "raises error" do
18
+ expect {
19
+ klass.new(fixtures.photos)
20
+ }.to raise_error(ArgumentError)
21
+ end
22
+ end
23
+ context "unexpected object" do
24
+ it "raises error when array object provided" do
25
+ expect{
26
+ klass.new([])
27
+ }.to raise_error(ArgumentError)
28
+ end
29
+ it "raises error when Hash object provided" do
30
+ expect{
31
+ klass.new({})
32
+ }.to raise_error(ArgumentError)
33
+ end
34
+ end
35
+ end
36
+
37
+ context "instance methods" do
38
+ specify {subject.should respond_to(:size)}
39
+ describe "#size" do
40
+ it "should return proper size" do
41
+ subject.size.should == size_fixture.label.downcase.sub('_',' ').to_s
42
+ end
43
+ end
44
+
45
+ specify {subject.should respond_to(:id)}
46
+ describe "#id" do
47
+ it "should return proper :id" do
48
+ subject.id.should == size_fixture.source.split('/')[-1].split('_')[0]
49
+ end
50
+ end
51
+
52
+ specify {subject.should respond_to(:secret)}
53
+ describe "#secret" do
54
+ it "should return :secret" do
55
+ subject.secret.should == size_fixture.source.split('/')[-1].split('_')[1]
56
+ end
57
+ end
58
+
59
+
60
+ specify{subject.should respond_to(:==)}
61
+ context "#==" do
62
+ it "returns true when object is compared to clone of itself" do
63
+ subject.should == subject.clone
64
+ end
65
+ it "returns true when object is compared to an array" do
66
+ subject.should_not == [1,2,3,4]
67
+ end
68
+ it "returns false when compared to object that is different in one attribute" do
69
+ subject.delegated_instance_methods do |method|
70
+ value = case subject.send(method)
71
+ when String then Faker::Lorem.sentence(3)
72
+ when FixNum then Random.rand
73
+ else Random.rand
74
+ end
75
+ other = subject.clone
76
+ other.stub(method).returns(value)
77
+ subject.should_not == other
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ context "metaprogramming methods" do
84
+
85
+ context "#delegated_instance_methods" do
86
+ it "should delegate to FlickRaw::Response" do
87
+ subject.delegated_instance_methods.sort.should == fixtures.expected_methods.photo_size.sort
88
+ end
89
+ end
90
+
91
+ context "#respond_to?" do
92
+ it "returns true when given on of delegated_instance methods" do
93
+ subject.delegated_instance_methods.each do |method|
94
+ subject.should respond_to(method)
95
+ end
96
+ end
97
+ it "returns true when given expected methods" do
98
+ subject.methods do |method|
99
+ subject.should respond_to(method)
100
+ end
101
+ end
102
+ end
103
+
104
+ context "#methods" do
105
+ it "returns list that includes the methods that are delegated" do
106
+ expected_methods = subject.old_methods + fixtures.expected_methods.photo_size
107
+ (subject.methods - expected_methods).should be_empty
108
+ subject.methods.length.should == expected_methods.length
109
+ end
110
+
111
+ end
112
+ end
113
+
114
+ context "custom cloning methods" do
115
+ context "#initialize_copy" do
116
+ it "returns photo object that have distinct __id__ as compared with original" do
117
+ other = subject.clone
118
+ subject.instance_eval('@delegated_to_object.__id__').should_not == other.instance_eval('@delegated_to_object.__id__')
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,168 @@
1
+ require 'spec_helper'
2
+
3
+ describe APP::PhotoSizes do
4
+ let(:klass){APP::PhotoSizes}
5
+ let(:fixtures){APP::Fixtures.new}
6
+
7
+ subject {APP::PhotoSizes.new fixtures.photo_sizes}
8
+
9
+ context "initialize" do
10
+ context "with FlickRaw::ResponseList" do
11
+ it "returns object of proper class" do
12
+ klass.new(fixtures.photo_sizes).should be_a(APP::PhotoSizes)
13
+ end
14
+ end
15
+ context "with FlickRaw::Response" do
16
+ it "raises an error" do
17
+ expect {
18
+ klass.new(fixtures.photo)
19
+ }.to raise_error(ArgumentError)
20
+
21
+ end
22
+ end
23
+ context "with an Array object" do
24
+ it "raises an error" do
25
+ expect {
26
+ klass.new([])
27
+ }.to raise_error(ArgumentError)
28
+ end
29
+ end
30
+ context "with a nil object" do
31
+ it "raises an error" do
32
+ expect {
33
+ klass.new(nil)
34
+ }.to raise_error(ArgumentError)
35
+ end
36
+ end
37
+ end
38
+
39
+ context "instance methods" do
40
+ specify {subject.should respond_to(:id)}
41
+ context "#id" do
42
+ it "returns id for expected photo" do
43
+ subject.id.should == fixtures.photo_size.source.split('/')[-1].split('_')[0]
44
+ end
45
+ end
46
+
47
+ specify {subject.should respond_to(:secret)}
48
+ context "#secret" do
49
+ it "returns secret for correct photo" do
50
+ subject.secret.should == fixtures.photo_size.source.split('/')[-1].split('_')[1]
51
+ end
52
+ end
53
+
54
+ specify {subject.should respond_to(:sizes)}
55
+ context "#sizes" do
56
+ it "returns array of PhotoSize objects" do
57
+ subject.sizes.should == subject.map do |size| size end
58
+ end
59
+ end
60
+
61
+ specify {subject.should respond_to(:available_sizes)}
62
+ context "#available_sizes" do
63
+ it "returns array of sizes availalbe" do
64
+ subject.available_sizes.should == subject.sizes.map do |size|
65
+ size.size.to_sym
66
+ end
67
+ end
68
+ end
69
+
70
+ specify {subject.should respond_to(:possible_sizes)}
71
+ context "possible_sizes" do
72
+ it "returns list of sizes that are possible for an image" do
73
+ subject.possible_sizes == FlickrMocks::Models::Helpers.possible_sizes
74
+ end
75
+ end
76
+ specify {subject.should respond_to(:to_s)}
77
+ context "#to_s" do
78
+ it "should return expected string" do
79
+ expected = subject.map do |size| "#{size.label.downcase.sub(' ','_')}:#{size.width}x#{size.height}" end.join(',')
80
+ subject.to_s.should == expected
81
+ end
82
+ end
83
+
84
+ specify {subject.should respond_to(:==)}
85
+ describe "#==" do
86
+ it "returns true when object is compared to itself" do
87
+ subject.should == subject
88
+ end
89
+ it "returns true when object is compared to clone of itself" do
90
+ subject.should == subject.clone
91
+ end
92
+ it "returns false when object is compared to Fixnum" do
93
+ subject.should_not == 2
94
+ end
95
+ it "returns false when object is compared to Array" do
96
+ subject.should_not == []
97
+ end
98
+ it "returns false when object compared to object with only a single difference" do
99
+ other = subject.clone
100
+ other[0].instance_eval('@delegated_to_object').instance_eval('@h["label"] = "random size"')
101
+ subject.should_not == other
102
+ end
103
+ end
104
+
105
+ context "#collection" do
106
+
107
+ specify { subject.should respond_to(:collection)}
108
+ context "#collection" do
109
+ let(:reference){
110
+ OpenStruct.new :current_page => 1,
111
+ :per_page => subject.available_sizes.length,
112
+ :total_entries => subject.available_sizes.length,
113
+ :collection => subject.sizes
114
+ }
115
+ it_behaves_like "object that responds to collection"
116
+ end
117
+ end
118
+ end
119
+
120
+ context "metaprogramming methods" do
121
+
122
+ specify{subject.should respond_to(:delegated_instance_methods)}
123
+ context "#delegated_instance_methods" do
124
+ it "returns array accessor methods + size methods" do
125
+ subject.delegated_instance_methods.sort.should == (subject.possible_sizes +
126
+ APP::Models::Helpers.array_accessor_methods).sort
127
+ end
128
+ end
129
+
130
+ specify{subject.should respond_to(:methods)}
131
+ context "#methods" do
132
+ it "returns all methods including those that are delegated" do
133
+ subject.methods.sort.should == ( subject.delegated_instance_methods +
134
+ subject.old_methods).sort
135
+ end
136
+ end
137
+
138
+ specify{ subject.should respond_to(:respond_to?)}
139
+ context "#respond_to?" do
140
+ it "recognizes all methods returned by #methods" do
141
+ subject.methods.each do |method|
142
+ subject.should respond_to(method)
143
+ end
144
+ end
145
+ end
146
+
147
+ context "iteratable methods" do
148
+ let(:reference) {subject.sizes}
149
+ it_behaves_like "object with delegated Array accessor helpers"
150
+ end
151
+
152
+ end
153
+
154
+ context "custom cloning methods" do
155
+ context "initialize_copy" do
156
+ it "returns clone with distinct id from original object" do
157
+ other = subject.clone
158
+ subject.each_index do |index|
159
+ subject[index].__id__.should_not == other[index].__id__
160
+ end
161
+ end
162
+ end
163
+ end
164
+
165
+ end
166
+
167
+
168
+
@@ -0,0 +1,278 @@
1
+ require 'spec_helper'
2
+
3
+ describe APP::Photo do
4
+ let(:klass){APP::Photo}
5
+ let(:fixtures){APP::Fixtures.new}
6
+ let(:basic_photo){klass.new fixtures.photo}
7
+ let(:extended_photo){klass.new fixtures.photo_details}
8
+
9
+ subject {basic_photo}
10
+
11
+ context "initialize" do
12
+ context "with extended photo" do
13
+ it "returns object of proper class" do
14
+ klass.new(fixtures.photo_details).should be_a(APP::Photo)
15
+ end
16
+ end
17
+
18
+ context "with basic photo" do
19
+ subject {klass.new fixtures.photo}
20
+ it "returns object of proper class" do
21
+ klass.new(fixtures.photo).should be_a(APP::Photo)
22
+ end
23
+ end
24
+ context "with nil" do
25
+ it "raises error" do
26
+ expect { klass.new nil}.to raise_error(ArgumentError)
27
+ end
28
+ end
29
+ context "with FlickRaw::ResponseList class" do
30
+ it "raises error" do
31
+ expect { klass.new fixtures.photos}.to raise_error(ArgumentError)
32
+ end
33
+ end
34
+ context "with an Array class" do
35
+ it "raises error" do
36
+ expect { klass.new []}.to raise_error(ArgumentError)
37
+ end
38
+ end
39
+ end
40
+
41
+ context "instance methods" do
42
+ specify {subject.should respond_to(:photo_id)}
43
+ context "#photo_id" do
44
+ it "returns correct photo_id" do
45
+ subject.photo_id.should == subject.id
46
+ end
47
+ end
48
+
49
+ specify {subject.should respond_to(:usable?)}
50
+ context "#usable?" do
51
+ context "licenses that DO NOT reserve ALL copyright" do
52
+ it "returns false when license is '0'" do
53
+ subject.stub(:license).and_return("0")
54
+ subject.should_not be_usable
55
+ end
56
+ end
57
+ context "licenses that DO NOT allow for commercial usage" do
58
+ it "returns false when license is '1'" do
59
+ subject.stub(:license).and_return("1")
60
+ subject.should_not be_usable
61
+ end
62
+ it "returns false when license is '2'" do
63
+ subject.stub(:license).and_return("2")
64
+ subject.should_not be_usable
65
+ end
66
+ it "returns false when license is '3'" do
67
+ subject.stub(:license).and_return("3")
68
+ subject.should_not be_usable
69
+ end
70
+ end
71
+ context "licenses that allow for commercial usage" do
72
+ it "returns false when license is '4'" do
73
+ subject.stub(:license).and_return('4')
74
+ subject.should be_usable
75
+ end
76
+ it "returns false when license is '5'" do
77
+ subject.stub(:license).and_return('5')
78
+ subject.should be_usable
79
+ end
80
+ it "returns false when license is '6'" do
81
+ subject.stub(:license).and_return('6')
82
+ subject.should be_usable
83
+ end
84
+ end
85
+ end
86
+
87
+ context "url image helpers" do
88
+ context "basic photo" do
89
+ subject {basic_photo}
90
+ it_behaves_like "object with flickr image url helpers"
91
+ end
92
+
93
+ context "extended photo" do
94
+ subject {extended_photo}
95
+ it_behaves_like "object with flickr image url helpers"
96
+ end
97
+
98
+ context "#original" do
99
+ context "basic photo" do
100
+ subject {basic_photo}
101
+ specify {subject.should respond_to(:original)}
102
+ it "returns nil for basic photo" do
103
+ subject.original.should be_nil
104
+ end
105
+ end
106
+ context "extended photo" do
107
+ subject {extended_photo}
108
+ specify {subject.should respond_to(:original)}
109
+ it "returns expected url for detail photo" do
110
+ subject.original.should == subject.square.sub('_%s_s.' % subject.secret, '_%s_o.' % subject.originalsecret)
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+ specify {subject.should respond_to(:owner_url)}
117
+ context "#owner_url" do
118
+ it "returns expected url link for owner of image" do
119
+ subject.owner_url.should == "http://www.flickr.com/photos/#{fixtures.photo['owner']}/#{fixtures.photo['id']}"
120
+ end
121
+ end
122
+
123
+ specify {subject.should respond_to(:owner_id)}
124
+ context "#owner_id" do
125
+ it "returns expected value id for owner of image" do
126
+ subject.owner_id.should == fixtures.photo['owner']
127
+ end
128
+
129
+ end
130
+
131
+ specify {subject.should respond_to(:owner)}
132
+ context "#owner" do
133
+ it "returns expected name for owner of image" do
134
+ subject.owner.should == fixtures.photo['owner']
135
+ end
136
+ end
137
+
138
+ specify{subject.should respond_to(:==)}
139
+ context "#==" do
140
+ subject {basic_photo}
141
+ context "basic photo" do
142
+ it "returns true when object is compared to itself" do
143
+ subject.should == subject
144
+ end
145
+ it "returns true when object is compared to clone of itself" do
146
+ subject.should == subject.clone
147
+ end
148
+
149
+ it "returns true when object is compared to an object of another class" do
150
+ subject.should_not == [1,2,3,4]
151
+ end
152
+ it "returns true when object is compared to another object with slight difference" do
153
+ subject.delegated_instance_methods.find_all do |value| value != :flickr_type end.each do |method|
154
+ other = subject.clone
155
+ value = case subject.send(method)
156
+ when String then Faker::Lorem.sentence(3)
157
+ when Fixnum then next
158
+ else Random.rand
159
+ end
160
+ other.instance_eval('@delegated_to_object').instance_eval('@h[method.to_s]=value')
161
+ subject.should_not == other
162
+ end
163
+ end
164
+ end
165
+
166
+ context "detailed photo" do
167
+ subject {extended_photo}
168
+
169
+ it "returns true when object is compared to itself" do
170
+ subject.should == subject
171
+ end
172
+ it "returns true when object is compared to clone of itself" do
173
+ subject.should == subject.clone
174
+ end
175
+ it "returns true when object is compared to an object of another class" do
176
+ other = subject.clone
177
+ other.instance_eval('@delegated_to_object').instance_eval('@h["dates"]').instance_eval('@h["taken"]="boobooje"')
178
+ subject.should_not == other
179
+ end
180
+
181
+ it "returns true when object is compared to another object with slight difference" do
182
+ subject.delegated_instance_methods.find_all do |value| value != :flickr_type end.each do |method|
183
+ other = subject.clone
184
+ value = case subject.send(method)
185
+ when String then Faker::Lorem.sentence(3)
186
+ when Fixnum then next
187
+ else Random.rand
188
+ end
189
+ other.instance_eval('@delegated_to_object').instance_eval('@h[method.to_s]=value')
190
+ subject.should_not == other
191
+ end
192
+ end
193
+ end
194
+ end
195
+
196
+ end
197
+
198
+
199
+ context "metaprogramming methods" do
200
+ context "#delegated_instance_methods" do
201
+ context "basic photo" do
202
+ subject {basic_photo}
203
+ it "returns methods for basic photos" do
204
+ subject.delegated_instance_methods.sort.should == fixtures.expected_methods.photo.sort
205
+ end
206
+ end
207
+ context "detailed photo" do
208
+ subject {extended_photo}
209
+ it "returns methods for extended photos" do
210
+ subject.delegated_instance_methods.sort.should == fixtures.expected_methods.photo_details.sort
211
+ end
212
+ end
213
+
214
+ end
215
+
216
+ context "#respond_to?" do
217
+ context "basic photo" do
218
+ subject {basic_photo}
219
+ it "responds to methods that are delegated to basic photo object" do
220
+ fixtures.expected_methods.photo.each do |method|
221
+ subject.should respond_to(method)
222
+ end
223
+ end
224
+ it "responds to all methods returned by #methods" do
225
+ subject.methods.each do |method|
226
+ subject.should respond_to(method)
227
+ end
228
+ end
229
+ end
230
+
231
+ context "detailed photo" do
232
+ subject {extended_photo}
233
+ it "responds to methods that are delegated to detailed photo object" do
234
+ fixtures.photo_details.methods(false).push(:flickr_type).each do |method|
235
+ subject.should respond_to(method)
236
+ end
237
+ end
238
+ it "responds to all methods returned by #methods" do
239
+ subject.methods.each do |method|
240
+ subject.should respond_to(method)
241
+ end
242
+ end
243
+ end
244
+ end
245
+
246
+ context "#methods" do
247
+ context "basic photo" do
248
+ subject {basic_photo}
249
+
250
+ specify {subject.should respond_to(:methods)}
251
+ it "returns expected methods including delegated methods for basic photo fixture" do
252
+ expected_methods = fixtures.expected_methods.photo + subject.old_methods
253
+ (subject.methods - expected_methods).should be_empty
254
+ subject.methods.length.should == expected_methods.length
255
+ end
256
+ end
257
+ context "detailed photo" do
258
+ subject {extended_photo}
259
+ specify {subject.should respond_to(:methods)}
260
+ it "returns expected methods including delegated methods to photo details fixture" do
261
+ expected_methods = fixtures.expected_methods.photo_details + subject.old_methods
262
+ (subject.methods - expected_methods).should be_empty
263
+ subject.methods.length.should == expected_methods.length
264
+ end
265
+ end
266
+ end
267
+
268
+ end
269
+
270
+ context "custom cloning methods" do
271
+ context "#initialize_copy" do
272
+ it "returns photo objects that have distinct @delegated_to_object ids from cloned object" do
273
+ other = subject.clone
274
+ subject.instance_eval("@delegated_to_object.__id__").should_not == other.instance_eval("@delegated_to_object.__id__")
275
+ end
276
+ end
277
+ end
278
+ end