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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +61 -0
- data/LICENSE +18 -17
- data/Rakefile +1 -1
- data/application/css/core.css.scss +1 -1
- data/application/css/dialogue.css.scss +8 -20
- data/application/js/preview.js +28 -7
- data/application/js/publish.js +15 -4
- data/application/js/top_bar.js +0 -16
- data/application/js/views/piece_view.js +1 -1
- data/lib/spontaneous/asset/environment.rb +16 -1
- data/lib/spontaneous/box.rb +68 -0
- data/lib/spontaneous/capistrano/deploy.rb +7 -4
- data/lib/spontaneous/capistrano/sync.rb +2 -2
- data/lib/spontaneous/cli/init.rb +70 -19
- data/lib/spontaneous/cli/init/db.rb +34 -55
- data/lib/spontaneous/cli/init/mysql.rb +5 -5
- data/lib/spontaneous/cli/init/postgresql.rb +8 -9
- data/lib/spontaneous/cli/init/sqlite.rb +1 -2
- data/lib/spontaneous/cli/migrate.rb +0 -1
- data/lib/spontaneous/cli/site.rb +4 -0
- data/lib/spontaneous/collections/entry_set.rb +11 -0
- data/lib/spontaneous/data_mapper/content_model.rb +2 -0
- data/lib/spontaneous/data_mapper/content_model/serialization.rb +2 -2
- data/lib/spontaneous/extensions/array.rb +12 -2
- data/lib/spontaneous/field/base.rb +10 -0
- data/lib/spontaneous/field/file.rb +32 -2
- data/lib/spontaneous/field/image.rb +24 -2
- data/lib/spontaneous/field/select.rb +8 -0
- data/lib/spontaneous/field/webvideo.rb +8 -0
- data/lib/spontaneous/generators/site/config/initializers/fields.rb +55 -0
- data/lib/spontaneous/json.rb +3 -2
- data/lib/spontaneous/logger.rb +2 -2
- data/lib/spontaneous/media/file.rb +3 -3
- data/lib/spontaneous/media/image/attributes.rb +72 -6
- data/lib/spontaneous/media/image/renderable.rb +53 -20
- data/lib/spontaneous/media/store.rb +3 -3
- data/lib/spontaneous/media/store/backend.rb +16 -0
- data/lib/spontaneous/media/store/cloud.rb +52 -12
- data/lib/spontaneous/media/store/local.rb +6 -3
- data/lib/spontaneous/model.rb +3 -0
- data/lib/spontaneous/model/core/entries.rb +34 -13
- data/lib/spontaneous/model/core/entry.rb +3 -1
- data/lib/spontaneous/model/page/controllers.rb +1 -2
- data/lib/spontaneous/model/page/paths.rb +18 -7
- data/lib/spontaneous/output/context.rb +0 -8
- data/lib/spontaneous/output/template/renderer.rb +2 -0
- data/lib/spontaneous/plugins/application/state.rb +0 -4
- data/lib/spontaneous/prototypes/field_prototype.rb +4 -0
- data/lib/spontaneous/publishing/immediate.rb +0 -5
- data/lib/spontaneous/publishing/progress.rb +2 -2
- data/lib/spontaneous/publishing/rerender.rb +1 -4
- data/lib/spontaneous/publishing/simultaneous.rb +19 -17
- data/lib/spontaneous/publishing/steps.rb +12 -3
- data/lib/spontaneous/rack.rb +2 -0
- data/lib/spontaneous/rack/asset_server.rb +5 -2
- data/lib/spontaneous/rack/back.rb +9 -1
- data/lib/spontaneous/rack/back/base.rb +1 -0
- data/lib/spontaneous/rack/back/changes.rb +5 -0
- data/lib/spontaneous/rack/back/preview.rb +4 -4
- data/lib/spontaneous/rack/back/private.rb +11 -0
- data/lib/spontaneous/rack/middleware/scope.rb +16 -4
- data/lib/spontaneous/rack/page_controller.rb +2 -2
- data/lib/spontaneous/rack/public.rb +52 -4
- data/lib/spontaneous/sequel.rb +10 -13
- data/lib/spontaneous/site.rb +28 -8
- data/lib/spontaneous/site/publishing.rb +1 -1
- data/lib/spontaneous/site/storage.rb +7 -4
- data/lib/spontaneous/tasks/environment.rake +3 -0
- data/lib/spontaneous/utils/database/postgres_dumper.rb +23 -2
- data/lib/spontaneous/version.rb +1 -1
- data/spontaneous.gemspec +7 -12
- data/test/fixtures/assets/public1/css/data.css.scss +1 -1
- data/test/functional/test_application.rb +15 -0
- data/test/functional/test_cli.rb +109 -3
- data/test/functional/test_front.rb +108 -10
- data/test/test_helper.rb +3 -3
- data/test/unit/fields/test_boolean_fields.rb +80 -0
- data/test/unit/fields/test_date_fields.rb +47 -0
- data/test/unit/fields/test_file_field.rb +210 -0
- data/test/unit/{test_images.rb → fields/test_image_fields.rb} +133 -15
- data/test/unit/fields/test_location_fields.rb +41 -0
- data/test/unit/fields/test_option_fields.rb +61 -0
- data/test/unit/fields/test_tag_list_fields.rb +45 -0
- data/test/unit/fields/test_text_fields.rb +124 -0
- data/test/unit/fields/test_web_video_fields.rb +198 -0
- data/test/unit/test_assets.rb +22 -22
- data/test/unit/test_boxes.rb +34 -13
- data/test/unit/test_changesets.rb +1 -0
- data/test/unit/test_extensions.rb +17 -0
- data/test/unit/test_fields.rb +20 -643
- data/test/unit/test_media.rb +9 -9
- data/test/unit/test_page.rb +47 -0
- data/test/unit/test_publishing_pipeline.rb +2 -2
- data/test/unit/test_serialisation.rb +37 -0
- data/test/unit/test_storage.rb +42 -3
- 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('
|
4
|
+
require File.expand_path('../../../test_helper', __FILE__)
|
5
5
|
require 'fog'
|
6
6
|
|
7
|
-
describe "
|
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__), "
|
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}"
|
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}"
|
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({ :
|
144
|
-
assert_has_elements @image.to_html({ :
|
145
|
-
assert_has_elements @image.to_html({ :
|
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
|
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}"
|
183
|
+
assert_has_elements @image.to_html({ :alt => "<danger\">" }).split(" "), %(<img src="#{@image.src}" alt="<danger">" />).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(:
|
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
|
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.
|
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("
|
427
|
+
path = File.expand_path("../../../../fixtures/images/rose.jpg", __FILE__)
|
310
428
|
@field.value = path
|
311
429
|
end
|
312
430
|
|