quirkey-qadmin 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -0
- data/LICENSE +20 -0
- data/Manifest.txt +20 -12
- data/PostInstall.txt +1 -1
- data/README.rdoc +4 -29
- data/Rakefile +5 -3
- data/lib/qadmin.rb +4 -2
- data/lib/qadmin/assets/form_builder.rb +36 -0
- data/lib/qadmin/configuration.rb +48 -0
- data/lib/qadmin/controller.rb +64 -34
- data/lib/qadmin/form_builder.rb +23 -0
- data/lib/qadmin/helper.rb +46 -15
- data/lib/qadmin/option_set.rb +48 -0
- data/lib/qadmin/overlay.rb +31 -0
- data/lib/qadmin/page_titles.rb +34 -0
- data/lib/qadmin/templates.rb +52 -0
- data/lib/qadmin/views/content_forms/_attachments_form.erb +0 -0
- data/lib/qadmin/views/content_forms/_photos_form.erb +4 -0
- data/lib/qadmin/views/content_forms/_videos_form.erb +0 -0
- data/lib/qadmin/views/default/edit.erb +12 -0
- data/lib/qadmin/views/default/index.erb +9 -0
- data/lib/qadmin/views/default/new.erb +12 -0
- data/lib/qadmin/views/default/show.erb +7 -0
- data/rails/init.rb +2 -1
- data/rails_generators/qadmin/qadmin_generator.rb +36 -19
- data/rails_generators/qadmin/templates/_form.html.erb +7 -0
- data/rails_generators/qadmin/templates/_instance.html.erb +8 -0
- data/rails_generators/qadmin/templates/controller.rb +1 -1
- data/rails_generators/qadmin/templates/functional_test.rb +102 -65
- data/rails_generators/qadmin/templates/images/{icon_up.gif → icon_asc.gif} +0 -0
- data/rails_generators/qadmin/templates/images/{icon_down.gif → icon_desc.gif} +0 -0
- data/rails_generators/qadmin/templates/layout.html.erb +45 -0
- data/test/test_helper.rb +8 -0
- data/test/test_qadmin_controller.rb +16 -6
- data/test/test_qadmin_generator.rb +17 -2
- data/test/test_qadmin_option_set.rb +86 -0
- metadata +46 -14
- data/rails_generators/qadmin/templates/shoulda_functional_test.rb +0 -33
- data/script/console +0 -10
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/script/txt2html +0 -71
@@ -1,77 +1,114 @@
|
|
1
|
-
require
|
2
|
-
require '<%= controller_file_path %>_controller'
|
1
|
+
require 'test_helper'
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
class <%= controller_class_name %>ControllerTest < ActionController::TestCase
|
4
|
+
|
5
|
+
context "<%= controller_class_name %>" do
|
6
|
+
setup do
|
7
|
+
@<%= file_name %> = <%= table_name %>(!!FIXTURE_NAME)
|
8
|
+
@<%= file_name %>_params = {
|
9
|
+
<%= attributes.collect { |a| ":#{a.name} => '#{a.default}'" }.join(",\n\t") %>
|
10
|
+
}
|
11
|
+
end
|
6
12
|
|
7
|
-
|
8
|
-
|
13
|
+
context "html" do
|
14
|
+
context "GET index" do
|
15
|
+
setup do
|
16
|
+
get :index
|
17
|
+
end
|
9
18
|
|
10
|
-
|
11
|
-
@controller = <%= controller_class_name %>Controller.new
|
12
|
-
@request = ActionController::TestRequest.new
|
13
|
-
@response = ActionController::TestResponse.new
|
14
|
-
#login_as(:aaron)
|
15
|
-
@<%= file_name %> = <%= model_name.tableize %>(!!FIXTURENAME)
|
16
|
-
end
|
19
|
+
should_respond_with :success
|
17
20
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
# end
|
21
|
+
should "load paginated collection of <%= table_name %>" do
|
22
|
+
assert assigns(:<%= table_name %>)
|
23
|
+
assert assigns(:<%= table_name %>).respond_to?(:next_page)
|
24
|
+
end
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
end
|
26
|
+
should "display <%= file_name %>" do
|
27
|
+
assert_select "#<%= file_name %>_#{@<%= file_name %>.id}"
|
28
|
+
end
|
29
|
+
end
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_should_create_<%= file_name %>
|
37
|
-
assert_difference '<%= model_name %>.count' do
|
38
|
-
post :create, :<%= file_name %> => <%= file_name %>_params
|
39
|
-
assert_redirected_to <%= table_name.singularize %>_path(assigns(:<%= file_name %>))
|
40
|
-
end
|
41
|
-
end
|
31
|
+
context "GET show" do
|
32
|
+
setup do
|
33
|
+
get :show, :id => @<%= file_name %>.id
|
34
|
+
end
|
42
35
|
|
43
|
-
|
44
|
-
|
45
|
-
assert_response :success
|
46
|
-
assert assigns(:<%= file_name %>)
|
47
|
-
end
|
36
|
+
should_respond_with :success
|
37
|
+
should_assign_to :<%= file_name %>
|
48
38
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
39
|
+
should "load <%= file_name %>" do
|
40
|
+
assert_equal @<%= file_name %>, assigns(:<%= file_name %>)
|
41
|
+
end
|
42
|
+
|
43
|
+
should "display <%= file_name %>" do
|
44
|
+
assert_select "#<%= file_name %>_#{@<%= file_name %>.id}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "GET new" do
|
49
|
+
setup do
|
50
|
+
get :new
|
51
|
+
end
|
52
|
+
|
53
|
+
should_respond_with :success
|
54
|
+
should_assign_to :<%= file_name %>
|
55
|
+
|
56
|
+
should "display form" do
|
57
|
+
assert_select 'form'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "POST create with valid <%= file_name %>" do
|
62
|
+
setup do
|
63
|
+
post :create, :<%= file_name %> => @<%= file_name %>_params
|
64
|
+
end
|
65
|
+
|
66
|
+
should_change '<%= model_name %>.count', :by => 1
|
67
|
+
should_redirect_to "<%= file_name %>_path(@<%= file_name %>)"
|
68
|
+
should_assign_to :<%= file_name %>
|
69
|
+
end
|
70
|
+
|
71
|
+
context "GET edit" do
|
72
|
+
setup do
|
73
|
+
get :edit, :id => @<%= file_name %>.id
|
74
|
+
end
|
75
|
+
|
76
|
+
should_respond_with :success
|
77
|
+
should_assign_to :<%= file_name %>
|
78
|
+
|
79
|
+
should "load <%= file_name %>" do
|
80
|
+
assert_equal @<%= file_name %>, assigns(:<%= file_name %>)
|
81
|
+
end
|
82
|
+
|
83
|
+
should "display form" do
|
84
|
+
assert_select 'form'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "PUT update" do
|
89
|
+
setup do
|
90
|
+
put :update, :id => @<%= file_name %>.id, :<%= file_name %> => @<%= file_name %>_params
|
91
|
+
end
|
92
|
+
|
93
|
+
should_not_change '<%= model_name %>.count'
|
94
|
+
should_redirect_to "<%= file_name %>_path(@<%= file_name %>)"
|
95
|
+
should_assign_to :<%= file_name %>
|
96
|
+
|
97
|
+
should "load <%= file_name %>" do
|
98
|
+
assert_equal @<%= file_name %>, assigns(:<%= file_name %>)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context "DELETE destroy" do
|
103
|
+
setup do
|
104
|
+
delete :destroy, :id => @<%= file_name %>.id
|
105
|
+
end
|
106
|
+
|
107
|
+
should_change '<%= model_name %>.count', :by => -1
|
108
|
+
should_redirect_to "<%= table_name %>_path"
|
109
|
+
should_assign_to :<%= file_name %>
|
110
|
+
end
|
67
111
|
end
|
68
112
|
end
|
69
113
|
|
70
|
-
|
71
|
-
protected
|
72
|
-
def <%= file_name %>_params(options = {})
|
73
|
-
{
|
74
|
-
<%= attributes.collect { |a| ":#{a.name} => #{a.default}" }.join(', ') %>
|
75
|
-
}.update(options)
|
76
|
-
end
|
77
114
|
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
+
|
4
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
5
|
+
<head>
|
6
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
7
|
+
|
8
|
+
<title>Admin</title>
|
9
|
+
|
10
|
+
<%%= stylesheet_link_tag 'admin' %>
|
11
|
+
<%%= javascript_include_tag :defaults %>
|
12
|
+
<%%= javascript_include_tag 'file_browser' %>
|
13
|
+
</head>
|
14
|
+
<body>
|
15
|
+
<div id="header">
|
16
|
+
<h1>Admin</h1>
|
17
|
+
<div id="loginbox"><%% if logged_in? %>Welcome, <%%= current_user %> / <%%= link_to "Logout", '/logout' %><%% else %><%%= link_to "Login", '/login' %><%% end %></div>
|
18
|
+
</div>
|
19
|
+
<div id="main">
|
20
|
+
<div id="left_menu">
|
21
|
+
<h3>Panels</h3>
|
22
|
+
<ul class="menu">
|
23
|
+
<%% simple_menu([]) do |name,controller| %>
|
24
|
+
<li><%%= link_to(name.titleize, {:controller => controller}, :class => (like_current_page?(:controller => controller) ? 'selected' : '')) %></li>
|
25
|
+
<%% end %>
|
26
|
+
</ul>
|
27
|
+
<h3>Quick Links</h3>
|
28
|
+
<ul class="menu">
|
29
|
+
</ul>
|
30
|
+
</div>
|
31
|
+
<div id="content">
|
32
|
+
<%% if flash[:message] %>
|
33
|
+
<div id="message_main" class="message">
|
34
|
+
<%%= h flash[:message] %>
|
35
|
+
</div>
|
36
|
+
<%% elsif flash[:warning] %>
|
37
|
+
<div id="message_main" class="message warning">
|
38
|
+
<%%= h flash[:warning] %>
|
39
|
+
</div>
|
40
|
+
<%% end %>
|
41
|
+
<%%= yield %>
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
</body>
|
45
|
+
</html>
|
data/test/test_helper.rb
CHANGED
@@ -17,6 +17,10 @@ module ActiveRecord
|
|
17
17
|
[]
|
18
18
|
end
|
19
19
|
|
20
|
+
def column_names
|
21
|
+
['id'] #content_columns.collect {|c| c.name }
|
22
|
+
end
|
23
|
+
|
20
24
|
end
|
21
25
|
self.pluralize_table_names = true
|
22
26
|
end
|
@@ -59,6 +63,10 @@ class Item < ActiveRecord::Base
|
|
59
63
|
MockColumn.new(name, type)
|
60
64
|
end
|
61
65
|
end
|
66
|
+
|
67
|
+
def column_names
|
68
|
+
[] #content_columns.collect {|c| c.name }
|
69
|
+
end
|
62
70
|
end
|
63
71
|
end
|
64
72
|
|
@@ -16,7 +16,7 @@ class TestQadminController < Test::Unit::TestCase
|
|
16
16
|
def assert_does_not_define_actions(*actions)
|
17
17
|
[actions].flatten.each do |action|
|
18
18
|
assert !@controller.respond_to?(action), "Should not define ##{action}"
|
19
|
-
end
|
19
|
+
end
|
20
20
|
end
|
21
21
|
public
|
22
22
|
|
@@ -26,6 +26,7 @@ class TestQadminController < Test::Unit::TestCase
|
|
26
26
|
|
27
27
|
context "with no options" do
|
28
28
|
setup do
|
29
|
+
class ::NoOption < ActiveRecord::Base; end
|
29
30
|
class NoOptionsController < MockController
|
30
31
|
qadmin
|
31
32
|
end
|
@@ -36,6 +37,10 @@ class TestQadminController < Test::Unit::TestCase
|
|
36
37
|
assert_defines_actions(crud_actions)
|
37
38
|
end
|
38
39
|
|
40
|
+
should "set qadmin configuration" do
|
41
|
+
assert @controller.send(:qadmin_configuration).is_a?(Qadmin::Configuration)
|
42
|
+
end
|
43
|
+
|
39
44
|
should "set model_name from controller name" do
|
40
45
|
assert_equal 'NoOption', @controller.send(:model_name)
|
41
46
|
end
|
@@ -52,8 +57,9 @@ class TestQadminController < Test::Unit::TestCase
|
|
52
57
|
context "with hashed options" do
|
53
58
|
context "with :exclude" do
|
54
59
|
setup do
|
60
|
+
class ::Exclude < ActiveRecord::Base; end
|
55
61
|
class ExcludeController < MockController
|
56
|
-
qadmin :exclude => [:show, :destroy]
|
62
|
+
qadmin :available_actions => {:exclude => [:show, :destroy]}
|
57
63
|
end
|
58
64
|
@controller = ExcludeController.new
|
59
65
|
end
|
@@ -69,8 +75,9 @@ class TestQadminController < Test::Unit::TestCase
|
|
69
75
|
|
70
76
|
context "with :only" do
|
71
77
|
setup do
|
78
|
+
class ::Only < ActiveRecord::Base; end
|
72
79
|
class OnlyController < MockController
|
73
|
-
qadmin :only => [:index, :show]
|
80
|
+
qadmin :available_actions => {:only => [:index, :show]}
|
74
81
|
end
|
75
82
|
@controller = OnlyController.new
|
76
83
|
end
|
@@ -103,12 +110,15 @@ class TestQadminController < Test::Unit::TestCase
|
|
103
110
|
|
104
111
|
context "with two instances in different controllers" do
|
105
112
|
setup do
|
113
|
+
class ::NewExclude < ActiveRecord::Base; end
|
106
114
|
class NewExcludeController < MockController
|
107
|
-
qadmin
|
115
|
+
qadmin do |config|
|
116
|
+
config.available_actions.exclude = [:show, :new]
|
117
|
+
end
|
108
118
|
end
|
109
119
|
@exclude_controller = NewExcludeController.new
|
110
120
|
class NewOnlyController < MockController
|
111
|
-
qadmin :only => [:index, :show]
|
121
|
+
qadmin :model_name => 'Item', :available_actions => {:only => [:index, :show]}
|
112
122
|
end
|
113
123
|
@only_controller = NewOnlyController.new
|
114
124
|
end
|
@@ -126,7 +136,7 @@ class TestQadminController < Test::Unit::TestCase
|
|
126
136
|
end
|
127
137
|
|
128
138
|
should "set model name independently" do
|
129
|
-
assert_equal '
|
139
|
+
assert_equal 'Item', @only_controller.send(:model_name)
|
130
140
|
assert_equal 'NewExclude', @exclude_controller.send(:model_name)
|
131
141
|
end
|
132
142
|
end
|
@@ -26,10 +26,20 @@ class TestQadminGenerator < Test::Unit::TestCase
|
|
26
26
|
end
|
27
27
|
assert_generated_class('test/functional/items_controller_test')
|
28
28
|
assert_directory_exists('app/views/items')
|
29
|
-
assert_generated_file('app/views/items/_form.erb')
|
30
|
-
assert_generated_file('app/views/layouts/admin.erb')
|
29
|
+
assert_generated_file('app/views/items/_form.html.erb')
|
30
|
+
assert_generated_file('app/views/layouts/admin.html.erb')
|
31
31
|
assert_directory_exists('public/images/admin/')
|
32
32
|
end
|
33
|
+
|
34
|
+
def test_generator_with_after_scaffold_should_only_generate_test_and_erbs
|
35
|
+
name = 'Item'
|
36
|
+
run_generator('qadmin', [name, '--after-scaffold'], sources, :destination => APP_ROOT)
|
37
|
+
assert_file_does_not_exist('app/controllers/items_controller.rb')
|
38
|
+
assert_generated_class('test/functional/items_controller_test')
|
39
|
+
assert_generated_file('app/views/items/_form.html.erb')
|
40
|
+
assert_generated_file('app/views/items/_item.html.erb')
|
41
|
+
assert_file_does_not_exist('app/views/layouts/admin.erb')
|
42
|
+
end
|
33
43
|
|
34
44
|
private
|
35
45
|
def sources
|
@@ -41,6 +51,11 @@ class TestQadminGenerator < Test::Unit::TestCase
|
|
41
51
|
"rails_generators"
|
42
52
|
end
|
43
53
|
|
54
|
+
def assert_file_does_not_exist(path)
|
55
|
+
assert !File.exist?("#{APP_ROOT}/#{path}"),
|
56
|
+
"The file '#{APP_ROOT}/#{path}' should not exist"
|
57
|
+
end
|
58
|
+
|
44
59
|
def base_files
|
45
60
|
[
|
46
61
|
'public/stylesheets/style.css',
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestQadminOptionSet < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "OptionSet" do
|
6
|
+
context "initializing" do
|
7
|
+
context "with an array" do
|
8
|
+
setup do
|
9
|
+
@option_set = Qadmin::OptionSet.new([:index, :show, :delete])
|
10
|
+
end
|
11
|
+
|
12
|
+
should "set array as default" do
|
13
|
+
assert_equal [:index, :show, :delete], @option_set.default
|
14
|
+
end
|
15
|
+
|
16
|
+
should "return array as current" do
|
17
|
+
assert_equal [:index, :show, :delete], @option_set.current
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "with only options" do
|
22
|
+
setup do
|
23
|
+
@option_set = Qadmin::OptionSet.new(:default => [:index, :show, :delete], :exclude => :delete)
|
24
|
+
end
|
25
|
+
|
26
|
+
should "set default with options" do
|
27
|
+
assert_equal [:index, :show, :delete], @option_set.default
|
28
|
+
end
|
29
|
+
|
30
|
+
should "set exclude with options" do
|
31
|
+
assert_equal [:delete], @option_set.exclude
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "with an array and options" do
|
36
|
+
setup do
|
37
|
+
@option_set = Qadmin::OptionSet.new([:index, :show, :delete], :only => :delete)
|
38
|
+
end
|
39
|
+
|
40
|
+
should "set default as array" do
|
41
|
+
assert_equal [:index, :show, :delete], @option_set.default
|
42
|
+
end
|
43
|
+
|
44
|
+
should "set only with options" do
|
45
|
+
assert_equal [:delete], @option_set.only
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "an Option Set" do
|
51
|
+
context "with exclude set" do
|
52
|
+
setup do
|
53
|
+
@option_set = Qadmin::OptionSet.new(:default => [:index, :show, :delete], :exclude => :delete)
|
54
|
+
end
|
55
|
+
|
56
|
+
should "return current without excludes" do
|
57
|
+
assert_equal [:index, :show], @option_set.current
|
58
|
+
end
|
59
|
+
|
60
|
+
should "itterate over current" do
|
61
|
+
@option_set.each do |option|
|
62
|
+
assert [:index, :show].include?(option)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "with only set" do
|
68
|
+
setup do
|
69
|
+
@option_set = Qadmin::OptionSet.new(:default => [:index, :show, :delete], :only => [:show, :delete])
|
70
|
+
end
|
71
|
+
|
72
|
+
should "return only as current" do
|
73
|
+
assert_equal [:show, :delete], @option_set.current
|
74
|
+
end
|
75
|
+
|
76
|
+
should "itterate over only" do
|
77
|
+
@option_set.each do |option|
|
78
|
+
assert [:show, :delete].include?(option)
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|