admin_data 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. data/History.txt +221 -0
  2. data/README.textile +21 -0
  3. data/Rakefile +46 -0
  4. data/app/controllers/admin_data/base_controller.rb +114 -0
  5. data/app/controllers/admin_data/diagnostic_controller.rb +28 -0
  6. data/app/controllers/admin_data/feed_controller.rb +17 -0
  7. data/app/controllers/admin_data/main_controller.rb +132 -0
  8. data/app/controllers/admin_data/migration_controller.rb +19 -0
  9. data/app/controllers/admin_data/search_controller.rb +125 -0
  10. data/app/controllers/admin_data/validate_model_controller.rb +106 -0
  11. data/app/views/admin_data/diagnostic/index.html.erb +17 -0
  12. data/app/views/admin_data/diagnostic/missing_index.html.erb +26 -0
  13. data/app/views/admin_data/feed/index.rss.builder +24 -0
  14. data/app/views/admin_data/main/all_models.html.erb +22 -0
  15. data/app/views/admin_data/main/association/_association_info.html.erb +10 -0
  16. data/app/views/admin_data/main/association/_belongs_to_info.html.erb +7 -0
  17. data/app/views/admin_data/main/association/_has_many_info.html.erb +7 -0
  18. data/app/views/admin_data/main/association/_has_one_info.html.erb +6 -0
  19. data/app/views/admin_data/main/edit.html.erb +38 -0
  20. data/app/views/admin_data/main/misc/_form.html.erb +25 -0
  21. data/app/views/admin_data/main/misc/_modify_record.html.erb +22 -0
  22. data/app/views/admin_data/main/new.html.erb +23 -0
  23. data/app/views/admin_data/main/show.html.erb +41 -0
  24. data/app/views/admin_data/main/table_structure.html.erb +55 -0
  25. data/app/views/admin_data/migration/index.html.erb +18 -0
  26. data/app/views/admin_data/migration/jstest.html.erb +51 -0
  27. data/app/views/admin_data/search/_search_base.html.erb +34 -0
  28. data/app/views/admin_data/search/advance_search.html.erb +3 -0
  29. data/app/views/admin_data/search/quick_search.html.erb +6 -0
  30. data/app/views/admin_data/search/search/_advance_search_form.html.erb +48 -0
  31. data/app/views/admin_data/search/search/_errors.html.erb +5 -0
  32. data/app/views/admin_data/search/search/_listing.html.erb +40 -0
  33. data/app/views/admin_data/search/search/_search_form.html.erb +28 -0
  34. data/app/views/admin_data/search/search/_sortby.html.erb +18 -0
  35. data/app/views/admin_data/search/search/_title.html.erb +34 -0
  36. data/app/views/admin_data/shared/_breadcrum.html.erb +10 -0
  37. data/app/views/admin_data/shared/_drop_down_klasses.html.erb +4 -0
  38. data/app/views/admin_data/shared/_flash_message.html.erb +13 -0
  39. data/app/views/admin_data/shared/_header.html.erb +23 -0
  40. data/app/views/admin_data/shared/_powered_by.html.erb +23 -0
  41. data/app/views/admin_data/shared/_secondary_navigation.html.erb +28 -0
  42. data/app/views/admin_data/validate_model/_bad.html.erb +1 -0
  43. data/app/views/admin_data/validate_model/tid.html.erb +2 -0
  44. data/app/views/admin_data/validate_model/validate.html.erb +67 -0
  45. data/app/views/layouts/admin_data.html.erb +60 -0
  46. data/config/routes.rb +34 -0
  47. data/init.rb +1 -0
  48. data/lib/admin_data.rb +34 -0
  49. data/lib/admin_data/chelper.rb +37 -0
  50. data/lib/admin_data/compatibility.rb +7 -0
  51. data/lib/admin_data/helpers.rb +222 -0
  52. data/lib/admin_data/railtie.rb +21 -0
  53. data/lib/admin_data/search.rb +186 -0
  54. data/lib/admin_data/settings.rb +72 -0
  55. data/lib/admin_data/util.rb +237 -0
  56. data/lib/admin_data/version.rb +3 -0
  57. data/lib/admin_data_date_validation.rb +79 -0
  58. data/lib/css/app.css +224 -0
  59. data/lib/css/base.css +1071 -0
  60. data/lib/css/header.css +65 -0
  61. data/lib/css/rounded.css +18 -0
  62. data/lib/css/themes/drastic-dark/style.css +374 -0
  63. data/lib/css/umbrella.css +34 -0
  64. data/lib/css/vendor/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png +0 -0
  65. data/lib/css/vendor/images/ui-bg_dots-small_65_a6a6a6_2x2.png +0 -0
  66. data/lib/css/vendor/images/ui-bg_flat_0_333333_40x100.png +0 -0
  67. data/lib/css/vendor/images/ui-bg_flat_65_ffffff_40x100.png +0 -0
  68. data/lib/css/vendor/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  69. data/lib/css/vendor/images/ui-bg_glass_55_fbf8ee_1x400.png +0 -0
  70. data/lib/css/vendor/images/ui-bg_highlight-hard_100_eeeeee_1x100.png +0 -0
  71. data/lib/css/vendor/images/ui-bg_highlight-hard_100_f6f6f6_1x100.png +0 -0
  72. data/lib/css/vendor/images/ui-bg_highlight-soft_15_cc0000_1x100.png +0 -0
  73. data/lib/css/vendor/images/ui-icons_004276_256x240.png +0 -0
  74. data/lib/css/vendor/images/ui-icons_cc0000_256x240.png +0 -0
  75. data/lib/css/vendor/images/ui-icons_ffffff_256x240.png +0 -0
  76. data/lib/css/vendor/jquery-ui-1.7.2.custom.css +406 -0
  77. data/lib/css/vendor/qunit.css +119 -0
  78. data/lib/js/advance_search/act_on_result.js +47 -0
  79. data/lib/js/advance_search/adv_search.js +46 -0
  80. data/lib/js/advance_search/advance_search.js +60 -0
  81. data/lib/js/advance_search/advance_search_structure.js +79 -0
  82. data/lib/js/advance_search/ajaxify_advance_search.js +28 -0
  83. data/lib/js/advance_search/build_first_row.js +12 -0
  84. data/lib/js/advance_search/event_bindings.js +87 -0
  85. data/lib/js/advance_search/global_ajax_setting.js +10 -0
  86. data/lib/js/advance_search/trigger_submit_on_domready.js +6 -0
  87. data/lib/js/misc/drop_down_change.js +8 -0
  88. data/lib/js/misc/js_util.js +42 -0
  89. data/lib/js/misc/quick_search_input_focus.js +6 -0
  90. data/lib/js/test/act_on_result.js +120 -0
  91. data/lib/js/test/advance_search.js +80 -0
  92. data/lib/js/test/ajaxify_advance_search.js +29 -0
  93. data/lib/js/test/build_first_row.js +10 -0
  94. data/lib/js/test/event_bindings.js +100 -0
  95. data/lib/js/validate_model/ajaxify_form.js +66 -0
  96. data/lib/js/validate_model/select_all.js +15 -0
  97. data/lib/js/vendor/jack.js +903 -0
  98. data/lib/js/vendor/jquery-1.4.1.js +6078 -0
  99. data/lib/js/vendor/jquery-ui-1.7.2.custom.min.js +298 -0
  100. data/lib/js/vendor/jquery.ba-isjquery.js +21 -0
  101. data/lib/js/vendor/jquery.form.js +814 -0
  102. data/lib/js/vendor/jquery.lint.js +604 -0
  103. data/lib/js/vendor/log.js +9 -0
  104. data/lib/js/vendor/qunit.js +1043 -0
  105. data/lib/tasks/admin_data_tasks.rake +7 -0
  106. data/lib/tasks/validate_models_bg.rake +23 -0
  107. data/test/factories/article.rb +9 -0
  108. data/test/factories/car.rb +4 -0
  109. data/test/factories/city.rb +4 -0
  110. data/test/factories/comment.rb +6 -0
  111. data/test/factories/door.rb +4 -0
  112. data/test/factories/engine.rb +4 -0
  113. data/test/functional/base_controller_test.rb +5 -0
  114. data/test/functional/feed_controller_test.rb +34 -0
  115. data/test/functional/main_controller_test.rb +421 -0
  116. data/test/functional/migration_controller_test.rb +30 -0
  117. data/test/functional/routes_test.rb +61 -0
  118. data/test/functional/search_controller_test.rb +814 -0
  119. data/test/helper/view_helper_test.rb +177 -0
  120. data/test/misc_tests/date_validation_test.rb +32 -0
  121. data/test/misc_tests/settings_test.rb +29 -0
  122. data/test/misc_tests/util_test.rb +83 -0
  123. data/test/rails_root/Gemfile +22 -0
  124. data/test/rails_root/Gemfile.lock +101 -0
  125. data/test/rails_root/Rakefile +7 -0
  126. data/test/rails_root/app/controllers/application_controller.rb +3 -0
  127. data/test/rails_root/app/helpers/application_helper.rb +2 -0
  128. data/test/rails_root/app/models/article.rb +25 -0
  129. data/test/rails_root/app/models/city.rb +15 -0
  130. data/test/rails_root/app/models/comment.rb +13 -0
  131. data/test/rails_root/app/models/tech_magazine.rb +2 -0
  132. data/test/rails_root/app/models/vehicle/car.rb +4 -0
  133. data/test/rails_root/app/models/vehicle/door.rb +3 -0
  134. data/test/rails_root/app/models/vehicle/engine.rb +3 -0
  135. data/test/rails_root/app/views/layouts/application.html.erb +14 -0
  136. data/test/rails_root/config.ru +4 -0
  137. data/test/rails_root/config/application.rb +42 -0
  138. data/test/rails_root/config/boot.rb +13 -0
  139. data/test/rails_root/config/database.yml +22 -0
  140. data/test/rails_root/config/environment.rb +5 -0
  141. data/test/rails_root/config/environments/development.rb +22 -0
  142. data/test/rails_root/config/environments/production.rb +49 -0
  143. data/test/rails_root/config/environments/test.rb +35 -0
  144. data/test/rails_root/config/initializers/backtrace_silencers.rb +7 -0
  145. data/test/rails_root/config/initializers/inflections.rb +10 -0
  146. data/test/rails_root/config/initializers/mime_types.rb +5 -0
  147. data/test/rails_root/config/initializers/secret_token.rb +7 -0
  148. data/test/rails_root/config/initializers/session_store.rb +8 -0
  149. data/test/rails_root/config/locales/en.yml +5 -0
  150. data/test/rails_root/config/routes.rb +58 -0
  151. data/test/rails_root/db/migrate/20090809061114_create_tables.rb +70 -0
  152. data/test/rails_root/db/schema.rb +74 -0
  153. data/test/rails_root/db/seeds.rb +7 -0
  154. data/test/rails_root/script/rails +6 -0
  155. data/test/rails_root/test/performance/browsing_test.rb +0 -0
  156. data/test/rails_root/test/test_helper.rb +13 -0
  157. data/test/support/assertions.rb +20 -0
  158. data/test/test_helper.rb +74 -0
  159. metadata +321 -0
@@ -0,0 +1,7 @@
1
+ namespace :admin_data do
2
+ desc "Copy views from the admin_data plugin into your application (so you can customize them)"
3
+ task :localize_views do
4
+ require "#{File.dirname(__FILE__)}/../lib/admin_data/admin_data_tasks"
5
+ AdminDataTasks.copy_views_to_app
6
+ end
7
+ end
@@ -0,0 +1,23 @@
1
+ #
2
+ # Usage :
3
+ # rake admin_data:validate_models_bg RAILS_ENV='development' KLASSES='Country,PhoneNumber,Website' TID='20100107095100'
4
+ #
5
+ require 'fileutils'
6
+ namespace :admin_data do
7
+ desc "Run model valiations"
8
+ task :validate_models_bg => :environment do
9
+ begin
10
+ usage = %Q{ rake admin_data:validate_models_bg RAILS_ENV='development' KLASSES='Country,EeeSociety,PhoneNumber,Website,Car,User' TID='20100107095100' }
11
+ usage = ' Usage: ' + usage
12
+ tid = ENV['TID'].try(:to_s)
13
+ raise "tid is blank. #{usage} " if tid.blank?
14
+
15
+ klasses = ENV['KLASSES']
16
+ klasses.split(',').compact.each { |klasss| AdminData::RakeUtil.process_klass(klasss, tid) }
17
+
18
+ AdminData::Util.write_to_validation_file('', 'a', tid,'done.txt')
19
+ rescue Exception => e
20
+ AdminData::Util.write_to_validation_file(AdminData::Util.exception_info(e), 'a', 'rake_errors.txt')
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ Factory.define :article do |f|
2
+ f.title 'this is a dummy title'
3
+ f.body 'this is a dummy body'
4
+ f.short_desc 'this is a dummy short_desc'
5
+ f.status 'published'
6
+ f.approved false
7
+ f.hits_count 1
8
+ f.published_at
9
+ end
@@ -0,0 +1,4 @@
1
+ Factory.define :car, :class => Vehicle::Car do |f|
2
+ f.year 1990
3
+ f.brand 'bmw'
4
+ end
@@ -0,0 +1,4 @@
1
+ Factory.define :city do |f|
2
+ f.name 'mumbai'
3
+ end
4
+
@@ -0,0 +1,6 @@
1
+ Factory.define :comment do |f|
2
+ f.association(:article)
3
+ f.body 'this is a dummy body'
4
+ f.author_name 'this is dummy author name'
5
+ f.author_website 'http://www.example.org'
6
+ end
@@ -0,0 +1,4 @@
1
+ Factory.define :door, :class => Vehicle::Door do |f|
2
+ f.color 'black'
3
+ f.car { |u| u.association(:car) }
4
+ end
@@ -0,0 +1,4 @@
1
+ Factory.define :engine, :class => Vehicle::Engine do |f|
2
+ f.cylinders 6
3
+ f.car { |u| u.association(:car) }
4
+ end
@@ -0,0 +1,5 @@
1
+ require 'test_helper'
2
+
3
+ class AdminData::BaseControllerTest < ActionController::TestCase
4
+
5
+ end
@@ -0,0 +1,34 @@
1
+ require 'test_helper'
2
+
3
+ pwd = File.dirname(__FILE__)
4
+ f = File.join(pwd, '..', '..', 'app', 'views')
5
+ AdminData::FeedController.prepend_view_path(f)
6
+
7
+ #TODO mention this dependency in gemspec
8
+ require 'nokogiri'
9
+
10
+ class AdminData::FeedControllerTest < ActionController::TestCase
11
+
12
+ #TODO write a test to check before_filter authorization. Testing will be a bit tricky since
13
+ #http_basic_authentication is done
14
+ context 'GET index' do
15
+ setup do
16
+ Article.delete_all
17
+ @article = Factory(:article)
18
+ get :index, :format => :rss, :klasss => 'article'
19
+ @feed = Nokogiri::XML(@response.body)
20
+ end
21
+ should_respond_with :success
22
+ should 'have RSS feed 2.0' do
23
+ assert_equal '2.0', @feed.at('rss')['version']
24
+ end
25
+ should 'have title' do
26
+ assert_equal "Feeds from admin_data Article id: #{@article.id}", @feed.css('channel title').text
27
+ end
28
+ should 'have guid' do
29
+ guid = @feed.css('channel item guid').text
30
+ assert Regexp.new("/admin_data/klass/Article/#{@article.id}-").match(guid)
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,421 @@
1
+ require 'test_helper'
2
+
3
+ pwd = File.dirname(__FILE__)
4
+ f = File.join(pwd, '..', '..', 'app', 'views')
5
+ AdminData::MainController.prepend_view_path(f)
6
+
7
+ class AdminData::MainControllerTest < ActionController::TestCase
8
+
9
+ def setup
10
+ @controller = AdminData::MainController.new
11
+ @request = ActionController::TestRequest.new
12
+ @response = ActionController::TestResponse.new
13
+ @article = Factory(:article)
14
+ @car = Factory(:car, :year => 2000, :brand => 'bmw')
15
+ grant_read_only_access
16
+ grant_update_access
17
+ end
18
+
19
+ #TODO write tests for all before filters
20
+
21
+ context 'get table_structure' do
22
+ setup do
23
+ get :table_structure, {:klass => Article.name.underscore}
24
+ end
25
+ should_respond_with :success
26
+ should 'have text index' do
27
+ assert_tag(:content => 'Index')
28
+ end
29
+ should 'have table name' do
30
+ assert_tag(:tag => 'h1', :content => "Table name : articles", :attributes => {:class => 'table_name'})
31
+ end
32
+ end
33
+
34
+ context 'get all_models' do
35
+ setup do
36
+ get :all_models
37
+ end
38
+ should_respond_with :success
39
+ should_assign_to :klasses
40
+ should 'have xx number of models' do
41
+ assert_equal 7, assigns(:klasses).size
42
+ end
43
+ end
44
+
45
+ context 'get show for article which belongs to tech_magazine' do
46
+ setup do
47
+ @article.magazine = TechMagazine.create
48
+ @article.save
49
+ get :show, {:id => @article, :klass => @article.class.name.underscore }
50
+ end
51
+ should_respond_with :success
52
+ should 'have belongs to association with magazine' do
53
+ assert @article.magazine
54
+ end
55
+ should 'have association link for comments' do
56
+ s2 = ERB::Util.html_escape('&')
57
+ url = "/admin_data/klass/tech_magazine/#{@article.magazine.id}"
58
+ assert_tag(:tag => 'a', :attributes => {:href => url})
59
+ end
60
+ end
61
+
62
+ context 'get show for article which has many comments' do
63
+ setup do
64
+ @comment1 = Factory(:comment, :article => @article)
65
+ @comment2 = Factory(:comment, :article => @article)
66
+ get :show, {:id => @article.id, :klass => @article.class.name.underscore }
67
+ end
68
+ should_respond_with :success
69
+ should 'have association link for comments' do
70
+ s2 = ERB::Util.html_escape('&')
71
+ url = "/admin_data/quick_search/comment?children=comments#{s2}model_id=#{@article.id}#{s2}base=article"
72
+ assert_tag(:tag => 'a', :attributes => {:href => url})
73
+ end
74
+ end
75
+
76
+ context 'get show for car' do
77
+ setup do
78
+ @engine = Factory(:engine, :car => @car, :cylinders => 4)
79
+ get :show, {:id => @car.id, :klass => @car.class.name.underscore }
80
+ end
81
+ should_respond_with :success
82
+ should 'have one association link for engine' do
83
+ s2 = ERB::Util.html_escape('&')
84
+ url = "/admin_data/klass/engine/#{@engine.id}"
85
+ assert_tag(:tag => 'a', :content => /engine/, :attributes => {:href => url})
86
+ end
87
+ end
88
+
89
+ context 'get show for city' do
90
+ setup do
91
+ AdminData::Config.set = { :find_conditions => { 'City' => lambda { |params| {:conditions => ["permanent_name =?", params[:id]] } } } }
92
+ @city = Factory(:city, :name => 'New Delhi')
93
+ get :show, {:id => 'new-delhi', :klass => @city.class.name.underscore }
94
+ end
95
+ should_respond_with :success
96
+ end
97
+
98
+ context 'get show for comment which belongs to another class' do
99
+ setup do
100
+ @comment = Factory(:comment, :article => @article)
101
+ get :show, {:id => @comment.id, :klass => @comment.class.name.underscore }
102
+ end
103
+ should_respond_with :success
104
+ should 'have belongs_to message' do
105
+ assert_tag( :tag => 'p',
106
+ :attributes => {:class => 'belongs_to'},
107
+ :descendant => {:tag => 'a', :child => /article/})
108
+ end
109
+ should 'have link to belongs_to association' do
110
+ s2 = ERB::Util.html_escape('&')
111
+ url = "/admin_data/klass/article/#{@article.to_param}"
112
+ assert_tag(:tag => 'a', :attributes => {:href => url})
113
+ end
114
+ end
115
+
116
+ context 'get show for door which belongs to another class' do
117
+ setup do
118
+ @door = Factory(:door, :color => 'blue', :car_id => @car.id)
119
+ get :show, {:id => @door.id, :klass => @door.class.name.underscore }
120
+ end
121
+ should_respond_with :success
122
+ should 'have belongs_to message' do
123
+ assert_tag( :tag => 'p',
124
+ :attributes => {:class => 'belongs_to'},
125
+ :descendant => {:tag => 'a', :child => /car/})
126
+ end
127
+ end
128
+
129
+ context 'destroy an article' do
130
+ setup do
131
+ grant_update_access
132
+ @comment = Factory(:comment, :article => @article)
133
+ delete :destroy, {:id => @article.id, :klass => @article.class.name.underscore}
134
+ end
135
+ should_respond_with :redirect
136
+ should_change('article count', :by => -1) {Article.count}
137
+ # a comment is being created in setup which should be deleted because of destroy
138
+ should_not_change('comment count') { Comment.count }
139
+ end
140
+
141
+ context 'destroy a car' do
142
+ setup do
143
+ grant_update_access
144
+ @door = Factory(:door, :color => 'blue', :car => @car)
145
+ delete :destroy, {:id => @car.id, :klass => @car.class.name.underscore}
146
+ end
147
+ should_respond_with :redirect
148
+ should_change('car count', :by => -1) {Vehicle::Car.count}
149
+ # a comment is being created in setup which should be deleted because of destroy
150
+ should_not_change('door count') { Vehicle::Door.count }
151
+ end
152
+
153
+ context 'delete an article' do
154
+ setup do
155
+ grant_update_access
156
+ @comment = Factory(:comment, :article => @article)
157
+ delete :del, {:id => @article.id, :klass => @article.class.name.underscore }
158
+ end
159
+ should_respond_with :redirect
160
+ should_change('article count', :by => -1) {Article.count}
161
+ should_change('comment count', :by => 1) {Comment.count}
162
+ end
163
+
164
+ context 'delete a car' do
165
+ setup do
166
+ grant_update_access
167
+ @door = Factory(:door, :color => 'blue', :car => @car)
168
+ delete :del, {:id => @car.id, :klass => @car.class.name.underscore }
169
+ end
170
+ should_respond_with :redirect
171
+ should_change('car count', :by => -1) {Vehicle::Car.count}
172
+ should_change('door count since del does not call callbacks', :by => 1) do
173
+ Vehicle::Door.count
174
+ end
175
+ end
176
+
177
+ context 'get edit article with attr' do
178
+ setup do
179
+ get :edit, {:id => @article.id, :klass => @article.class.name, :attr => 'title', :data => 'Hello World' }
180
+ end
181
+ should 'have input field for title' do
182
+ assert_select('#article_title')
183
+ end
184
+ should 'not have input field for body' do
185
+ assert_select('#article_body', false)
186
+ end
187
+ end
188
+
189
+ context 'get edit article' do
190
+ context 'with ignore column limit' do
191
+ setup do
192
+ AdminData::Config.set = ({:ignore_column_limit => true})
193
+ get :edit, {:id => @article.id, :klass => @article.class.name }
194
+ end
195
+ teardown do
196
+ AdminData::Config.set = ({:ignore_column_limit => false})
197
+ end
198
+
199
+ should 'have size 60 for title and maxlenght 255' do
200
+ assert_tag(:tag => 'input', :attributes => {:id=> 'article_title', :size => '60', :maxlength => '255'})
201
+ end
202
+
203
+ should 'have size 60 for status and maxlenght 200' do
204
+ assert_tag(:tag => 'input', :attributes => {:id=> 'article_status', :size => '60', :maxlength => '255'})
205
+ end
206
+ end
207
+
208
+ context 'with enforced column limit' do
209
+
210
+ setup do
211
+ get :edit, {:id => @article.id, :klass => @article.class.name }
212
+ end
213
+ should_respond_with :success
214
+
215
+ should "not have input for primary key" do
216
+ assert_select 'form' do
217
+ assert_select "input[name='comment[id]']", false
218
+ end
219
+ end
220
+
221
+ should "have dropdowns for published_at datetime column" do
222
+ assert_select 'form' do
223
+ assert_select "select[name='article[published_at(1i)]']"
224
+ assert_select "select[name='article[published_at(2i)]']"
225
+ assert_select "select[name='article[published_at(3i)]']"
226
+ assert_select "select[name='article[published_at(4i)]']"
227
+ assert_select "select[name='article[published_at(5i)]']"
228
+ end
229
+ end
230
+
231
+ should 'have input field for title' do
232
+ assert_select('#article_title')
233
+ end
234
+
235
+ should 'have size 60 for title and maxlenght 200' do
236
+ assert_tag(:tag => 'input', :attributes => {:id=> 'article_title', :size => '60', :maxlength => '200'})
237
+ end
238
+
239
+ should 'have size 60 for status and maxlenght 200' do
240
+ assert_tag(:tag => 'input', :attributes => {:id=> 'article_status', :size => '50', :maxlength => '50'})
241
+ end
242
+
243
+ should 'have input field for body' do
244
+ assert_select('#article_body')
245
+ end
246
+ end
247
+
248
+ end
249
+
250
+ context 'get edit comment' do
251
+ context 'without drop down for associations' do
252
+ setup do
253
+ AdminData::Config.set = ({:drop_down_for_associations => false})
254
+ @comment = Factory(:comment, :article => @article)
255
+ get :edit, {:id => @comment.id, :klass => @comment.class.name.underscore }
256
+ end
257
+ teardown do
258
+ AdminData::Config.set = ({:drop_down_for_associations => true})
259
+ end
260
+
261
+ should_respond_with :success
262
+
263
+ should "have input text field for belongs_to article" do
264
+ assert_select 'form' do
265
+ assert_tag(:tag => 'input', :attributes => {:id => 'comment_article_id', :name => 'comment[article_id]'})
266
+ end
267
+ end
268
+ end
269
+ context 'with drop down for associations' do
270
+ setup do
271
+ @comment = Factory(:comment, :article => @article)
272
+ get :edit, {:id => @comment.id, :klass => @comment.class.name.underscore }
273
+ end
274
+
275
+ should_respond_with :success
276
+
277
+ should "have dropdowns for belongs_to article" do
278
+ assert_select 'form' do
279
+ assert_select "select[name='comment[article_id]']"
280
+ end
281
+ end
282
+ end
283
+ end
284
+
285
+
286
+ context 'get edit car' do
287
+ setup do
288
+ get :edit, {:id => @car.id, :klass => @car.class.name.underscore }
289
+ end
290
+ should_respond_with :success
291
+ end
292
+
293
+ context 'get new article' do
294
+ setup do
295
+ get :new, {:klass => Article.name.underscore }
296
+ end
297
+ should_respond_with :success
298
+ end
299
+
300
+ context 'get new car' do
301
+ setup do
302
+ get :new, {:klass => Vehicle::Car.name.underscore}
303
+ end
304
+ should_respond_with :success
305
+ end
306
+
307
+ context 'update article successful' do
308
+ setup do
309
+ grant_update_access
310
+ post :update, { :klass => Article.name.underscore, :id => @article, :article => {:title => 'new title'}}
311
+ end
312
+ should_respond_with :redirect
313
+ should_redirect_to('show page') { admin_data_on_k_path( :id => Article.last, :klass => Article.name.underscore) }
314
+ should_set_the_flash_to /Record was updated/
315
+ should_not_change('article count') { Article.count }
316
+ end
317
+
318
+ context 'update car successful' do
319
+ setup do
320
+ grant_update_access
321
+ post :update, { :klass => Vehicle::Car.name.underscore, :id => @car.id, 'vehicle/car' => {:brand => 'honda'}}
322
+ end
323
+ should_respond_with :redirect
324
+ should_redirect_to('show page') { admin_data_on_k_path(:id => Vehicle::Car.last.id,
325
+ :klass => @car.class.name.underscore) }
326
+ should_set_the_flash_to /Record was updated/
327
+ should_not_change('car count') { Vehicle::Car.count }
328
+ end
329
+
330
+ context 'update failure' do
331
+ setup do
332
+ grant_update_access
333
+ post :update, { :klass => 'article', :id => @article.id, :article => {:body => ''}}
334
+ end
335
+ should_respond_with :success
336
+ should_not_set_the_flash
337
+ should_not_change('article count') { Article.count }
338
+ should 'contain the error message' do
339
+ assert_tag(:content => "Body can't be blank")
340
+ end
341
+ end
342
+
343
+ context 'create article successful' do
344
+ setup do
345
+ grant_update_access
346
+ post :create, { :klass => Article.name.underscore, 'article' => {:title => 'hello', :body => 'hello world'}}
347
+ end
348
+ should_respond_with :redirect
349
+ should_redirect_to('show page') { admin_data_on_k_path(:id => Article.last,
350
+ :klass => @article.class.name.underscore) }
351
+ should_set_the_flash_to /Record was created/
352
+ should_change('article count', :by => 1) { Article.count }
353
+ end
354
+
355
+ context 'create car successful' do
356
+ setup do
357
+ grant_update_access
358
+ post :create, { :klass => Vehicle::Car.name.underscore, 'vehicle/car' => {:brand => 'hello'}}
359
+ end
360
+ should_respond_with :redirect
361
+ should_redirect_to('show page') { admin_data_on_k_path(:id => Vehicle::Car.last.id,
362
+ :klass => @car.class.name.underscore) }
363
+ should_set_the_flash_to /Record was created/
364
+ should_change('vehicle count', :by => 1) { Vehicle::Car.count }
365
+ end
366
+
367
+ context 'create failure' do
368
+ setup do
369
+ grant_update_access
370
+ post :create, { :klass => Article.name.underscore, :article => {:body => '', :title => 'hello'}}
371
+ end
372
+ should_respond_with :success
373
+ should_not_set_the_flash
374
+ should_not_change('article count') { Article.count }
375
+ should 'contain the error message' do
376
+ assert_tag(:content => "Body can't be blank")
377
+ end
378
+ end
379
+
380
+ context 'filter get_model_and_verify_if failure case' do
381
+ setup do
382
+ get :show, {:id => 999999999999994533, :klass => Article.name.underscore }
383
+ end
384
+ should_respond_with :not_found
385
+ should 'contain the error message' do
386
+ assert_tag(:tag => 'h2', :content => "Article not found: 999999999999994533")
387
+ end
388
+ end
389
+
390
+ context 'filter is_allowed_to_view failure case' do
391
+ setup do
392
+ revoke_read_only_access
393
+ get :show, {:id => @article.id, :klass => Article.name.underscore }
394
+ end
395
+ should_respond_with :unauthorized
396
+ should 'contain the message' do
397
+ assert_tag(:tag => 'h2', :content => 'not authorized')
398
+ end
399
+ end
400
+
401
+ context 'fine grained access control' do
402
+ teardown do
403
+ AdminData::Config.initialize_defaults
404
+ end
405
+ context 'allows view security check to access klass' do
406
+ setup do
407
+ AdminData::Config.set = { :is_allowed_to_view_model => Proc.new { |controller| assert_equal(Article, controller.klass); true } }
408
+ get :show, {:id => @article.id, :klass => Article.name.underscore }
409
+ end
410
+ should_respond_with :success
411
+ end
412
+ context 'allows update security check to access klass' do
413
+ setup do
414
+ AdminData::Config.set = { :is_allowed_to_update => Proc.new { |controller| assert_equal(Article, controller.klass); true } }
415
+ get :edit, {:id => @article.id, :klass => Article.name.underscore }
416
+ end
417
+ should_respond_with :success
418
+ end
419
+ end
420
+
421
+ end