flickrmocks 0.8.5

Sign up to get free protection for your applications and to get access to all the features.
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