spontaneous 0.2.0.beta9 → 0.2.0.beta10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +61 -0
  3. data/LICENSE +18 -17
  4. data/Rakefile +1 -1
  5. data/application/css/core.css.scss +1 -1
  6. data/application/css/dialogue.css.scss +8 -20
  7. data/application/js/preview.js +28 -7
  8. data/application/js/publish.js +15 -4
  9. data/application/js/top_bar.js +0 -16
  10. data/application/js/views/piece_view.js +1 -1
  11. data/lib/spontaneous/asset/environment.rb +16 -1
  12. data/lib/spontaneous/box.rb +68 -0
  13. data/lib/spontaneous/capistrano/deploy.rb +7 -4
  14. data/lib/spontaneous/capistrano/sync.rb +2 -2
  15. data/lib/spontaneous/cli/init.rb +70 -19
  16. data/lib/spontaneous/cli/init/db.rb +34 -55
  17. data/lib/spontaneous/cli/init/mysql.rb +5 -5
  18. data/lib/spontaneous/cli/init/postgresql.rb +8 -9
  19. data/lib/spontaneous/cli/init/sqlite.rb +1 -2
  20. data/lib/spontaneous/cli/migrate.rb +0 -1
  21. data/lib/spontaneous/cli/site.rb +4 -0
  22. data/lib/spontaneous/collections/entry_set.rb +11 -0
  23. data/lib/spontaneous/data_mapper/content_model.rb +2 -0
  24. data/lib/spontaneous/data_mapper/content_model/serialization.rb +2 -2
  25. data/lib/spontaneous/extensions/array.rb +12 -2
  26. data/lib/spontaneous/field/base.rb +10 -0
  27. data/lib/spontaneous/field/file.rb +32 -2
  28. data/lib/spontaneous/field/image.rb +24 -2
  29. data/lib/spontaneous/field/select.rb +8 -0
  30. data/lib/spontaneous/field/webvideo.rb +8 -0
  31. data/lib/spontaneous/generators/site/config/initializers/fields.rb +55 -0
  32. data/lib/spontaneous/json.rb +3 -2
  33. data/lib/spontaneous/logger.rb +2 -2
  34. data/lib/spontaneous/media/file.rb +3 -3
  35. data/lib/spontaneous/media/image/attributes.rb +72 -6
  36. data/lib/spontaneous/media/image/renderable.rb +53 -20
  37. data/lib/spontaneous/media/store.rb +3 -3
  38. data/lib/spontaneous/media/store/backend.rb +16 -0
  39. data/lib/spontaneous/media/store/cloud.rb +52 -12
  40. data/lib/spontaneous/media/store/local.rb +6 -3
  41. data/lib/spontaneous/model.rb +3 -0
  42. data/lib/spontaneous/model/core/entries.rb +34 -13
  43. data/lib/spontaneous/model/core/entry.rb +3 -1
  44. data/lib/spontaneous/model/page/controllers.rb +1 -2
  45. data/lib/spontaneous/model/page/paths.rb +18 -7
  46. data/lib/spontaneous/output/context.rb +0 -8
  47. data/lib/spontaneous/output/template/renderer.rb +2 -0
  48. data/lib/spontaneous/plugins/application/state.rb +0 -4
  49. data/lib/spontaneous/prototypes/field_prototype.rb +4 -0
  50. data/lib/spontaneous/publishing/immediate.rb +0 -5
  51. data/lib/spontaneous/publishing/progress.rb +2 -2
  52. data/lib/spontaneous/publishing/rerender.rb +1 -4
  53. data/lib/spontaneous/publishing/simultaneous.rb +19 -17
  54. data/lib/spontaneous/publishing/steps.rb +12 -3
  55. data/lib/spontaneous/rack.rb +2 -0
  56. data/lib/spontaneous/rack/asset_server.rb +5 -2
  57. data/lib/spontaneous/rack/back.rb +9 -1
  58. data/lib/spontaneous/rack/back/base.rb +1 -0
  59. data/lib/spontaneous/rack/back/changes.rb +5 -0
  60. data/lib/spontaneous/rack/back/preview.rb +4 -4
  61. data/lib/spontaneous/rack/back/private.rb +11 -0
  62. data/lib/spontaneous/rack/middleware/scope.rb +16 -4
  63. data/lib/spontaneous/rack/page_controller.rb +2 -2
  64. data/lib/spontaneous/rack/public.rb +52 -4
  65. data/lib/spontaneous/sequel.rb +10 -13
  66. data/lib/spontaneous/site.rb +28 -8
  67. data/lib/spontaneous/site/publishing.rb +1 -1
  68. data/lib/spontaneous/site/storage.rb +7 -4
  69. data/lib/spontaneous/tasks/environment.rake +3 -0
  70. data/lib/spontaneous/utils/database/postgres_dumper.rb +23 -2
  71. data/lib/spontaneous/version.rb +1 -1
  72. data/spontaneous.gemspec +7 -12
  73. data/test/fixtures/assets/public1/css/data.css.scss +1 -1
  74. data/test/functional/test_application.rb +15 -0
  75. data/test/functional/test_cli.rb +109 -3
  76. data/test/functional/test_front.rb +108 -10
  77. data/test/test_helper.rb +3 -3
  78. data/test/unit/fields/test_boolean_fields.rb +80 -0
  79. data/test/unit/fields/test_date_fields.rb +47 -0
  80. data/test/unit/fields/test_file_field.rb +210 -0
  81. data/test/unit/{test_images.rb → fields/test_image_fields.rb} +133 -15
  82. data/test/unit/fields/test_location_fields.rb +41 -0
  83. data/test/unit/fields/test_option_fields.rb +61 -0
  84. data/test/unit/fields/test_tag_list_fields.rb +45 -0
  85. data/test/unit/fields/test_text_fields.rb +124 -0
  86. data/test/unit/fields/test_web_video_fields.rb +198 -0
  87. data/test/unit/test_assets.rb +22 -22
  88. data/test/unit/test_boxes.rb +34 -13
  89. data/test/unit/test_changesets.rb +1 -0
  90. data/test/unit/test_extensions.rb +17 -0
  91. data/test/unit/test_fields.rb +20 -643
  92. data/test/unit/test_media.rb +9 -9
  93. data/test/unit/test_page.rb +47 -0
  94. data/test/unit/test_publishing_pipeline.rb +2 -2
  95. data/test/unit/test_serialisation.rb +37 -0
  96. data/test/unit/test_storage.rb +42 -3
  97. metadata +37 -17
@@ -0,0 +1,47 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path('../../../test_helper', __FILE__)
4
+
5
+ describe "Date fields" do
6
+ before do
7
+ @site = setup_site
8
+ @now = Time.now
9
+ stub_time(@now)
10
+ Spontaneous::State.delete
11
+ @site.background_mode = :immediate
12
+ @content_class = Class.new(::Piece)
13
+ @prototype = @content_class.field :date
14
+ @content_class.stubs(:name).returns("ContentClass")
15
+ @instance = @content_class.create
16
+ @field = @instance.date
17
+ end
18
+
19
+ it "have a distinct editor class" do
20
+ @prototype.instance_class.editor_class.must_equal "Spontaneous.Field.Date"
21
+ end
22
+
23
+ it "adopt any field called 'date'" do
24
+ assert @field.is_a?(Spontaneous::Field::Date), "Field should be an instance of DateField but instead has the following ancestors #{ @prototype.instance_class.ancestors }"
25
+ end
26
+
27
+ it "default to an empty string" do
28
+ @field.value(:html).must_equal ""
29
+ @field.value(:plain).must_equal ""
30
+ end
31
+
32
+ it "correctly parse strings" do
33
+ @field.value = "Friday, 8 June, 2012"
34
+ @field.value(:html).must_equal %(<time datetime="2012-06-08">Friday, 8 June, 2012</time>)
35
+ @field.value(:plain).must_equal %(Friday, 8 June, 2012)
36
+ @field.date.must_equal Date.parse("Friday, 8 June, 2012")
37
+ end
38
+
39
+ it "allow for setting a custom default format" do
40
+ prototype = @content_class.field :datef, :date, :format => "%d %b %Y, %a"
41
+ instance = @content_class.new
42
+ field = instance.datef
43
+ field.value = "Friday, 8 June, 2012"
44
+ field.value(:html).must_equal %(<time datetime="2012-06-08">08 Jun 2012, Fri</time>)
45
+ field.value(:plain).must_equal %(08 Jun 2012, Fri)
46
+ end
47
+ end
@@ -0,0 +1,210 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path('../../../test_helper', __FILE__)
4
+ require 'fog'
5
+
6
+ describe "File Fields" do
7
+ let(:path) { File.expand_path("../../../fixtures/images/vimlogo.pdf", __FILE__) }
8
+
9
+ def site
10
+ @site = setup_site
11
+ @now = Time.now
12
+ stub_time(@now)
13
+ Spontaneous::State.delete
14
+ @site.background_mode = :immediate
15
+ end
16
+ before do
17
+ site
18
+ assert File.exists?(path), "Test file #{path} does not exist"
19
+ @content_class = Class.new(::Piece)
20
+ @prototype = @content_class.field :file
21
+ @content_class.stubs(:name).returns("ContentClass")
22
+ @instance = @content_class.create
23
+ @field = @instance.file
24
+ end
25
+
26
+ after do
27
+ teardown_site
28
+ end
29
+ it "have a distinct editor class" do
30
+ @prototype.instance_class.editor_class.must_equal "Spontaneous.Field.File"
31
+ end
32
+
33
+ it "adopt any field called 'file'" do
34
+ assert @field.is_a?(Spontaneous::Field::File), "Field should be an instance of FileField but instead has the following ancestors #{ @prototype.instance_class.ancestors }"
35
+ end
36
+
37
+ it "gives the right value for #blank?" do
38
+ @field.blank?.must_equal true
39
+ @field.value = 'http://example.com/image.jpg'
40
+ @field.blank?.must_equal false
41
+ end
42
+
43
+ it "copy files to the media folder" do
44
+ File.open(path, 'rb') do |file|
45
+ @field.value = {
46
+ :tempfile => file,
47
+ :type => "application/pdf",
48
+ :filename => "vimlogo.pdf"
49
+ }
50
+ end
51
+ url = @field.value
52
+ path = File.join File.dirname(Spontaneous.media_dir), url
53
+ assert File.exist?(path), "Media file should have been copied into place"
54
+ end
55
+
56
+ it "generate the requisite file metadata" do
57
+ File.open(path, 'rb') do |file|
58
+ @field.value = {
59
+ :tempfile => file,
60
+ :type => "application/pdf",
61
+ :filename => "vimlogo.pdf"
62
+ }
63
+ end
64
+ @field.value(:html).must_match %r{/media/.+/vimlogo.pdf$}
65
+ @field.value.must_match %r{/media/.+/vimlogo.pdf$}
66
+ @field.path.must_equal @field.value
67
+ @field.value(:filesize).must_equal 2254
68
+ @field.filesize.must_equal 2254
69
+ @field.value(:filename).must_equal "vimlogo.pdf"
70
+ @field.filename.must_equal "vimlogo.pdf"
71
+ end
72
+
73
+ it "just accept the given value if passed a path to a non-existant file" do
74
+ @field.value = "/images/nosuchfile.rtf"
75
+ @field.value.must_equal "/images/nosuchfile.rtf"
76
+ @field.filename.must_equal "nosuchfile.rtf"
77
+ @field.filesize.must_equal 0
78
+ end
79
+
80
+ it "copy the given file if passed a path to an existing file" do
81
+ @field.value = path
82
+ @field.value.must_match %r{/media/.+/vimlogo.pdf$}
83
+ @field.filename.must_equal "vimlogo.pdf"
84
+ @field.filesize.must_equal 2254
85
+ end
86
+
87
+ it "sets the unprocessed value to a JSON encoded array of MD5 hash & filename" do
88
+ @field.value = path
89
+ @instance.save
90
+ @field.unprocessed_value.must_equal ["vimlogo.pdf", "1de7e866d69c2f56b4a3f59ed1c98b74"].to_json
91
+ end
92
+
93
+ it "sets the field hash to the MD5 hash of the file" do
94
+ @field.value = path
95
+ @field.file_hash.must_equal "1de7e866d69c2f56b4a3f59ed1c98b74"
96
+ end
97
+
98
+ it "sets the original filename of the file" do
99
+ @field.value = path
100
+ @field.original_filename.must_equal "vimlogo.pdf"
101
+ end
102
+
103
+ it "doesn't set the hash of a file that can't be found" do
104
+ @field.value = "/images/nosuchfile.rtf"
105
+ @field.file_hash.must_equal ""
106
+ end
107
+
108
+ it "sets the original filename of a file that can't be found" do
109
+ @field.value = "/images/nosuchfile.rtf"
110
+ @field.original_filename.must_equal "/images/nosuchfile.rtf"
111
+ end
112
+
113
+ it "sets the storage name if given an uploaded file" do
114
+ @field.value = path
115
+ @field.storage_name.must_equal "default"
116
+ end
117
+
118
+ it "sets the storage name if given an uploaded file" do
119
+ @field.value = path
120
+ @field.storage.must_equal @site.storage
121
+ end
122
+
123
+ it "sets the storage name to nil for file paths" do
124
+ @field.value = "/images/nosuchfile.rtf"
125
+ @field.storage_name.must_equal nil
126
+ end
127
+
128
+ it "allows for re-configuring the generated media URLs" do
129
+ @field.value = path
130
+ @field.path.must_match %r{^/media/.+/vimlogo.pdf$}
131
+ storage = @site.storage("default")
132
+ storage.url_mapper = ->(path) { "http://media.example.com#{path}"}
133
+ @field.value(:html).must_match %r{^http://media.example.com/media/.+/vimlogo.pdf$}
134
+ @field.path.must_match %r{^http://media.example.com/media/.+/vimlogo.pdf$}
135
+ @field.url.must_match %r{^http://media.example.com/media/.+/vimlogo.pdf$}
136
+ end
137
+
138
+ describe "clearing" do
139
+ def assert_file_field_empty
140
+ @field.value.must_equal ''
141
+ @field.filename.must_equal ''
142
+ @field.filesize.must_equal 0
143
+ end
144
+
145
+ before do
146
+ path = File.expand_path("../../fixtures/images/vimlogo.pdf", __FILE__)
147
+ @field.value = path
148
+ end
149
+
150
+ it "clears the value if set to the empty string" do
151
+ @field.value = ''
152
+ assert_file_field_empty
153
+ end
154
+ end
155
+
156
+ describe "with cloud storage" do
157
+ before do
158
+ ::Fog.mock!
159
+ @storage_config = {
160
+ provider: "AWS",
161
+ aws_secret_access_key: "SECRET_ACCESS_KEY",
162
+ aws_access_key_id: "ACCESS_KEY_ID",
163
+ public_host: 'https://media.example.com'
164
+ }
165
+ @storage = S::Media::Store::Cloud.new("S3", @storage_config, "media.example.com")
166
+ @storage.name.must_equal "S3"
167
+ @site.storage_backends.unshift(@storage)
168
+ end
169
+
170
+ it "sets the content-disposition header if defined as an 'attachment'" do
171
+ prototype = @content_class.field :attachment, :file, attachment: true
172
+ field = @instance.attachment
173
+ path = File.expand_path("../../../fixtures/images/vimlogo.pdf", __FILE__)
174
+ @storage.expects(:copy).with(path, is_a(Array), { content_type: "application/pdf", content_disposition: 'attachment; filename=vimlogo.pdf'})
175
+ field.value = path
176
+ end
177
+
178
+ describe 'storage' do
179
+ before do
180
+ @prototype = @content_class.field :attachment, :file
181
+ @field = @instance.attachment
182
+ @storage.stubs(:copy).with(path, is_a(Array), { content_type: "application/pdf"})
183
+ end
184
+
185
+ it "sets the storage name if given an uploaded file" do
186
+ @field.value = path
187
+ @field.storage_name.must_equal "S3"
188
+ end
189
+
190
+ it "allows for the file url to be configured by the storage" do
191
+ @field.value = path
192
+ @field.url.must_match %r[^https://media.example.com/0000#{@instance.id}/0001/vimlogo.pdf$]
193
+ @storage.url_mapper = ->(path) { "https://cdn.example.com#{path}" }
194
+ @field.url.must_match %r[^https://cdn.example.com/0000#{@instance.id}/0001/vimlogo.pdf$]
195
+ end
196
+
197
+ it 'falls back to the site’s default if initialized before storage_name output was defined' do
198
+ @field.value = path
199
+ @field.stubs(:storage_name).returns('[]')
200
+ @field.url.must_match %r[^/0000#{@instance.id}/0001/vimlogo.pdf$]
201
+ end
202
+
203
+ it "gives the right value for #blank?" do
204
+ @field.blank?.must_equal true
205
+ @field.value = path
206
+ @field.blank?.must_equal false
207
+ end
208
+ end
209
+ end
210
+ end
@@ -1,10 +1,10 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
 
4
- require File.expand_path('../../test_helper', __FILE__)
4
+ require File.expand_path('../../../test_helper', __FILE__)
5
5
  require 'fog'
6
6
 
7
- describe "Images" do
7
+ describe "Image Fields" do
8
8
 
9
9
  before do
10
10
  @site = setup_site
@@ -16,9 +16,14 @@ describe "Images" do
16
16
 
17
17
  describe "Image fields set using absolute values" do
18
18
  before do
19
+ class ::Piece < ::Content::Piece
20
+ end
21
+ @owner = Piece.create
19
22
  @image = S::Field::Image.new(:name => "image")
23
+ @image.owner = @owner
20
24
  @image.prototype = Spontaneous::Prototypes::FieldPrototype.new(@site.model, :image, :image)
21
25
  end
26
+
22
27
  it "accept and not alter URL values" do
23
28
  url = "http://example.com/image.png"
24
29
  @image.value = url
@@ -52,7 +57,7 @@ describe "Images" do
52
57
  @revision = 10
53
58
  @site.stubs(:working_revision).returns(@revision)
54
59
 
55
- @src_image = Pathname.new(File.join(File.dirname(__FILE__), "../fixtures/images/rose.jpg")).realpath
60
+ @src_image = Pathname.new(File.join(File.dirname(__FILE__), "../../fixtures/images/rose.jpg")).realpath
56
61
  @origin_image = @upload_dir + "rose.jpg"
57
62
  FileUtils.cp(@src_image.to_s, @origin_image.to_s)
58
63
  @origin_image = @origin_image.realpath.to_s
@@ -125,8 +130,33 @@ describe "Images" do
125
130
 
126
131
  describe "in templates" do
127
132
 
133
+ after do
134
+ Spontaneous::Field::Image.default_attributes = {}
135
+ end
136
+
128
137
  it "render an <img/> tag in HTML format" do
129
- assert_has_elements @image.to_html.split(' '), %(<img src="#{@image.src}" width="400" height="533" alt="" />).split(" ")
138
+ assert_has_elements @image.to_html.split(' '), %(<img src="#{@image.src}" alt="" />).split(" ")
139
+ end
140
+
141
+ it 'will fill in the image’s size if told to do so' do
142
+ expected = %(<img src="#{@image.src}" width="400" height="533" alt="" />).split(" ")
143
+ assert_has_elements @image.to_html(size: true).split(' '), expected
144
+ assert_has_elements @image.to_html(size: :auto).split(' '), expected
145
+ assert_has_elements @image.to_html(size: 'auto').split(' '), expected
146
+ end
147
+
148
+ it 'will fill in the image’s width with natural value if given a size of auto' do
149
+ expected = %(<img src="#{@image.src}" width="400" alt="" />).split(" ")
150
+ assert_has_elements @image.to_html(width: :auto).split(' '), expected
151
+ assert_has_elements @image.to_html(width: true).split(' '), expected
152
+ assert_has_elements @image.to_html(width: 'auto').split(' '), expected
153
+ end
154
+
155
+ it 'will fill in the image’s height with natural value if given a size of auto' do
156
+ expected = %(<img src="#{@image.src}" height="533" alt="" />).split(" ")
157
+ assert_has_elements @image.to_html(height: true).split(' '), expected
158
+ assert_has_elements @image.to_html(height: :auto).split(' '), expected
159
+ assert_has_elements @image.to_html(height: 'auto').split(' '), expected
130
160
  end
131
161
 
132
162
  it "use passed hash to overwrite tag attributes" do
@@ -136,21 +166,21 @@ describe "Images" do
136
166
  :rel => "lightbox",
137
167
  :random => "present"
138
168
  }
139
- assert_has_elements @image.to_html(attr).split(" "), %(<img src="#{@image.src}" width="400" height="533" alt="Magic" class="magic" rel="lightbox" random="present" />).split(" ")
169
+ assert_has_elements @image.to_html(attr).split(" "), %(<img src="#{@image.src}" alt="Magic" class="magic" rel="lightbox" random="present" />).split(" ")
140
170
  end
141
171
 
142
172
  it "be intelligent about setting width & height" do
143
- @image.to_html({ :width => 100 }).split(" ").must_have_elements %(<img src="#{@image.src}" width="100" alt="" />).split(" ")
144
- assert_has_elements @image.to_html({ :height => 100 }).split(" "), %(<img src="#{@image.src}" height="100" alt="" />).split(" ")
145
- assert_has_elements @image.to_html({ :width => 100, :height => 100 }).split(" "), %(<img src="#{@image.src}" width="100" height="100" alt="" />).split(" ")
173
+ @image.to_html({ width: 100 }).split(" ").must_have_elements %(<img src="#{@image.src}" width="100" alt="" />).split(" ")
174
+ assert_has_elements @image.to_html({ height: 100 }).split(" "), %(<img src="#{@image.src}" height="100" alt="" />).split(" ")
175
+ assert_has_elements @image.to_html({ width: 100, height: 100 }).split(" "), %(<img src="#{@image.src}" width="100" height="100" alt="" />).split(" ")
146
176
  end
147
177
 
148
- it "turn off setting with & height if either is passed as false" do
178
+ it "turn off setting width & height if either is passed as false" do
149
179
  assert_has_elements @image.to_html({ :width => false }).split(" "), %(<img src="#{@image.src}" alt="" />).split(" ")
150
180
  end
151
181
 
152
182
  it "escape values in params" do
153
- assert_has_elements @image.to_html({ :alt => "<danger\">" }).split(" "), %(<img src="#{@image.src}" width="400" height="533" alt="&lt;danger&quot;&gt;" />).split(" ")
183
+ assert_has_elements @image.to_html({ :alt => "<danger\">" }).split(" "), %(<img src="#{@image.src}" alt="&lt;danger&quot;&gt;" />).split(" ")
154
184
  end
155
185
 
156
186
  it "not include size parameters unless known" do
@@ -160,7 +190,22 @@ describe "Images" do
160
190
  end
161
191
 
162
192
  it "output image tags for its sizes too" do
163
- assert_has_elements @image.thumbnail.to_html(:alt => "Thumb").split(' '), %(<img src="#{@image.thumbnail.src}" width="38" height="50" alt="Thumb" />).split(" ")
193
+ assert_has_elements @image.thumbnail.to_html(alt: "Thumb", size: true).split(' '), %(<img src="#{@image.thumbnail.src}" width="38" height="50" alt="Thumb" />).split(" ")
194
+ end
195
+
196
+ it 'allows for setting site-wide options' do
197
+ Spontaneous::Field::Image.default_attributes = { width: :auto, alt: 'Banana'}
198
+ assert_has_elements @image.to_html().split(' '), %(<img src="#{@image.src}" width="400" alt="Banana" />).split(" ")
199
+ assert_has_elements @image.to_html(width: false, alt: 'Other').split(' '), %(<img src="#{@image.src}" alt="Other" />).split(" ")
200
+ end
201
+
202
+ it 'allows for setting values with a proc' do
203
+ Spontaneous::Field::Image.default_attributes = { something: proc { |field| field.name }}
204
+ assert_has_elements @image.to_html().split(' '), %(<img src="#{@image.src}" alt="" something="photo" />).split(" ")
205
+ end
206
+
207
+ it 'allows for setting data-* values with a hash' do
208
+ assert_has_elements @image.to_html(data: {name: proc { |field| field.name }, id: proc { |field| field.owner.id }}).split(' '), %(<img src="#{@image.src}" alt="" data-name="photo" data-id="#{@content_id}" />).split(" ")
164
209
  end
165
210
  end
166
211
  describe "defined by classes" do
@@ -257,7 +302,7 @@ describe "Images" do
257
302
 
258
303
  end
259
304
 
260
- describe "cloud storage yyy" do
305
+ describe "cloud storage" do
261
306
  before do
262
307
  @bucket_name = "media.example.com"
263
308
  @aws_credentials = {
@@ -267,9 +312,9 @@ describe "Images" do
267
312
  :public_host => "http://media.example.com"
268
313
  }
269
314
  ::Fog.mock!
270
- @storage = Spontaneous::Media::Store::Cloud.new(@aws_credentials, 'media.example.com')
315
+ @storage = Spontaneous::Media::Store::Cloud.new("S3", @aws_credentials, 'media.example.com')
271
316
  @storage.backend.directories.create(:key => @bucket_name)
272
- @site.stubs(:storage).with(anything).returns(@storage)
317
+ @site.storage_backends.unshift(@storage)
273
318
  @image.value = @origin_image.to_s
274
319
  end
275
320
 
@@ -281,6 +326,79 @@ describe "Images" do
281
326
  @image.original.src.must_equal "http://media.example.com/00234/0010/rose.jpg"
282
327
  @image.thumbnail.src.must_equal "http://media.example.com/00234/0010/rose.thumbnail.jpg"
283
328
  end
329
+
330
+ it "allows for reconfiguring the media urls" do
331
+ @storage.url_mapper = proc { |path| "http://cdn.example.com#{path}" }
332
+ @image.original.src.must_equal "http://cdn.example.com/00234/0010/rose.jpg"
333
+ @image.thumbnail.src.must_equal "http://cdn.example.com/00234/0010/rose.thumbnail.jpg"
334
+ end
335
+ end
336
+ end
337
+
338
+ describe '#blank?' do
339
+ before do
340
+ class ::ContentWithImage < ::Content::Piece
341
+ field :photo, :image do
342
+ size :smaller do
343
+ fit width: 100, height: 100
344
+ end
345
+ end
346
+ end
347
+
348
+ @instance = ContentWithImage.new
349
+
350
+ # @content_id = 234
351
+ # @instance.stubs(:id).returns(@content_id)
352
+ @field = @instance.photo
353
+ end
354
+
355
+ after do
356
+ Object.send(:remove_const, :ContentWithImage) rescue nil
357
+ end
358
+
359
+ it 'returns true for empty images' do
360
+ @field.blank?.must_equal true
361
+ @field.original.blank?.must_equal true
362
+ @field.smaller.blank?.must_equal true
363
+ end
364
+
365
+ it 'returns false for images with values' do
366
+ path = File.expand_path("../../../../fixtures/images/rose.jpg", __FILE__)
367
+ @field.value = path
368
+ @instance.save
369
+ @field.blank?.must_equal false
370
+ @field.original.blank?.must_equal false
371
+ @field.smaller.blank?.must_equal false
372
+ end
373
+
374
+ describe 'with cloud storage' do
375
+ before do
376
+ @bucket_name = "media.example.com"
377
+ @aws_credentials = {
378
+ :provider=>"AWS",
379
+ :aws_secret_access_key=>"SECRET_ACCESS_KEY",
380
+ :aws_access_key_id=>"ACCESS_KEY_ID",
381
+ :public_host => "http://media.example.com"
382
+ }
383
+ ::Fog.mock!
384
+ @storage = Spontaneous::Media::Store::Cloud.new("S3", @aws_credentials, 'media.example.com')
385
+ @storage.backend.directories.create(:key => @bucket_name)
386
+ @site.storage_backends.unshift(@storage)
387
+ end
388
+
389
+ it 'returns true for empty images' do
390
+ @field.blank?.must_equal true
391
+ @field.original.blank?.must_equal true
392
+ @field.smaller.blank?.must_equal true
393
+ end
394
+ it 'returns false for images with values' do
395
+ path = File.expand_path("../../../../fixtures/images/rose.jpg", __FILE__)
396
+ @field.value = path
397
+ @instance.save
398
+ @field.blank?.must_equal false
399
+ @field.original.blank?.must_equal false
400
+ @field.smaller.blank?.must_equal false
401
+ end
284
402
  end
285
403
  end
286
404
 
@@ -306,7 +424,7 @@ describe "Images" do
306
424
  @content_id = 234
307
425
  @instance.stubs(:id).returns(@content_id)
308
426
  @field = @instance.photo
309
- path = File.expand_path("../../fixtures/images/rose.jpg", __FILE__)
427
+ path = File.expand_path("../../../../fixtures/images/rose.jpg", __FILE__)
310
428
  @field.value = path
311
429
  end
312
430