spontaneous 0.2.0.beta9 → 0.2.0.beta10

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 (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