settings_controller_test.rb 9.49 KB
Newer Older
1
# Redmine - project management software
jplang's avatar
jplang committed
2
# Copyright (C) 2006-2017  Jean-Philippe Lang
3 4 5 6 7
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
8
#
9 10 11 12
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
13
#
14 15 16 17
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

18
require File.expand_path('../../test_helper', __FILE__)
19

20
class SettingsControllerTest < Redmine::ControllerTest
21 22
  fixtures :projects, :trackers, :issue_statuses, :issues,
           :users
23

24 25 26 27
  def setup
    User.current = nil
    @request.session[:user_id] = 1 # admin
  end
28

29 30 31 32 33
  def teardown
    Setting.delete_all
    Setting.clear_cache
  end

jplang's avatar
jplang committed
34 35 36
  def test_index
    get :index
    assert_response :success
37 38

    assert_select 'input[name=?][value=?]', 'settings[app_title]', Setting.app_title
jplang's avatar
jplang committed
39
  end
40

41 42 43
  def test_get_edit
    get :edit
    assert_response :success
44

45
    assert_select 'input[name=?][value=""]', 'settings[enabled_scm][]'
46
  end
47

48 49 50 51 52 53
  def test_get_edit_should_preselect_default_issue_list_columns
    with_settings :issue_list_default_columns => %w(tracker subject status updated_on) do
      get :edit
      assert_response :success
    end

54
    assert_select 'select[name=?]', 'settings[issue_list_default_columns][]' do
55 56 57 58 59 60 61
      assert_select 'option', 4
      assert_select 'option[value=tracker]', :text => 'Tracker'
      assert_select 'option[value=subject]', :text => 'Subject'
      assert_select 'option[value=status]', :text => 'Status'
      assert_select 'option[value=updated_on]', :text => 'Updated'
    end

62
    assert_select 'select[name=?]', 'available_columns[]' do
63 64 65 66 67
      assert_select 'option[value=tracker]', 0
      assert_select 'option[value=priority]', :text => 'Priority'
    end
  end

68 69 70 71 72 73 74
  def test_get_edit_without_trackers_should_succeed
    Tracker.delete_all

    get :edit
    assert_response :success
  end

75
  def test_post_edit_notifications
76 77 78 79 80 81 82 83
    post :edit, :params => {
      :settings => {
        :mail_from => 'functional@test.foo',
        :bcc_recipients  => '0',
        :notified_events => %w(issue_added issue_updated news_added),
        :emails_footer => 'Test footer'
      }
    }
jplang's avatar
jplang committed
84
    assert_redirected_to '/settings'
85 86 87 88 89
    assert_equal 'functional@test.foo', Setting.mail_from
    assert !Setting.bcc_recipients?
    assert_equal %w(issue_added issue_updated news_added), Setting.notified_events
    assert_equal 'Test footer', Setting.emails_footer
  end
90

91
  def test_edit_commit_update_keywords
92 93 94 95
    with_settings :commit_update_keywords => [
      {"keywords" => "fixes, resolves", "status_id" => "3"},
      {"keywords" => "closes", "status_id" => "5", "done_ratio" => "100", "if_tracker_id" => "2"}
    ] do
96 97 98 99
      get :edit
    end
    assert_response :success
    assert_select 'tr.commit-keywords', 2
100
    assert_select 'tr.commit-keywords:nth-child(1)' do
101 102
      assert_select 'input[name=?][value=?]', 'settings[commit_update_keywords][keywords][]', 'fixes, resolves'
      assert_select 'select[name=?]', 'settings[commit_update_keywords][status_id][]' do
103
        assert_select 'option[value="3"][selected=selected]'
104 105
      end
    end
106
    assert_select 'tr.commit-keywords:nth-child(2)' do
107 108
      assert_select 'input[name=?][value=?]', 'settings[commit_update_keywords][keywords][]', 'closes'
      assert_select 'select[name=?]', 'settings[commit_update_keywords][status_id][]' do
109
        assert_select 'option[value="5"][selected=selected]', :text => 'Closed'
110 111
      end
      assert_select 'select[name=?]', 'settings[commit_update_keywords][done_ratio][]' do
112
        assert_select 'option[value="100"][selected=selected]', :text => '100 %'
113 114
      end
      assert_select 'select[name=?]', 'settings[commit_update_keywords][if_tracker_id][]' do
115
        assert_select 'option[value="2"][selected=selected]', :text => 'Feature request'
116 117 118 119 120
      end
    end
  end

  def test_edit_without_commit_update_keywords_should_show_blank_line
121
    with_settings :commit_update_keywords => [] do
122 123 124 125
      get :edit
    end
    assert_response :success
    assert_select 'tr.commit-keywords', 1 do
126
      assert_select 'input[name=?]:not([value])', 'settings[commit_update_keywords][keywords][]'
127 128 129 130
    end
  end

  def test_post_edit_commit_update_keywords
131 132 133 134 135 136 137 138
    post :edit, :params => {
      :settings => {
        :commit_update_keywords => {
          :keywords => ["resolves", "closes"],
          :status_id => ["3", "5"],
          :done_ratio => ["", "100"],
          :if_tracker_id => ["", "2"]
        }
139 140 141
      }
    }
    assert_redirected_to '/settings'
142 143 144 145
    assert_equal([
      {"keywords" => "resolves", "status_id" => "3"},
      {"keywords" => "closes", "status_id" => "5", "done_ratio" => "100", "if_tracker_id" => "2"}
    ], Setting.commit_update_keywords)
146 147
  end

148 149 150 151 152 153 154 155 156
  def test_post_edit_with_invalid_setting_should_not_error
    post :edit, :params => {
      :settings => {
        :invalid_setting => '1'
      }
    }
    assert_redirected_to '/settings'
  end

157 158
  def test_post_edit_should_send_security_notification_for_notified_settings
    ActionMailer::Base.deliveries.clear
159 160 161 162
    post :edit, :params => {
      :settings => {
        :login_required => 1
      }
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
    }
    assert_not_nil (mail = ActionMailer::Base.deliveries.last)
    assert_mail_body_match '0.0.0.0', mail
    assert_mail_body_match I18n.t(:setting_login_required), mail
    assert_select_email do
      assert_select 'a[href^=?]', 'http://localhost:3000/settings'
    end
    # All admins should receive this
    recipients = [mail.bcc, mail.cc].flatten
    User.active.where(admin: true).each do |admin|
      assert_include admin.mail, recipients
    end
  end

  def test_post_edit_should_not_send_security_notification_for_non_notified_settings
    ActionMailer::Base.deliveries.clear
179 180 181 182
    post :edit, :params => {
      :settings => {
        :app_title => 'MineRed'
      }
183 184 185 186 187 188
    }
    assert_nil (mail = ActionMailer::Base.deliveries.last)
  end

  def test_post_edit_should_not_send_security_notification_for_unchanged_settings
    ActionMailer::Base.deliveries.clear
189 190 191 192
    post :edit, :params => {
      :settings => {
        :login_required => 0
      }
193 194 195 196 197
    }
    assert_nil (mail = ActionMailer::Base.deliveries.last)
  end


198
  def test_get_plugin_settings
jplang's avatar
jplang committed
199
    ActionController::Base.append_view_path(File.join(Rails.root, "test/fixtures/plugins"))
200
    Redmine::Plugin.register :foo do
jplang's avatar
jplang committed
201
      settings :partial => "foo_plugin/foo_plugin_settings"
202
    end
jplang's avatar
jplang committed
203
    Setting.plugin_foo = {'sample_setting' => 'Plugin setting value'}
204

205
    get :plugin, :params => {:id => 'foo'}
206
    assert_response :success
207

208 209 210
    assert_select 'form[action="/settings/plugin/foo"]' do
      assert_select 'input[name=?][value=?]', 'settings[sample_setting]', 'Plugin setting value'
    end
211 212
  ensure
    Redmine::Plugin.unregister(:foo)
213 214 215
  end

  def test_get_invalid_plugin_settings
216
    get :plugin, :params => {:id => 'none'}
217 218 219
    assert_response 404
  end

220 221 222
  def test_get_non_configurable_plugin_settings
    Redmine::Plugin.register(:foo) {}

223
    get :plugin, :params => {:id => 'foo'}
224 225
    assert_response 404

226 227
  ensure
    Redmine::Plugin.unregister(:foo)
228 229
  end

230
  def test_post_plugin_settings
231
    Redmine::Plugin.register(:foo) do
232 233
      settings :partial => 'not blank', # so that configurable? is true
        :default => {'sample_setting' => 'Plugin setting value'}
234
    end
235

236 237 238 239
    post :plugin, :params => {
      :id => 'foo',
      :settings => {'sample_setting' => 'Value'}
    }
240
    assert_redirected_to '/settings/plugin/foo'
241 242

    assert_equal({'sample_setting' => 'Value'}, Setting.plugin_foo)
243
  end
244

245 246 247 248 249 250 251 252 253 254 255 256 257 258
  def test_post_empty_plugin_settings
    Redmine::Plugin.register(:foo) do
      settings :partial => 'not blank', # so that configurable? is true
        :default => {'sample_setting' => 'Plugin setting value'}
    end

    post :plugin, :params => {
      :id => 'foo'
    }
    assert_redirected_to '/settings/plugin/foo'

    assert_equal({}, Setting.plugin_foo)
  end

259 260 261
  def test_post_non_configurable_plugin_settings
    Redmine::Plugin.register(:foo) {}

262 263 264 265
    post :plugin, :params => {
      :id => 'foo',
      :settings => {'sample_setting' => 'Value'}
    }
266 267
    assert_response 404

268 269
  ensure
    Redmine::Plugin.unregister(:foo)
270
  end
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299

  def test_post_mail_handler_delimiters_should_not_save_invalid_regex_delimiters
    post :edit, :params => {
      :settings => {
        :mail_handler_enable_regex_delimiters => '1',
        :mail_handler_body_delimiters  => 'Abc[',
      }
    }

    assert_response :success
    assert_equal '0', Setting.mail_handler_enable_regex_delimiters
    assert_equal '', Setting.mail_handler_body_delimiters

    assert_select_error /is not a valid regular expression/
    assert_select 'textarea[name=?]', 'settings[mail_handler_body_delimiters]', :text => 'Abc['
  end

  def test_post_mail_handler_delimiters_should_save_valid_regex_delimiters
    post :edit, :params => {
      :settings => {
        :mail_handler_enable_regex_delimiters => '1',
        :mail_handler_body_delimiters  => 'On .*, .* at .*, .* <.*<mailto:.*>> wrote:',
      }
    }

    assert_redirected_to '/settings'
    assert_equal '1', Setting.mail_handler_enable_regex_delimiters
    assert_equal 'On .*, .* at .*, .* <.*<mailto:.*>> wrote:', Setting.mail_handler_body_delimiters
  end
300
end