liquid_cms 0.3.0.10 → 0.3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +12 -0
- data/app/controllers/cms/assets_controller.rb +32 -10
- data/app/controllers/cms/components_controller.rb +3 -3
- data/app/controllers/cms/main_controller.rb +2 -0
- data/app/controllers/cms/pages_controller.rb +2 -2
- data/app/helpers/cms/pages_helper.rb +0 -12
- data/app/liquid/cms_paperclip_extension.rb +1 -1
- data/app/liquid/drops/cms_asset_drop.rb +15 -0
- data/app/liquid/filters/cms_filters.rb +1 -1
- data/app/liquid/tags/asset_search_tag.rb +26 -0
- data/app/liquid/tags/cms/tag_common.rb +29 -0
- data/app/liquid/tags/data_tag.rb +59 -0
- data/app/models/cms/asset.rb +109 -2
- data/app/models/cms/component.rb +21 -17
- data/app/models/cms/page.rb +1 -3
- data/app/models/cms/tag.rb +21 -0
- data/app/models/cms/taggable.rb +78 -0
- data/app/models/cms/tagging.rb +6 -0
- data/app/views/cms/assets/_asset.html.erb +2 -3
- data/app/views/cms/assets/_form.html.erb +53 -2
- data/app/views/cms/assets/_list.html.erb +16 -1
- data/app/views/cms/assets/_meta_field.html.erb +15 -0
- data/app/views/cms/documentation/_cms_drops.html.erb +18 -0
- data/app/views/cms/documentation/_cms_tags.html.erb +13 -0
- data/app/views/cms/pages/_page.html.erb +1 -3
- data/app/views/cms/shared/_sidebar.html.erb +30 -28
- data/config/initializers/cms/liquid_cms.rb +8 -0
- data/config/locales/cms/en.yml +5 -0
- data/generators/liquid_cms/templates/migration_rev1.rb +38 -0
- data/lib/generators/liquid_cms/install_generator.rb +7 -9
- data/lib/generators/liquid_cms/templates/migration_rev1.rb +38 -0
- data/lib/generators/liquid_cms/templates/public/cms/stylesheets/sidebar.css +25 -7
- data/lib/generators/liquid_cms/templates/public/cms/stylesheets/simple_form.css +79 -4
- data/lib/generators/liquid_cms/templates/public/cms/stylesheets/styles.css +0 -8
- data/lib/generators/liquid_cms/templates/public/cms/stylesheets/themes/dark.css +3 -0
- data/lib/liquid_cms/configuration.rb +12 -0
- data/lib/liquid_cms/version.rb +1 -1
- data/test/functional/assets_controller_test.rb +64 -16
- data/test/functional/components_controller_test.rb +90 -1
- data/test/functional/main_controller_test.rb +21 -0
- data/test/integration/pages_test.rb +123 -0
- data/test/integration/pages_test_no_context.rb +57 -0
- data/test/rails_app/db/migrate/20110329201435_create_liquid_cms_upgrade_rev1.rb +38 -0
- data/test/test_helper.rb +2 -0
- data/test/test_helpers/asset_helpers.rb +6 -4
- data/test/test_helpers/component_helpers.rb +37 -0
- data/test/test_helpers/file_helpers.rb +11 -0
- data/test/unit/asset_test.rb +114 -8
- data/test/unit/component_test.rb +64 -1
- data/test/unit/helpers/cms/common_helper_test.rb +4 -0
- metadata +37 -6
- data/app/views/cms/assets/destroy.js.rjs +0 -2
- data/test/rails_app/config/initializers/cms/vestal_versions.rb +0 -11
@@ -3,7 +3,96 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
3
3
|
class Cms::ComponentsControllerTest < ActionController::TestCase
|
4
4
|
def setup
|
5
5
|
setup_company_and_login_admin
|
6
|
+
@context = Cms::Context.new(@company)
|
6
7
|
end
|
7
8
|
|
8
|
-
|
9
|
+
context "component file" do
|
10
|
+
teardown do
|
11
|
+
cleanup_components
|
12
|
+
end
|
13
|
+
|
14
|
+
context "editable" do
|
15
|
+
setup do
|
16
|
+
@file = File.join('path', 'to', 'file.js')
|
17
|
+
setup_component Cms::Component.full_path(@context).join(@file)
|
18
|
+
end
|
19
|
+
|
20
|
+
teardown do
|
21
|
+
cleanup_components
|
22
|
+
end
|
23
|
+
|
24
|
+
should "edit" do
|
25
|
+
get :edit, :url => @file
|
26
|
+
assert_response :success
|
27
|
+
assert_template 'edit'
|
28
|
+
end
|
29
|
+
|
30
|
+
should "update" do
|
31
|
+
put :update, :url => @file, :file_content => 'new content'
|
32
|
+
assert_response :redirect
|
33
|
+
assert_equal "The component file has been updated.", flash[:notice]
|
34
|
+
assert_equal "new content\n", File.read(Cms::Component.full_path(@context).join(@file))
|
35
|
+
end
|
36
|
+
|
37
|
+
should "valid destroy" do
|
38
|
+
delete :destroy, :url => @file
|
39
|
+
assert_response :redirect
|
40
|
+
assert_equal "The component has been removed.", flash[:notice]
|
41
|
+
end
|
42
|
+
|
43
|
+
should "invalid destroy" do
|
44
|
+
delete :destroy, :url => "#{@file}.bak"
|
45
|
+
assert_response :redirect
|
46
|
+
assert_equal "The component path was invalid.", flash[:error]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "non-editable" do
|
51
|
+
setup do
|
52
|
+
@file = File.join('path', 'to', 'file.jpg')
|
53
|
+
setup_component Cms::Component.full_path(@context).join(@file)
|
54
|
+
end
|
55
|
+
|
56
|
+
should "edit" do
|
57
|
+
get :edit, :url => @file
|
58
|
+
assert_response :redirect
|
59
|
+
assert_equal "Not an editable component.", flash[:error]
|
60
|
+
end
|
61
|
+
|
62
|
+
should "update" do
|
63
|
+
put :update, :url => @file, :file_content => 'new content'
|
64
|
+
assert_response :redirect
|
65
|
+
assert_equal "Not an editable component.", flash[:error]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "upload" do
|
71
|
+
teardown do
|
72
|
+
cleanup_components
|
73
|
+
end
|
74
|
+
|
75
|
+
should "successfully upload a valid zip" do
|
76
|
+
create_zip 'test.zip' do |path, relpath|
|
77
|
+
post :upload, :zip_file => fixture_file_upload(relpath)
|
78
|
+
assert_response :redirect
|
79
|
+
assert_equal 'The component has been uploaded.', flash[:notice]
|
80
|
+
|
81
|
+
assert File.exist?(Cms::Component.full_path(@context).join('test.txt'))
|
82
|
+
assert !File.exist?(Cms::Component.full_path(@context).join('test.ext'))
|
83
|
+
assert File.exist?(Cms::Component.full_path(@context).join('dir', 'test.txt'))
|
84
|
+
assert !File.exist?(Cms::Component.full_path(@context).join('dir', 'test.exe'))
|
85
|
+
assert !File.exist?(Cms::Component.full_path(@context).join('../../dir', 'test.exe'))
|
86
|
+
assert !File.exist?(Cms::Component.full_path(@context).join('../../dir', 'test.txt'))
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
should "produce an error" do
|
91
|
+
create_zip 'test.bmp' do |path, relpath|
|
92
|
+
post :upload, :zip_file => fixture_file_upload(relpath)
|
93
|
+
assert_response :redirect
|
94
|
+
assert_equal 'The component file must be a zip archive.', flash[:error]
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
9
98
|
end
|
@@ -27,6 +27,27 @@ class Cms::MainControllerTest < ActionController::TestCase
|
|
27
27
|
assert_response :success
|
28
28
|
assert_select "#assets p.preview", false
|
29
29
|
end
|
30
|
+
|
31
|
+
should "show no tags" do
|
32
|
+
Factory(:image_asset, :context => @company)
|
33
|
+
|
34
|
+
get :index
|
35
|
+
assert_response :success
|
36
|
+
assert_select 'li.group.tagged', false
|
37
|
+
assert_select 'li.group.untagged', true
|
38
|
+
assert_select 'li.group.untagged h4', false
|
39
|
+
end
|
40
|
+
|
41
|
+
should "show tags" do
|
42
|
+
tagged = Factory(:image_asset, :context => @company, :tag_list => 'test, this')
|
43
|
+
Factory(:image_asset, :context => @company)
|
44
|
+
|
45
|
+
get :index
|
46
|
+
assert_response :success
|
47
|
+
assert_select 'li.group.tagged', tagged.tags.count
|
48
|
+
assert_select 'li.group.untagged'
|
49
|
+
assert_select 'li.group.untagged h4', 'Untagged'
|
50
|
+
end
|
30
51
|
end
|
31
52
|
|
32
53
|
context "permission access" do
|
@@ -132,6 +132,82 @@ class Cms::PagesTest < ActionController::IntegrationTest
|
|
132
132
|
assert_select '#content span', "test"
|
133
133
|
end
|
134
134
|
end
|
135
|
+
|
136
|
+
context "asset_data" do
|
137
|
+
should "find assets" do
|
138
|
+
@asset = Factory(:image_asset, :context => @company, :custom_height => 200, :custom_width => 200)
|
139
|
+
|
140
|
+
@page = @company.pages.create :name => 'content', :published => true, :content => <<-LIQUID
|
141
|
+
{% asset_data %}
|
142
|
+
LIQUID
|
143
|
+
|
144
|
+
get @page.url
|
145
|
+
assert response.body.include?("The required 'tag' parameter is missing.")
|
146
|
+
|
147
|
+
@page.content = <<-LIQUID
|
148
|
+
{% asset_data tag:'test' %}
|
149
|
+
<span id="count">{{ assets | size }}</span>
|
150
|
+
LIQUID
|
151
|
+
@page.save
|
152
|
+
|
153
|
+
get @page.url
|
154
|
+
assert_select '#count', '0'
|
155
|
+
|
156
|
+
# update the tags
|
157
|
+
@asset.tag_list = "test"
|
158
|
+
@asset.save
|
159
|
+
|
160
|
+
@page.content = <<-LIQUID
|
161
|
+
{% asset_data tag:'test' random:true %}
|
162
|
+
<span id="count">{{ assets | size }}</span>
|
163
|
+
{{ assets | first | assign_to: 'meta_asset' }}
|
164
|
+
<span class="o_dims">{{ meta_asset.image.original.width }}</span>
|
165
|
+
<span class="c_dims">{{ meta_asset.image.custom.width }}</span>
|
166
|
+
<span class="name">{{ meta_asset.meta.name_test }}</span>
|
167
|
+
<span class="location">{{ meta_asset.meta.location }}</span>
|
168
|
+
<span class="none">{{ meta_asset.meta.none }}</span>
|
169
|
+
LIQUID
|
170
|
+
@page.save
|
171
|
+
|
172
|
+
get @page.url
|
173
|
+
assert_select '#count', '1'
|
174
|
+
assert_select '.o_dims', '20'
|
175
|
+
assert_select '.c_dims', '20'
|
176
|
+
assert_select '.name', ''
|
177
|
+
assert_select '.location', ''
|
178
|
+
assert_select '.none', ''
|
179
|
+
|
180
|
+
# update the meta data
|
181
|
+
@asset.meta_data = [{:name => 'name_test', :value => 'value test'}, {:name => 'location', :value => 'earth'}]
|
182
|
+
@asset.save
|
183
|
+
|
184
|
+
@page.content = <<-LIQUID
|
185
|
+
{% asset_data tag:'test' as:'meta_assets' %}
|
186
|
+
<span id="count">{{ meta_assets | size }}</span>
|
187
|
+
{{ meta_assets | first | assign_to: 'meta_asset' }}
|
188
|
+
<span class="name">{{ meta_asset.meta.name_test }}</span>
|
189
|
+
<span class="location">{{ meta_asset.meta.location }}</span>
|
190
|
+
<span class="none">{{ meta_asset.meta.none }}</span>
|
191
|
+
LIQUID
|
192
|
+
@page.save
|
193
|
+
|
194
|
+
get @page.url
|
195
|
+
assert_select '#count', '1'
|
196
|
+
assert_select '.name', 'value test'
|
197
|
+
assert_select '.location', 'earth'
|
198
|
+
assert_select '.none', ''
|
199
|
+
|
200
|
+
# specify the limit as 0
|
201
|
+
@page.content = <<-LIQUID
|
202
|
+
{% asset_data tag:'test' as:'meta_assets' random:true limit:0 %}
|
203
|
+
<span id="count">{{ meta_assets | size }}</span>
|
204
|
+
LIQUID
|
205
|
+
@page.save
|
206
|
+
|
207
|
+
get @page.url
|
208
|
+
assert_select '#count', '0'
|
209
|
+
end
|
210
|
+
end
|
135
211
|
end
|
136
212
|
|
137
213
|
context "filters" do
|
@@ -296,4 +372,51 @@ class Cms::PagesTest < ActionController::IntegrationTest
|
|
296
372
|
end
|
297
373
|
end
|
298
374
|
end
|
375
|
+
|
376
|
+
=begin
|
377
|
+
context "caching" do
|
378
|
+
setup do
|
379
|
+
ActionController::Base.perform_caching = true
|
380
|
+
Rails.cache.clear
|
381
|
+
@page = Factory(:page, :context => @company)
|
382
|
+
end
|
383
|
+
|
384
|
+
teardown do
|
385
|
+
ActionController::Base.perform_caching = false
|
386
|
+
end
|
387
|
+
|
388
|
+
should "expire the cache when the page is updated" do
|
389
|
+
assert_cache_empty
|
390
|
+
|
391
|
+
get @page.url
|
392
|
+
assert_cache_present
|
393
|
+
|
394
|
+
# updating the page will remove the cache
|
395
|
+
put cms_page_path(@page), :content => 'new content'
|
396
|
+
assert_cache_empty
|
397
|
+
|
398
|
+
get @page.url
|
399
|
+
assert_cache_present
|
400
|
+
|
401
|
+
# destroying the page will remove the cache
|
402
|
+
delete cms_page_path(@page)
|
403
|
+
assert_cache_empty
|
404
|
+
end
|
405
|
+
|
406
|
+
should "generate a cache key" do
|
407
|
+
get '/'
|
408
|
+
assert_cache_key "views/CONTEXT_PATH_#{@company.id}"
|
409
|
+
|
410
|
+
get @page.url
|
411
|
+
assert_cache_key "views/CONTEXT_PATH_#{@company.id}/page"
|
412
|
+
|
413
|
+
get @page.url+'?page=1&test=abcde'
|
414
|
+
assert_cache_key "views/CONTEXT_PATH_#{@company.id}/page/page=1&test=abcde"
|
415
|
+
|
416
|
+
# different order sent via url, but the path params will be sorted in the path
|
417
|
+
get @page.url+'?test=abcde&page=1'
|
418
|
+
assert_cache_key "views/CONTEXT_PATH_#{@company.id}/page/page=1&test=abcde"
|
419
|
+
end
|
420
|
+
end
|
421
|
+
=end
|
299
422
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.expand_path('../../no_context_test_helper', __FILE__)
|
2
|
+
require File.expand_path('../../test_helpers/cache_helper', __FILE__)
|
3
|
+
|
4
|
+
class Cms::PagesTestNoContext < ActionController::IntegrationTest
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@company = Factory(:company)
|
8
|
+
@user = @company.users.first
|
9
|
+
login_company(@user.username, 'password')
|
10
|
+
set_company_host(@company)
|
11
|
+
end
|
12
|
+
|
13
|
+
context "caching" do
|
14
|
+
setup do
|
15
|
+
ActionController::Base.perform_caching = true
|
16
|
+
Rails.cache.clear
|
17
|
+
@page = Factory(:page)
|
18
|
+
end
|
19
|
+
|
20
|
+
teardown do
|
21
|
+
ActionController::Base.perform_caching = false
|
22
|
+
end
|
23
|
+
|
24
|
+
should "expire the cache when the page is updated" do
|
25
|
+
assert_cache_empty
|
26
|
+
|
27
|
+
get @page.url
|
28
|
+
assert_cache_present
|
29
|
+
|
30
|
+
# updating the page will remove the cache
|
31
|
+
put cms_page_path(@page), :content => 'new content'
|
32
|
+
assert_cache_empty
|
33
|
+
|
34
|
+
get @page.url
|
35
|
+
assert_cache_present
|
36
|
+
|
37
|
+
# destroying the page will remove the cache
|
38
|
+
delete cms_page_path(@page)
|
39
|
+
assert_cache_empty
|
40
|
+
end
|
41
|
+
|
42
|
+
should "generate a cache key" do
|
43
|
+
get '/'
|
44
|
+
assert_cache_key "views/NO_CONTEXT"
|
45
|
+
|
46
|
+
get @page.url
|
47
|
+
assert_cache_key "views/NO_CONTEXT/page"
|
48
|
+
|
49
|
+
get @page.url+'?page=1&test=abcde'
|
50
|
+
assert_cache_key "views/NO_CONTEXT/page/page=1&test=abcde"
|
51
|
+
|
52
|
+
# different order sent via url, but the path params will be sorted in the path
|
53
|
+
get @page.url+'?test=abcde&page=1'
|
54
|
+
assert_cache_key "views/NO_CONTEXT/page/page=1&test=abcde"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class CreateLiquidCmsUpgradeRev1 < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
change_table :cms_assets do |t|
|
4
|
+
t.integer :custom_height
|
5
|
+
t.integer :custom_width
|
6
|
+
t.text :meta_data # serialized yaml
|
7
|
+
end
|
8
|
+
|
9
|
+
drop_table :versions
|
10
|
+
|
11
|
+
create_table :cms_tags do |t|
|
12
|
+
t.column :name, :string
|
13
|
+
end
|
14
|
+
|
15
|
+
create_table :cms_taggings do |t|
|
16
|
+
t.column :tag_id, :integer
|
17
|
+
t.column :taggable_id, :integer
|
18
|
+
t.column :taggable_type, :string
|
19
|
+
|
20
|
+
t.column :created_at, :datetime
|
21
|
+
end
|
22
|
+
|
23
|
+
add_index :cms_taggings, :tag_id
|
24
|
+
add_index :cms_taggings, [:taggable_id, :taggable_type]
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.down
|
28
|
+
drop_table :cms_taggings
|
29
|
+
drop_table :cms_tags
|
30
|
+
|
31
|
+
create_table :versions do |t|
|
32
|
+
end
|
33
|
+
|
34
|
+
change_table :cms_assets do |t|
|
35
|
+
t.remove :custom_height, :custom_width, :meta_data
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -32,12 +32,14 @@ end
|
|
32
32
|
|
33
33
|
require 'test_helpers/login_methods'
|
34
34
|
require 'test_helpers/asset_helpers'
|
35
|
+
require 'test_helpers/component_helpers'
|
35
36
|
|
36
37
|
class ActionController::TestCase
|
37
38
|
include AssetHelpers
|
38
39
|
end
|
39
40
|
class ActiveSupport::TestCase
|
40
41
|
include AssetHelpers
|
42
|
+
include ComponentHelpers
|
41
43
|
end
|
42
44
|
|
43
45
|
|
@@ -1,12 +1,14 @@
|
|
1
|
+
require File.expand_path('../file_helpers', __FILE__)
|
2
|
+
|
1
3
|
module AssetHelpers
|
4
|
+
include FileHelpers
|
5
|
+
|
2
6
|
def setup_asset(file_name)
|
3
|
-
|
4
|
-
FileUtils.touch file_name
|
7
|
+
setup_file file_name
|
5
8
|
end
|
6
9
|
|
7
10
|
def cleanup_assets
|
8
|
-
|
9
|
-
FileUtils.rm_rf Rails.root.join('public', 'cms', 'assets')
|
11
|
+
cleanup_files 'assets'
|
10
12
|
end
|
11
13
|
|
12
14
|
def asset_path
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.expand_path('../file_helpers', __FILE__)
|
2
|
+
|
3
|
+
module ComponentHelpers
|
4
|
+
include FileHelpers
|
5
|
+
|
6
|
+
def setup_component(file_name)
|
7
|
+
setup_file file_name
|
8
|
+
end
|
9
|
+
|
10
|
+
def cleanup_components
|
11
|
+
cleanup_files 'components'
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_zip(name)
|
15
|
+
path = Pathname.new(File.join('public', 'cms', 'temp', name))
|
16
|
+
fname = Rails.root.join('test', 'fixtures', path).to_s
|
17
|
+
|
18
|
+
FileUtils.mkdir_p File.dirname(fname)
|
19
|
+
|
20
|
+
begin
|
21
|
+
Zip::ZipFile.open(fname, Zip::ZipFile::CREATE) do |zipfile|
|
22
|
+
zipfile.get_output_stream("test.txt") {}
|
23
|
+
zipfile.get_output_stream("test.exe") {} # invalid file ext will be ignored
|
24
|
+
zipfile.mkdir("dir")
|
25
|
+
zipfile.get_output_stream("dir/test.exe") {}
|
26
|
+
zipfile.get_output_stream("dir/test.txt") {}
|
27
|
+
zipfile.get_output_stream("../../dir/test.exe") {} # relative path file will be ignored
|
28
|
+
zipfile.get_output_stream("../../dir/test.txt") {} # relative path file will be ignored
|
29
|
+
end
|
30
|
+
|
31
|
+
yield fname, path
|
32
|
+
|
33
|
+
ensure
|
34
|
+
cleanup_files 'temp'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module FileHelpers
|
2
|
+
def setup_file(file_name)
|
3
|
+
FileUtils.mkdir_p File.dirname(file_name)
|
4
|
+
FileUtils.touch file_name
|
5
|
+
end
|
6
|
+
|
7
|
+
def cleanup_files(dir)
|
8
|
+
FileUtils.rm_rf TestConfig.paperclip_test_root
|
9
|
+
FileUtils.rm_rf Rails.root.join('public', 'cms', dir)
|
10
|
+
end
|
11
|
+
end
|