typus 0.9.17

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 (154) hide show
  1. data/.gitignore +8 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +86 -0
  4. data/Rakefile +61 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/admin/master_controller.rb +354 -0
  7. data/app/controllers/typus_controller.rb +128 -0
  8. data/app/helpers/admin/form_helper.rb +386 -0
  9. data/app/helpers/admin/master_helper.rb +104 -0
  10. data/app/helpers/admin/public_helper.rb +27 -0
  11. data/app/helpers/admin/sidebar_helper.rb +236 -0
  12. data/app/helpers/admin/table_helper.rb +227 -0
  13. data/app/helpers/typus_helper.rb +194 -0
  14. data/app/models/typus_mailer.rb +14 -0
  15. data/app/models/typus_user.rb +5 -0
  16. data/app/views/admin/dashboard/_sidebar.html.erb +9 -0
  17. data/app/views/admin/resources/edit.html.erb +24 -0
  18. data/app/views/admin/resources/index.html.erb +23 -0
  19. data/app/views/admin/resources/new.html.erb +22 -0
  20. data/app/views/admin/resources/show.html.erb +18 -0
  21. data/app/views/admin/shared/_footer.html.erb +1 -0
  22. data/app/views/admin/shared/_pagination.html.erb +28 -0
  23. data/app/views/layouts/admin.html.erb +73 -0
  24. data/app/views/layouts/typus.html.erb +29 -0
  25. data/app/views/typus/dashboard.html.erb +9 -0
  26. data/app/views/typus/recover_password.html.erb +7 -0
  27. data/app/views/typus/reset_password.html.erb +15 -0
  28. data/app/views/typus/sign_in.html.erb +9 -0
  29. data/app/views/typus/sign_up.html.erb +7 -0
  30. data/app/views/typus_mailer/reset_password_link.erb +11 -0
  31. data/config/locales/typus/de.yml +109 -0
  32. data/config/locales/typus/es.yml +109 -0
  33. data/config/locales/typus/language.yml.template +113 -0
  34. data/config/locales/typus/pt-BR.yml +111 -0
  35. data/config/locales/typus/ru.yml +111 -0
  36. data/generators/typus/templates/config/initializers/typus.rb +33 -0
  37. data/generators/typus/templates/config/typus/README +51 -0
  38. data/generators/typus/templates/config/typus/application.yml +6 -0
  39. data/generators/typus/templates/config/typus/application_roles.yml +23 -0
  40. data/generators/typus/templates/config/typus/typus.yml +14 -0
  41. data/generators/typus/templates/config/typus/typus_roles.yml +2 -0
  42. data/generators/typus/templates/db/create_typus_users.rb +21 -0
  43. data/generators/typus/templates/public/images/admin/arrow_down.gif +0 -0
  44. data/generators/typus/templates/public/images/admin/arrow_up.gif +0 -0
  45. data/generators/typus/templates/public/images/admin/spinner.gif +0 -0
  46. data/generators/typus/templates/public/images/admin/status_false.gif +0 -0
  47. data/generators/typus/templates/public/images/admin/status_true.gif +0 -0
  48. data/generators/typus/templates/public/images/admin/trash.gif +0 -0
  49. data/generators/typus/templates/public/javascripts/admin/application.js +14 -0
  50. data/generators/typus/templates/public/stylesheets/admin/reset.css +68 -0
  51. data/generators/typus/templates/public/stylesheets/admin/screen.css +729 -0
  52. data/generators/typus/typus_generator.rb +122 -0
  53. data/generators/typus_update_schema_to_01/templates/config/typus.yml +14 -0
  54. data/generators/typus_update_schema_to_01/templates/migration.rb +11 -0
  55. data/generators/typus_update_schema_to_01/typus_update_schema_to_01_generator.rb +19 -0
  56. data/lib/typus.rb +122 -0
  57. data/lib/typus/active_record.rb +307 -0
  58. data/lib/typus/authentication.rb +142 -0
  59. data/lib/typus/configuration.rb +85 -0
  60. data/lib/typus/extensions/routes.rb +15 -0
  61. data/lib/typus/format.rb +55 -0
  62. data/lib/typus/generator.rb +81 -0
  63. data/lib/typus/hash.rb +8 -0
  64. data/lib/typus/locale.rb +17 -0
  65. data/lib/typus/object.rb +21 -0
  66. data/lib/typus/quick_edit.rb +40 -0
  67. data/lib/typus/reloader.rb +15 -0
  68. data/lib/typus/string.rb +11 -0
  69. data/lib/typus/templates/index.html.erb +11 -0
  70. data/lib/typus/templates/resource_controller.rb.erb +15 -0
  71. data/lib/typus/templates/resource_controller_test.rb.erb +10 -0
  72. data/lib/typus/templates/resources_controller.rb.erb +37 -0
  73. data/lib/typus/user.rb +134 -0
  74. data/lib/vendor/active_record.rb +15 -0
  75. data/lib/vendor/paginator.rb +143 -0
  76. data/rails/init.rb +3 -0
  77. data/tasks/typus_tasks.rake +32 -0
  78. data/test/config/broken/application.yml +68 -0
  79. data/test/config/broken/application_roles.yml +20 -0
  80. data/test/config/broken/empty.yml +0 -0
  81. data/test/config/broken/empty_roles.yml +0 -0
  82. data/test/config/broken/undefined.yml +3 -0
  83. data/test/config/broken/undefined_roles.yml +6 -0
  84. data/test/config/default/typus.yml +14 -0
  85. data/test/config/default/typus_roles.yml +2 -0
  86. data/test/config/empty/empty_01.yml +0 -0
  87. data/test/config/empty/empty_01_roles.yml +0 -0
  88. data/test/config/empty/empty_02.yml +0 -0
  89. data/test/config/empty/empty_02_roles.yml +0 -0
  90. data/test/config/locales/es.yml +10 -0
  91. data/test/config/ordered/001_roles.yml +2 -0
  92. data/test/config/ordered/002_roles.yml +2 -0
  93. data/test/config/unordered/app_one_roles.yml +2 -0
  94. data/test/config/unordered/app_two_roles.yml +2 -0
  95. data/test/config/working/application.yml +68 -0
  96. data/test/config/working/application_roles.yml +22 -0
  97. data/test/config/working/typus.yml +14 -0
  98. data/test/config/working/typus_roles.yml +2 -0
  99. data/test/fixtures/app/controllers/admin/assets_controller.rb +2 -0
  100. data/test/fixtures/app/controllers/admin/categories_controller.rb +2 -0
  101. data/test/fixtures/app/controllers/admin/comments_controller.rb +2 -0
  102. data/test/fixtures/app/controllers/admin/pages_controller.rb +2 -0
  103. data/test/fixtures/app/controllers/admin/posts_controller.rb +2 -0
  104. data/test/fixtures/app/controllers/admin/status_controller.rb +6 -0
  105. data/test/fixtures/app/controllers/admin/typus_users_controller.rb +2 -0
  106. data/test/fixtures/app/controllers/admin/watch_dog_controller.rb +6 -0
  107. data/test/fixtures/app/views/admin/comments/_edit.html.erb +1 -0
  108. data/test/fixtures/app/views/admin/comments/_index.html.erb +1 -0
  109. data/test/fixtures/app/views/admin/comments/_new.html.erb +1 -0
  110. data/test/fixtures/app/views/admin/comments/_show.html.erb +1 -0
  111. data/test/fixtures/app/views/admin/comments/_sidebar.html.erb +1 -0
  112. data/test/fixtures/app/views/admin/dashboard/_content.html.erb +1 -0
  113. data/test/fixtures/app/views/admin/dashboard/_sidebar.html.erb +1 -0
  114. data/test/fixtures/app/views/admin/resources/_sidebar.html.erb +1 -0
  115. data/test/fixtures/app/views/admin/shared/_footer.html.erb +1 -0
  116. data/test/fixtures/app/views/admin/status/index.html.erb +1 -0
  117. data/test/fixtures/app/views/admin/templates/_datepicker.html.erb +1 -0
  118. data/test/fixtures/assets.yml +11 -0
  119. data/test/fixtures/categories.yml +14 -0
  120. data/test/fixtures/comments.yml +27 -0
  121. data/test/fixtures/pages.yml +41 -0
  122. data/test/fixtures/posts.yml +37 -0
  123. data/test/fixtures/typus_users.yml +54 -0
  124. data/test/functional/admin/assets_controller_test.rb +57 -0
  125. data/test/functional/admin/categories_controller_test.rb +106 -0
  126. data/test/functional/admin/comments_controller_test.rb +120 -0
  127. data/test/functional/admin/master_controller_test.rb +5 -0
  128. data/test/functional/admin/posts_controller_test.rb +261 -0
  129. data/test/functional/admin/status_controller_test.rb +43 -0
  130. data/test/functional/admin/typus_users_controller_test.rb +239 -0
  131. data/test/functional/typus_controller_test.rb +321 -0
  132. data/test/helper.rb +51 -0
  133. data/test/helpers/admin/form_helper_test.rb +337 -0
  134. data/test/helpers/admin/master_helper_test.rb +69 -0
  135. data/test/helpers/admin/public_helper_test.rb +26 -0
  136. data/test/helpers/admin/sidebar_helper_test.rb +335 -0
  137. data/test/helpers/admin/table_helper_test.rb +239 -0
  138. data/test/helpers/typus_helper_test.rb +117 -0
  139. data/test/lib/active_record_test.rb +382 -0
  140. data/test/lib/configuration_test.rb +94 -0
  141. data/test/lib/hash_test.rb +11 -0
  142. data/test/lib/routes_test.rb +71 -0
  143. data/test/lib/string_test.rb +25 -0
  144. data/test/lib/typus_test.rb +85 -0
  145. data/test/models.rb +51 -0
  146. data/test/schema.rb +64 -0
  147. data/test/unit/typus_mailer_test.rb +33 -0
  148. data/test/unit/typus_test.rb +17 -0
  149. data/test/unit/typus_user_roles_test.rb +90 -0
  150. data/test/unit/typus_user_test.rb +177 -0
  151. data/test/vendor/active_record_test.rb +18 -0
  152. data/test/vendor/paginator_test.rb +136 -0
  153. data/typus.gemspec +228 -0
  154. metadata +241 -0
@@ -0,0 +1,57 @@
1
+ require 'test/helper'
2
+
3
+ ##
4
+ # Test polimorphic relationships using the relate & unrelate actions.
5
+ #
6
+ class Admin::AssetsControllerTest < ActionController::TestCase
7
+
8
+ def setup
9
+ typus_user = typus_users(:admin)
10
+ @request.session[:typus_user_id] = typus_user.id
11
+ end
12
+
13
+ def test_should_test_polymorphic_relationship_message
14
+ post_ = posts(:published)
15
+ get :new, { :back_to => "/admin/posts/#{post_.id}/edit", :resource => post_.class.name, :resource_id => post_.id }
16
+ assert_match "You're adding a new Asset to Post.", @response.body
17
+ end
18
+
19
+ def test_should_create_a_polymorphic_relationship
20
+
21
+ post_ = posts(:published)
22
+
23
+ assert_difference('post_.assets.count') do
24
+ post :create, { :back_to => "/admin/posts/edit/#{post_.id}", :resource => post_.class.name, :resource_id => post_.id }
25
+ end
26
+
27
+ assert_response :redirect
28
+ assert_redirected_to '/admin/posts/edit/1#assets'
29
+ assert flash[:success]
30
+ assert_equal 'Asset successfully assigned to Post.', flash[:success]
31
+
32
+ end
33
+
34
+ def test_should_test_polymorphic_relationship_edit_message
35
+ post_ = posts(:published)
36
+ asset_ = assets(:first)
37
+ get :edit, { :id => asset_.id, :back_to => "/admin/posts/#{post_.id}/edit", :resource => post_.class.name, :resource_id => post_.id }
38
+ assert_match "You're updating a Asset for Post.", @response.body
39
+ end
40
+
41
+ def test_should_return_to_back_to_url
42
+
43
+ options = Typus::Configuration.options.merge(:index_after_save => true)
44
+ Typus::Configuration.stubs(:options).returns(options)
45
+
46
+ post_ = posts(:published)
47
+ asset_ = assets(:first)
48
+
49
+ post :update, { :back_to => "/admin/posts/#{post_.id}/edit", :resource => post_.class.name, :resource_id => post_.id, :id => asset_.id }
50
+ assert_response :redirect
51
+ assert_redirected_to '/admin/posts/1/edit#assets'
52
+ assert flash[:success]
53
+ assert_equal 'Asset successfully updated.', flash[:success]
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,106 @@
1
+ require 'test/helper'
2
+
3
+ ##
4
+ # Test position action if acts as list is installed.
5
+ #
6
+ class Admin::CategoriesControllerTest < ActionController::TestCase
7
+
8
+ def setup
9
+ user = typus_users(:editor)
10
+ @request.session[:typus_user_id] = user.id
11
+ @request.env['HTTP_REFERER'] = '/admin/categories'
12
+ end
13
+
14
+ def test_should_position_item_one_step_down
15
+ return if !defined?(ActiveRecord::Acts::List)
16
+ first_category = categories(:first)
17
+ assert_equal 1, first_category.position
18
+ second_category = categories(:second)
19
+ assert_equal 2, second_category.position
20
+ get :position, { :id => first_category.id, :go => 'move_lower' }
21
+ assert flash[:success]
22
+ assert_match /Record moved lower./, flash[:success]
23
+ assert_equal 2, first_category.reload.position
24
+ assert_equal 1, second_category.reload.position
25
+ end
26
+
27
+ def test_should_position_item_one_step_up
28
+ return if !defined?(ActiveRecord::Acts::List)
29
+ first_category = categories(:first)
30
+ assert_equal 1, first_category.position
31
+ second_category = categories(:second)
32
+ assert_equal 2, second_category.position
33
+ get :position, { :id => second_category.id, :go => 'move_higher' }
34
+ assert flash[:success]
35
+ assert_match /Record moved higher./, flash[:success]
36
+ assert_equal 2, first_category.reload.position
37
+ assert_equal 1, second_category.reload.position
38
+ end
39
+
40
+ def test_should_position_top_item_to_bottom
41
+ return if !defined?(ActiveRecord::Acts::List)
42
+ first_category = categories(:first)
43
+ assert_equal 1, first_category.position
44
+ get :position, { :id => first_category.id, :go => 'move_to_bottom' }
45
+ assert flash[:success]
46
+ assert_match /Record moved to bottom./, flash[:success]
47
+ assert_equal 3, first_category.reload.position
48
+ end
49
+
50
+ def test_should_position_bottom_item_to_top
51
+ return if !defined?(ActiveRecord::Acts::List)
52
+ third_category = categories(:third)
53
+ assert_equal 3, third_category.position
54
+ get :position, { :id => third_category.id, :go => 'move_to_top' }
55
+ assert flash[:success]
56
+ assert_match /Record moved to top./, flash[:success]
57
+ assert_equal 1, third_category.reload.position
58
+ end
59
+
60
+ def test_should_verify_items_are_sorted_by_position_on_list
61
+ get :index
62
+ assert_response :success
63
+ assert_equal [ 1, 2, 3 ], assigns['items'].items.map(&:position)
64
+ assert_equal [ 2, 3, 1 ], Category.find(:all, :order => "id ASC").map(&:position)
65
+ end
66
+
67
+ def test_should_allow_admin_to_add_a_category
68
+ admin = typus_users(:admin)
69
+ @request.session[:typus_user_id] = admin.id
70
+ assert admin.can_perform?('Category', 'create')
71
+ end
72
+
73
+ def test_should_not_allow_designer_to_add_a_category
74
+ designer = typus_users(:designer)
75
+ @request.session[:typus_user_id] = designer.id
76
+ category = categories(:first)
77
+ get :new
78
+ assert_response :redirect
79
+ assert flash[:notice]
80
+ assert_equal "Designer can't perform action (new).", flash[:notice]
81
+ assert_redirected_to :action => :index
82
+ end
83
+
84
+ def test_should_allow_admin_to_destroy_a_category
85
+ admin = typus_users(:admin)
86
+ @request.session[:typus_user_id] = admin.id
87
+ category = categories(:first)
88
+ get :destroy, { :id => category.id }
89
+ assert_response :redirect
90
+ assert flash[:success]
91
+ assert_match /Category successfully removed./, flash[:success]
92
+ assert_redirected_to :action => :index
93
+ end
94
+
95
+ def test_should_not_allow_designer_to_destroy_a_category
96
+ designer = typus_users(:designer)
97
+ @request.session[:typus_user_id] = designer.id
98
+ category = categories(:first)
99
+ get :destroy, { :id => category.id, :method => :delete }
100
+ assert_response :redirect
101
+ assert flash[:notice]
102
+ assert_match /Designer can't delete this item/, flash[:notice]
103
+ assert_redirected_to :action => :index
104
+ end
105
+
106
+ end
@@ -0,0 +1,120 @@
1
+ require 'test/helper'
2
+
3
+ ##
4
+ # Test template extensions rendering and things related to views.
5
+ #
6
+ class Admin::CommentsControllerTest < ActionController::TestCase
7
+
8
+ def setup
9
+ @typus_user = typus_users(:admin)
10
+ @request.session[:typus_user_id] = @typus_user.id
11
+ @comment = comments(:first)
12
+ end
13
+
14
+ def test_should_render_comments_partials_on_index
15
+ get :index
16
+ assert_response :success
17
+ partials = %w( _index.html.erb _sidebar.html.erb )
18
+ partials.each { |p| assert_match p, @response.body }
19
+ end
20
+
21
+ def test_should_render_comments_partials_on_new
22
+ get :new
23
+ assert_response :success
24
+ partials = %w( _new.html.erb _sidebar.html.erb )
25
+ partials.each { |p| assert_match p, @response.body }
26
+ end
27
+
28
+ def test_should_render_comments_partials_on_edit
29
+ get :edit, { :id => @comment.id }
30
+ assert_response :success
31
+ partials = %w( _edit.html.erb _sidebar.html.erb )
32
+ partials.each { |p| assert_match p, @response.body }
33
+ end
34
+
35
+ def test_should_render_comments_partials_on_show
36
+ get :show, { :id => @comment.id }
37
+ assert_response :success
38
+ partials = %w( _show.html.erb _sidebar.html.erb )
39
+ partials.each { |p| assert_match p, @response.body }
40
+ end
41
+
42
+ def test_should_verify_page_title_on_index
43
+ get :index
44
+ assert_select 'title', "#{Typus::Configuration.options[:app_name]} - Comments"
45
+ end
46
+
47
+ def test_should_verify_page_title_on_new
48
+ get :new
49
+ assert_select 'title', "#{Typus::Configuration.options[:app_name]} - Comments &rsaquo; New"
50
+ end
51
+
52
+ def test_should_verify_page_title_on_edit
53
+ comment = comments(:first)
54
+ get :edit, :id => comment.id
55
+ assert_select 'title', "#{Typus::Configuration.options[:app_name]} - Comments &rsaquo; Edit"
56
+ end
57
+
58
+ def test_should_show_add_new_link_in_index
59
+ get :index
60
+ assert_response :success
61
+ assert_match 'Add entry', @response.body
62
+ end
63
+
64
+ def test_should_not_show_add_new_link_in_index
65
+
66
+ typus_user = typus_users(:designer)
67
+ @request.session[:typus_user_id] = typus_user.id
68
+
69
+ get :index
70
+ assert_response :success
71
+ assert_no_match /Add comment/, @response.body
72
+
73
+ end
74
+
75
+ def test_should_show_trash_item_image_and_link_in_index
76
+ get :index
77
+ assert_response :success
78
+ assert_match /trash.gif/, @response.body
79
+ end
80
+
81
+ def test_should_not_show_remove_item_link_in_index
82
+
83
+ typus_user = typus_users(:designer)
84
+ @request.session[:typus_user_id] = typus_user.id
85
+
86
+ get :index
87
+ assert_response :success
88
+ assert_no_match /trash.gif/, @response.body
89
+
90
+ end
91
+
92
+ def test_should_verify_new_comment_contains_a_link_to_add_a_new_post
93
+ get :new
94
+ match = '/admin/posts/new?back_to=%2Fadmin%2Fcomments%2Fnew&amp;selected=post_id'
95
+ assert_match match, @response.body
96
+ end
97
+
98
+ def test_should_verify_edit_comment_contains_a_link_to_add_a_new_post
99
+ comment = comments(:first)
100
+ get :edit, :id => comment.id
101
+ match = "/admin/posts/new?back_to=%2Fadmin%2Fcomments%2Fedit%2F#{comment.id}&amp;selected=post_id"
102
+ assert_match match, @response.body
103
+ end
104
+
105
+ def test_should_generate_csv
106
+
107
+ expected = <<-RAW
108
+ Email,Post
109
+ john@example.com,1
110
+ me@example.com,1
111
+ john@example.com,
112
+ me@example.com,1
113
+ RAW
114
+
115
+ get :index, :format => 'csv'
116
+ assert_equal expected, @response.body
117
+
118
+ end
119
+
120
+ end
@@ -0,0 +1,5 @@
1
+ require 'test/helper'
2
+
3
+ class Admin::MasterControllerTest < ActionController::TestCase
4
+
5
+ end
@@ -0,0 +1,261 @@
1
+ require 'test/helper'
2
+
3
+ ##
4
+ # Test CRUD actions and ...
5
+ #
6
+ # - Relate comment which is a has_many relationship.
7
+ # - Unrelate comment which is a has_many relationship.
8
+ #
9
+ class Admin::PostsControllerTest < ActionController::TestCase
10
+
11
+ def setup
12
+ typus_user = typus_users(:admin)
13
+ @request.session[:typus_user_id] = typus_user.id
14
+ end
15
+
16
+ def test_should_redirect_to_login
17
+
18
+ @request.session[:typus_user_id] = nil
19
+
20
+ get :index
21
+ assert_response :redirect
22
+ assert_redirected_to admin_sign_in_path(:back_to => '/admin/posts')
23
+ get :edit, { :id => 1 }
24
+ assert_response :redirect
25
+ assert_redirected_to admin_sign_in_path(:back_to => '/admin/posts')
26
+
27
+ end
28
+
29
+ def test_should_render_index
30
+ get :index
31
+ assert_response :success
32
+ assert_template 'index'
33
+ end
34
+
35
+ def test_should_render_new
36
+ test_should_update_item_and_redirect_to_index
37
+ get :new
38
+ assert_response :success
39
+ assert_template 'new'
40
+ end
41
+
42
+ def test_should_create_item_and_redirect_to_index
43
+
44
+ options = Typus::Configuration.options.merge(:index_after_save => true)
45
+ Typus::Configuration.stubs(:options).returns(options)
46
+
47
+ assert_difference 'Post.count' do
48
+ post :create, { :item => { :title => 'This is another title', :body => 'Body' } }
49
+ assert_response :redirect
50
+ assert_redirected_to :action => 'index'
51
+ end
52
+
53
+ end
54
+
55
+ def test_should_create_item_and_redirect_to_edit
56
+
57
+ options = Typus::Configuration.options.merge(:index_after_save => false)
58
+ Typus::Configuration.stubs(:options).returns(options)
59
+
60
+ assert_difference 'Post.count' do
61
+ post :create, { :item => { :title => 'This is another title', :body => 'Body' } }
62
+ assert_response :redirect
63
+ assert_redirected_to :controller => 'admin/posts', :action => 'edit', :id => Post.last
64
+ end
65
+
66
+ end
67
+
68
+ def test_should_render_show
69
+ post_ = posts(:published)
70
+ get :show, { :id => post_.id }
71
+ assert_response :success
72
+ assert_template 'show'
73
+ end
74
+
75
+ def test_should_render_edit
76
+ post_ = posts(:published)
77
+ get :edit, { :id => post_.id }
78
+ assert_response :success
79
+ assert_template 'edit'
80
+ end
81
+
82
+ def test_should_update_item_and_redirect_to_index
83
+
84
+ options = Typus::Configuration.options.merge(:index_after_save => true)
85
+ Typus::Configuration.stubs(:options).returns(options)
86
+
87
+ post_ = posts(:published)
88
+ post :update, { :id => post_.id, :title => 'Updated' }
89
+ assert_response :redirect
90
+ assert_redirected_to :action => 'index'
91
+
92
+ end
93
+
94
+ def test_should_update_item_and_redirect_to_edit
95
+
96
+ options = Typus::Configuration.options.merge(:index_after_save => false)
97
+ Typus::Configuration.stubs(:options).returns(options)
98
+
99
+ post_ = posts(:published)
100
+ post :update, { :id => post_.id, :title => 'Updated' }
101
+ assert_response :redirect
102
+ assert_redirected_to :controller => 'admin/posts', :action => 'edit', :id => post_.id
103
+
104
+ end
105
+
106
+ def test_should_allow_admin_to_toggle_item
107
+ @request.env['HTTP_REFERER'] = '/admin/posts'
108
+ post = posts(:unpublished)
109
+ get :toggle, { :id => post.id, :field => 'status' }
110
+ assert_response :redirect
111
+ assert_redirected_to :action => 'index'
112
+ assert flash[:success]
113
+ assert Post.find(post.id).status
114
+ end
115
+
116
+ def test_should_perform_a_search
117
+ typus_user = typus_users(:admin)
118
+ @request.session[:typus_user_id] = typus_user.id
119
+ get :index, { :search => 'neinonon' }
120
+ assert_response :success
121
+ assert_template 'index'
122
+ end
123
+
124
+ def test_should_relate_category_to_post_which_is_a_habtm_relationship
125
+ category = categories(:first)
126
+ post_ = posts(:published)
127
+ @request.env['HTTP_REFERER'] = "/admin/posts/edit/#{post_.id}#categories"
128
+ assert_difference('category.posts.count') do
129
+ post :relate, { :id => post_.id, :related => { :model => 'Category', :id => category.id } }
130
+ end
131
+ assert_response :redirect
132
+ assert flash[:success]
133
+ assert_redirected_to @request.env['HTTP_REFERER']
134
+ end
135
+
136
+ def test_should_unrelate_category_from_post_which_is_a_habtm_relationship
137
+ category = categories(:first)
138
+ post_ = posts(:published)
139
+ @request.env['HTTP_REFERER'] = "/admin/posts/edit/#{post_.id}#categories"
140
+ assert_difference('category.posts.count', 0) do
141
+ post :unrelate, { :id => post_.id, :resource => 'Category', :resource_id => category.id, :association => 'has_and_belongs_to_many' }
142
+ end
143
+ assert_response :redirect
144
+ assert flash[:success]
145
+ assert_match /Category unrelated from/, flash[:success]
146
+ assert_redirected_to @request.env['HTTP_REFERER']
147
+ end
148
+
149
+ ##
150
+ # This is a polimorphic relationship.
151
+ #
152
+ def test_should_unrelate_an_asset_from_a_post
153
+
154
+ post_ = posts(:published)
155
+
156
+ @request.env['HTTP_REFERER'] = "/admin/posts/edit/#{post_.id}#assets"
157
+
158
+ assert_difference('post_.assets.count', -1) do
159
+ get :unrelate, { :id => post_.id, :resource => 'Asset', :resource_id => post_.assets.first.id, :association => 'has_many' }
160
+ end
161
+
162
+ assert_response :redirect
163
+ assert_redirected_to @request.env['HTTP_REFERER']
164
+ assert flash[:success]
165
+ assert_match /Asset removed from/, flash[:success]
166
+
167
+ end
168
+
169
+ def test_should_check_redirection_when_theres_no_http_referer_on_new
170
+
171
+ typus_user = typus_users(:designer)
172
+ @request.session[:typus_user_id] = typus_user.id
173
+
174
+ get :new
175
+ assert_response :redirect
176
+ assert_redirected_to admin_dashboard_path
177
+
178
+ assert flash[:notice]
179
+ assert_equal "Designer can't perform action (new).", flash[:notice]
180
+
181
+ @request.env['HTTP_REFERER'] = '/admin/posts'
182
+
183
+ typus_user = typus_users(:designer)
184
+ @request.session[:typus_user_id] = typus_user.id
185
+
186
+ get :new
187
+ assert_response :redirect
188
+ assert_redirected_to '/admin/posts'
189
+
190
+ assert flash[:notice]
191
+ assert_equal "Designer can't perform action (new).", flash[:notice]
192
+
193
+ end
194
+
195
+ def test_should_disable_toggle_and_check_links_are_disabled
196
+
197
+ options = Typus::Configuration.options.merge(:toggle => false)
198
+ Typus::Configuration.stubs(:options).returns(options)
199
+
200
+ @request.env['HTTP_REFERER'] = '/admin/posts'
201
+ post = posts(:unpublished)
202
+ get :toggle, { :id => post.id, :field => 'status' }
203
+ assert_response :redirect
204
+ assert_redirected_to :action => 'index'
205
+ assert !flash[:success]
206
+ assert !flash[:error]
207
+ assert flash[:notice]
208
+ assert_equal "Toggle is disabled.", flash[:notice]
209
+
210
+ end
211
+
212
+ def test_should_show_form_templates
213
+ get :new
214
+ assert_response :success
215
+ assert_match /datepicker_template_published_at/, @response.body
216
+ end
217
+
218
+ def test_should_verify_root_can_edit_any_record
219
+ Post.find(:all).each do |post|
220
+ get :edit, { :id => post.id }
221
+ assert_response :success
222
+ assert_template 'edit'
223
+ end
224
+ end
225
+
226
+ def test_should_verify_editor_can_view_all_records
227
+ Post.find(:all).each do |post|
228
+ get :show, { :id => post.id }
229
+ assert_response :success
230
+ assert_template 'show'
231
+ end
232
+ end
233
+
234
+ def test_should_verify_editor_can_edit_their_records
235
+
236
+ typus_user = typus_users(:editor)
237
+ @request.session[:typus_user_id] = typus_user.id
238
+
239
+ post = posts(:owned_by_editor)
240
+ get :edit, { :id => post.id }
241
+ assert_response :success
242
+
243
+ end
244
+
245
+ def test_should_verify_editor_cannot_edit_other_users_records
246
+
247
+ @request.env['HTTP_REFERER'] = '/admin/posts'
248
+
249
+ typus_user = typus_users(:editor)
250
+ @request.session[:typus_user_id] = typus_user.id
251
+
252
+ post = posts(:owned_by_admin)
253
+ get :edit, { :id => post.id }
254
+ assert_response :redirect
255
+ assert_redirected_to '/admin/posts'
256
+ assert flash[:notice]
257
+ assert_equal "You don't have permission to access this item.", flash[:notice]
258
+
259
+ end
260
+
261
+ end