Project

General

Profile

Feature #7360 » default_custom_query_trunk_r15273.patch

Takenori TAKAKI, 2016-03-23 08:48

View differences:

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

  
18
class DefaultCustomQuerySettingController < ApplicationController
19
  before_filter :find_project_by_project_id
20
  before_filter :authorize
21

  
22
  helper :default_custom_query
23

  
24
  def update
25
    settings = params[:settings]
26

  
27
    @default_query = ProjectsDefaultQuery.initialize_for(@project.id)
28
    @default_query.query_id = settings[:query_id]
29

  
30
    if @default_query.save
31
      session[:query] = nil
32
    end
33

  
34
    render partial: 'form'
35
  end
36
end
app/controllers/issues_controller.rb
24 24
  before_filter :authorize, :except => [:index, :new, :create]
25 25
  before_filter :find_optional_project, :only => [:index, :new, :create]
26 26
  before_filter :build_new_issue_from_params, :only => [:new, :create]
27
  before_filter :with_default_query, only: [:index], if: :default_query_module_enabled?
27 28
  accept_rss_auth :index, :show
28 29
  accept_api_auth :index, :show, :create, :update, :destroy
29 30

  
......
353 354

  
354 355
  private
355 356

  
357
  def with_default_query
358
    case
359
    when params[:query_id].present?
360
      # Nothing to do
361
    when api_request?
362
      # Nothing to do
363
    # when show_all_issues?
364
    when params[:without_default]
365
      params[:set_filter] = 1
366
    # when filter_applied?
367
    when params[:set_filter] && params.key?(:op) && params.key?(:f)
368
      # Nothing to do
369
    # when filter_cleared?
370
    when params[:set_filter] && [:op, :f].all? {|k| !params.key?(k) }
371
      apply_default_query!
372
    when session[:query]
373
      query_id, project_id = session[:query].values_at(:id, :project_id)
374
      unless query_id && (project_id == @project.id) && IssueQuery.available_query?(@project.id, query_id)
375
        apply_default_query!
376
      end
377
    else
378
      apply_default_query!
379
    end
380
  end
381

  
382
  def apply_default_query!
383
    default_query = find_default_query
384
    if default_query
385
      params[:query_id] = default_query.id
386
    end
387
  end
388

  
356 389
  def retrieve_previous_and_next_issue_ids
357 390
    if params[:prev_issue_id].present? || params[:next_issue_id].present?
358 391
      @prev_issue_id = params[:prev_issue_id].presence.try(:to_i)
app/controllers/projects_controller.rb
38 38
  helper :queries
39 39
  helper :repositories
40 40
  helper :members
41
  helper :default_custom_query
41 42

  
42 43
  # Lists visible projects
43 44
  def index
app/helpers/default_custom_query_helper.rb
1
module DefaultCustomQueryHelper
2
  def options_for_selectable_queries(project)
3
    options_groups = []
4

  
5
    queries = IssueQuery.only_public.where(project_id: nil)
6
    if queries.any?
7
      options_groups << [l('default_custom_query.label_queries_for_all_projects'), queries]
8
    end
9

  
10
    queries = project.queries.only_public
11
    if queries.any?
12
      options_groups << [l('default_custom_query.label_queries_for_current_project'), queries]
13
    end
14

  
15
    options_groups.map do |group, options|
16
      [group, options.collect {|o| [o.name, o.id] }]
17
    end
18
  end
19
end
app/helpers/projects_helper.rb
27 27
            {:name => 'wiki', :action => :manage_wiki, :partial => 'projects/settings/wiki', :label => :label_wiki},
28 28
            {:name => 'repositories', :action => :manage_repository, :partial => 'projects/settings/repositories', :label => :label_repository_plural},
29 29
            {:name => 'boards', :action => :manage_boards, :partial => 'projects/settings/boards', :label => :label_board_plural},
30
            {:name => 'activities', :action => :manage_project_activities, :partial => 'projects/settings/activities', :label => :enumeration_activities}
30
            {:name => 'activities', :action => :manage_project_activities, :partial => 'projects/settings/activities', :label => :enumeration_activities},
31
            {:name => 'default_custom_query', :action => :manage_default_query, :partial => 'default_custom_query_setting/form', :label => :'default_custom_query.label_setting'}
31 32
            ]
32
    tabs.select {|tab| User.current.allowed_to?(tab[:action], @project)}
33
    tabs = tabs.select {|tab| User.current.allowed_to?(tab[:action], @project)}
33 34
  end
34 35

  
35 36
  def parent_project_select_tag(project)
app/helpers/queries_helper.rb
241 241
        @query.project = @project
242 242
      end
243 243
      @query
244
    else
245
      @query = find_default_query
244 246
    end
245 247
  end
246 248

  
249
  private
250

  
251
  def find_default_query
252
    @project.default_query if @project.is_a?(Project)
253
  end
254

  
255
  def default_query_module_enabled?
256
    @project && @project.module_enabled?(:default_custom_query)
257
  end
258

  
247 259
  # Returns the query definition as hidden field tags
248 260
  def query_as_hidden_field_tags(query)
249 261
    tags = hidden_field_tag("set_filter", "1", :id => nil)
app/models/issue_query.rb
16 16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17 17

  
18 18
class IssueQuery < Query
19
  has_many :projects_default_queries, dependent: :nullify, foreign_key: :query_id
19 20

  
20 21
  self.queried_class = Issue
21 22

  
......
71 72
    end
72 73
  }
73 74

  
75
  scope :only_public, -> {
76
    where(:visibility => VISIBILITY_PUBLIC)
77
  }
78

  
79
  def self.available_query?(project_id, query_id)
80
    self.only_public
81
        .where('project_id is null or project_id = ?', project_id)
82
        .where(id: query_id).exists?
83
  end
84

  
74 85
  def initialize(attributes=nil, *args)
75 86
    super attributes
76 87
    self.filters ||= { 'status_id' => {:operator => "o", :values => [""]} }
......
102 113
    !is_private?
103 114
  end
104 115

  
116
  def public_visibility?
117
    visibility == VISIBILITY_PUBLIC
118
  end
119

  
105 120
  def draw_relations
106 121
    r = options[:draw_relations]
107 122
    r.nil? || r == '1'
app/models/project.rb
55 55
                          :class_name => 'IssueCustomField',
56 56
                          :join_table => "#{table_name_prefix}custom_fields_projects#{table_name_suffix}",
57 57
                          :association_foreign_key => 'custom_field_id'
58
  # Default Custom Queries
59
  has_many :default_queries, dependent: :delete_all, :class_name => 'ProjectsDefaultQuery'
58 60

  
59 61
  acts_as_attachable :view_permission => :view_files,
60 62
                     :edit_permission => :manage_files,
......
790 792
    end
791 793
  end
792 794

  
795
  def default_query
796
    default_queries.first.try :query
797
  end
798

  
799
  def init_default_query
800
    default_queries.first || default_queries.new
801
  end
802

  
793 803
  private
794 804

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

  
18
class ProjectsDefaultQuery < ActiveRecord::Base
19
  belongs_to :project
20
  belongs_to :query, class_name: 'IssueQuery'
21

  
22
  validates :project_id, :query_id, numericality: { allow_nil: true }
23
  validates :project_id, uniqueness: true, presence: true
24
  validate :query_must_be_selectable
25

  
26
  def self.initialize_for(project_id)
27
    default_query = where(:project_id => project_id).first
28

  
29
    unless default_query
30
      default_query = self.new
31
      default_query.project_id = project_id
32
    end
33
    default_query
34
  end
35

  
36
  def query
37
    return unless super
38

  
39
    unless new_record? || selectable_query?(super)
40
      update_attribute :query_id, nil
41
    end
42
    super
43
  end
44

  
45
  private
46

  
47
  def query_must_be_selectable
48
    return if errors.any? || query_id.blank? || !query_id_changed?
49

  
50
    issue_query = IssueQuery.where(:id => query_id).first
51

  
52
    unless selectable_query?(issue_query)
53
      errors.add :query_id, :invalid
54
    end
55
  end
56

  
57
  def selectable_query?(query)
58
    query && query.public_visibility? &&
59
    (query.project.nil? || query.project == project)
60
  end
61
end
app/views/default_custom_query_setting/_form.html.erb
1
<%= labelled_form_for @default_query ||= @project.init_default_query,
2
                      as: :settings,
3
                      url: default_custom_query_setting_update_path(@project),
4
                      remote: true, method: :put, html: { id: 'default-query-setting' } do |f| %>
5

  
6
  <%= error_messages_for @default_query %>
7

  
8
  <div class="box tabular">
9
    <p>
10
      <%= f.select :query_id, options_for_selectable_queries(@project), include_blank: true %><br>
11
      <em><%=l 'default_custom_query.text_allowed_queries' %></em>
12
    </p>
13
  </div>
14
  <%= submit_tag l(:button_save) %>
15
<% end %>
16

  
17
<script>
18
  $('#default-query-setting').on('ajax:success', function(data, result, xhr) {
19
    $('#tab-content-default_custom_query').html(result);
20
  });
21
</script>
app/views/issues/_sidebar.html.erb
1 1
<h3><%= l(:label_issue_plural) %></h3>
2 2

  
3 3
<ul>
4
<li><%= link_to l(:label_issue_view_all), _project_issues_path(@project, :set_filter => 1) %></li>
4
<% if @project && @project.module_enabled?(:default_custom_query) && @project.default_query.present? %>
5
<li><%= link_to l('default_custom_query.label_view_default_issues'), project_issues_path(@project, :set_filter => 1) %><li>
6
<% end %>
7
<li><%= link_to l(:label_issue_view_all), _project_issues_path(@project, :set_filter => 1, :without_default => 1) %></li>
5 8
<% if @project %>
6 9
<li><%= link_to l(:field_summary), project_issues_report_path(@project) %></li>
7 10
<% end %>
config/locales/en.yml
1181 1181
  description_date_from: Enter start date
1182 1182
  description_date_to: Enter end date
1183 1183
  text_repository_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.'
1184
  
1185
  project_module_default_custom_query: Default custom query
1186
  permission_manage_default_query: Manage default query
1187

  
1188
  # Labels for projects_default_queries column
1189
  field_query: Default custom query
1190

  
1191
  default_custom_query:
1192
    label_setting: Default custom query
1193
    label_view_default_issues: View default issues
1194
    label_queries_for_all_projects: For all projects
1195
    label_queries_for_current_project: For current project
1196

  
1197
    text_allowed_queries: Public (to any users) queries only selectable
config/locales/fr.yml
1201 1201
  mail_body_security_notification_notify_enabled: Les notifications ont été activées pour l'adresse %{value}
1202 1202
  mail_body_security_notification_notify_disabled: Les notifications ont été désactivées pour l'adresse %{value}
1203 1203
  field_remote_ip: Adresse IP
1204

  
1205
  project_module_default_custom_query: Rapport par défaut
1206
  permission_manage_default_query: Gérer le rapport par défaut
1207

  
1208
  # Labels for projects_default_queries column
1209
  field_query: Rapport par défaut
1210

  
1211
  default_custom_query:
1212
    label_setting: Rapport par défaut
1213
    label_view_default_issues: Voir les demandes par défaut
1214
    label_queries_for_all_projects: Pour tous les projets
1215
    label_queries_for_current_project: Pour le projet en cours
1216

  
1217
    text_allowed_queries: Seuls les rapports publics (pour tous les utilisateurs) sont sélectionnables
config/locales/ja.yml
1209 1209
    receives notifications.
1210 1210
  mail_body_settings_updated: ! 'The following settings were changed:'
1211 1211
  field_remote_ip: IP address
1212

  
1213
  project_module_default_custom_query: デフォルトカスタムクエリ
1214
  permission_manage_default_query: デフォルトカスタムクエリの管理
1215

  
1216
  # Labels for projects_default_queries column
1217
  field_query: デフォルトクエリ
1218

  
1219
  default_custom_query:
1220
    label_setting: デフォルトカスタムクエリ
1221
    label_view_default_issues: デフォルトチケット一覧を見る
1222
    label_queries_for_all_projects: 全プロジェクト向け
1223
    label_queries_for_current_project: 現在プロジェクト
1224

  
1225
    text_allowed_queries: 公開クエリ(すべてのユーザ)のみ選択可能
config/locales/ru.yml
1297 1297
    receives notifications.
1298 1298
  mail_body_settings_updated: ! 'The following settings were changed:'
1299 1299
  field_remote_ip: IP address
1300

  
1301
  project_module_default_custom_query: Выбор запроса по умолчанию (фильтр задач)
1302
  permission_manage_default_query: Manage default query
1303

  
1304
  # Labels for projects_default_queries column
1305
  field_query: Выбор запроса по умолчанию
1306

  
1307
  default_custom_query:
1308
    label_setting: Выбор запроса по умолчанию
1309
    label_view_default_issues: Просматривать запросы по умолчанию
1310
    label_queries_for_all_projects: Для всех проектов
1311
    label_queries_for_current_project: Для текущего прооекта
1312

  
1313
    text_allowed_queries: Для выбора доступны только публичные запросы (фильтры задач)
config/locales/tr.yml
1203 1203
    receives notifications.
1204 1204
  mail_body_settings_updated: ! 'The following settings were changed:'
1205 1205
  field_remote_ip: IP address
1206

  
1207
  project_module_default_custom_query: Öntanımlı özel sorgu
1208
  permission_manage_default_query: Öntanımlı sorguyu yönet
1209

  
1210
  # Labels for projects_default_queries column
1211
  field_query: Öntanımlı özel sorgu
1212

  
1213
  default_custom_query:
1214
    label_setting: Öntanımlı özel sorgu
1215
    label_view_default_issues: Öntanımlı işleri gör
1216
    label_queries_for_all_projects: Tüm birimler için
1217
    label_queries_for_current_project: Simdiki birim için
1218

  
1219
    text_allowed_queries: Herkese açık (tüm kullanıcılar) sorgular sadece seçilebilir
config/routes.rb
363 363

  
364 364
  match 'uploads', :to => 'attachments#upload', :via => :post
365 365

  
366
  controller :default_custom_query_setting, as: 'default_custom_query_setting' do
367
    put ':project_id/default_custom_query/update', action: 'update', as: 'update'
368
  end
369

  
366 370
  get 'robots.txt', :to => 'welcome#robots'
367 371

  
368 372
  Dir.glob File.expand_path("plugins/*", Rails.root) do |plugin_dir|
config/settings.yml
219 219
  - boards
220 220
  - calendar
221 221
  - gantt
222
  - default_custom_query
222 223
default_projects_tracker_ids:
223 224
  serialized: true
224 225
  default:
db/migrate/20160307180800_create_projects_default_queries.rb
1
class CreateProjectsDefaultQueries < ActiveRecord::Migration
2
  def change
3
    create_table :projects_default_queries do |t|
4
      t.belongs_to :project
5
      t.belongs_to :query
6

  
7
      t.timestamps null: false
8
    end
9
    add_index :projects_default_queries, :project_id, unique: true
10
    add_index :projects_default_queries, :query_id
11
  end
12
end
lib/redmine.rb
183 183
  map.project_module :gantt do |map|
184 184
    map.permission :view_gantt, {:gantts => [:show, :update]}, :read => true
185 185
  end
186

  
187
  map.project_module :default_custom_query do |map|
188
    map.permission :manage_default_query, { :default_custom_query_setting =>  [:update] }, :require => :member
189
  end
186 190
end
187 191

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

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

  
20
class DefaultCustomQuerySettingControllerTest < ActionController::TestCase
21
  fixtures :projects,
22
           :users,
23
           :roles,
24
           :members,
25
           :member_roles,
26
           :issues
27

  
28
  def setup
29
    User.current = nil
30
    @request.session[:user_id] = nil
31

  
32
    @project = Project.generate_with_parent!
33
    @project.enable_module!(:default_custom_query)
34

  
35
    @permitted_user = User.generate!
36
    User.add_to_project(@permitted_user, @project, Role.generate!(:permissions => [:edit_project, :manage_default_query]))
37
    @not_permitted_user = User.generate!
38
    User.add_to_project(@not_permitted_user, @project, Role.generate!(:permissions => [:edit_project, :add_subprojects]))
39

  
40
    @stored_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project)
41
    @session_query_value = {:id => @stored_query.id, :project_id => @project.id}
42
    @request.session[:query] = @session_query_value
43
  end
44

  
45
  def test_update_should_success_when_module_is_enabled_on_project_and_logged_user_has_permission
46
    public_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project)
47
    @request.session[:user_id] = @permitted_user.id
48

  
49
    xhr :put, :update, :project_id => @project.id, :settings => {:query_id => public_query.id}
50

  
51
    assert_response :success
52
    assert_nil @request.session[:query]
53
    assert_template partial: 'default_custom_query_setting/_form'
54

  
55
    assert_equal public_query, @project.default_query
56
  end
57

  
58
  def test_update_should_success_and_clear_query_when_module_is_enabled_on_project_and_logged_user_has_permission
59
    @request.session[:user_id] = @permitted_user.id
60

  
61
    xhr :put, :update, :project_id => @project.id, :settings => {:query_id => nil}
62

  
63
    assert_response :success
64
    assert_equal nil, @request.session[:query]
65
    assert_template partial: 'default_custom_query_setting/_form'
66

  
67
    assert_nil @project.default_query
68
  end
69

  
70
  def test_update_should_failure_when_module_is_enabled_on_project_but_logged_user_does_not_have_permission
71
    public_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project)
72
    @request.session[:user_id] = @not_permitted_user.id
73

  
74
    xhr :put, :update, :project_id => @project.identifier, :settings => {:query_id => public_query.id}
75

  
76
    assert_response :forbidden
77
    assert_equal @session_query_value, @request.session[:query]
78
  end
79

  
80
  def test_update_should_failure_when_module_is_enabled_on_project_but_spacified_unselectable_query
81
    private_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => @project)
82
    @request.session[:user_id] = @permitted_user.id
83

  
84
    xhr :put, :update, :project_id => @project.id, :settings => {:query_id => private_query.id}
85

  
86
    assert_response :success
87
    assert_equal @session_query_value, @request.session[:query]
88
    assert_template partial: 'default_custom_query_setting/_form'
89
    assert_select '#errorExplanation li', 1
90
  end
91

  
92
  def test_update_should_failure_when_module_is_disabled
93
    @project.disable_module!(:default_custom_query)
94
    public_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project)
95
    @request.session[:user_id] = @permitted_user.id
96

  
97
    xhr :put, :update, :project_id => @project.id, :settings => {:query_id => public_query.id}
98

  
99
    assert_response :forbidden
100
    assert_equal @session_query_value, @request.session[:query]
101
  end
102
end
test/functional/issues_controller_test.rb
431 431
    assert_response :success
432 432
  end
433 433

  
434
  def test_default_query_should_be_available_when_default_query_module_enabled
435
    project = Project.find(1)
436
    project.enable_module!(:default_custom_query)
437

  
438
    q = IssueQuery.create!(:name => "default_custom_query", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => nil)
439
    dq = ProjectsDefaultQuery.initialize_for(project.id)
440
    dq.query = q
441
    dq.save!
442

  
443
    @request.session[:user_id] = 3
444

  
445
    get :index, :project_id => 1
446
    assert_response :success
447
    assert_select 'h2', text: q.name
448
    assert_select 'ul.queries a.selected', text: q.name
449
  end
450

  
451
  def test_default_query_should_be_unavailable_when_default_query_module_disabled
452
    project = Project.find(1)
453
    project.disable_module!(:default_custom_query)
454

  
455
    @request.session[:user_id] = 3
456

  
457
    get :index, :project_id => 1
458
    assert_response :success
459
    assert_select 'h2', text: l(:label_issue_plural)
460
    assert_select 'ul.queries a.selected', false
461
  end
462

  
463
  def test_default_query_should_be_unavailable_when_param_without_default_spacified
464
    project = Project.find(1)
465
    project.enable_module!(:default_custom_query)
466

  
467
    q = IssueQuery.create!(:name => "default_custom_query", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => nil)
468
    dq = ProjectsDefaultQuery.initialize_for(project.id)
469
    dq.query = q
470
    dq.save!
471

  
472
    @request.session[:user_id] = 3
473

  
474
    get :index, :project_id => 1, :without_default => 1
475
    assert_response :success
476
    assert_select 'h2', text: l(:label_issue_plural)
477
    assert_select 'ul.queries a.selected', false
478
  end
479

  
480
  def test_default_query_should_be_unavailable_when_filter_condition_op_and_f_spacified
481
    project = Project.find(1)
482
    project.enable_module!(:default_custom_query)
483

  
484
    q = IssueQuery.create!(:name => "default_custom_query", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => nil)
485
    dq = ProjectsDefaultQuery.initialize_for(project.id)
486
    dq.query = q
487
    dq.save!
488

  
489
    @request.session[:user_id] = 3
490

  
491
    get :index, :project_id => 1, :set_filter => 1, :op => 'op', :f => 'f'
492
    assert_response :success
493
    assert_select 'h2', text: l(:label_issue_plural)
494
    assert_select 'ul.queries a.selected', false
495
  end
496

  
434 497
  def test_index_should_omit_page_param_in_export_links
435 498
    get :index, :page => 2
436 499
    assert_response :success
test/unit/helpers/default_custom_query_helper_test.rb
1
# Redmine - project management software
2
# Copyright (C) 2006-2015  Jean-Philippe Lang
3
#
4
# This program is free software; you can redistribute it and/or
5
# modify it under the terms of the GNU General Public License
6
# as published by the Free Software Foundation; either version 2
7
# of the License, or (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17

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

  
20
class DefaultCustomQueryHelperTest < ActionView::TestCase
21
  include ApplicationHelper
22
  include DefaultCustomQueryHelper
23
  include Redmine::I18n
24
  include ERB::Util
25
  include Rails.application.routes.url_helpers
26

  
27
  fixtures :projects, :queries
28

  
29
  def setup
30
    super
31
    set_language_if_valid('en')
32
  end
33

  
34
  def test_options_for_selectable_queries
35
    project = Project.find(2)
36

  
37
    options = options_for_selectable_queries(project)
38

  
39
    assert_equal 2, options.count
40
    assert_includes options.first, l('default_custom_query.label_queries_for_all_projects')
41
    assert_includes options.first, IssueQuery.only_public.where(:project_id => nil).collect {|o| [o.name, o.id]}
42
    assert_includes options.last, l('default_custom_query.label_queries_for_current_project')
43
    assert_includes options.last, project.queries.only_public.collect {|o| [o.name, o.id]}
44
  end
45
end
test/unit/project_test.rb
1000 1000
      Project.uniq.visible.to_a
1001 1001
    end
1002 1002
  end
1003

  
1004
  def test_default_query
1005
    project = Project.find(1)
1006
    query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project)
1007
    ProjectsDefaultQuery.create!(:project_id => project.id, :query_id => query.id)
1008
    default_queries = ProjectsDefaultQuery.where(:project_id => project.id)
1009
    assert_equal query, project.default_query
1010
  end
1011

  
1012
  def test_init_default_query
1013
    project = Project.find(1)
1014
    query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project)
1015
    default_query = ProjectsDefaultQuery.create!(:project_id => project.id, :query_id => query.id)
1016
    assert_equal default_query, project.init_default_query
1017

  
1018
    default_query.destroy!
1019
    assert_kind_of ProjectsDefaultQuery, project.init_default_query
1020
    assert project.init_default_query.new_record?
1021
  end
1003 1022
end
test/unit/projects_default_query_test.rb
1
# Redmine - project management software
2
# Copyright (C) 2006-2016  Jean-Philippe Lang
3
#
4
# This program is free software; you can redistribute it and/or
5
# modify it under the terms of the GNU General Public License
6
# as published by the Free Software Foundation; either version 2
7
# of the License, or (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17

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

  
20
class ProjectsDefaultQueryTest < ActiveSupport::TestCase
21
  include Redmine::I18n
22

  
23
  fixtures :projects, :queries
24

  
25
  def setup
26
    User.current = nil
27
    @project = Project.find(1)
28
    @issue_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project)
29
  end
30

  
31
  def test_initialize_for_should_return_new_record_object
32
    ProjectsDefaultQuery.where(:project_id => @project.id).destroy_all
33
    default_query = ProjectsDefaultQuery.initialize_for(@project.id)
34

  
35
    assert_equal ProjectsDefaultQuery, default_query.class
36
    assert_equal @project.id, default_query.project_id
37
    assert_equal true, default_query.new_record?
38
  end
39

  
40
  def test_initialize_for_should_return_presisted_object
41
    ProjectsDefaultQuery.create!(:project_id => @project.id)
42
    default_query = ProjectsDefaultQuery.initialize_for(@project.id)
43

  
44
    assert_equal ProjectsDefaultQuery, default_query.class
45
    assert_equal @project.id, default_query.project_id
46
    assert_equal true, default_query.persisted?
47
  end
48

  
49
  def test_validate_query_must_be_selectable
50
    set_language_if_valid 'en'
51
    default_query = ProjectsDefaultQuery.initialize_for(@project.id)
52
    
53
    private_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => @project)
54
    default_query.query_id = private_query.id
55
    assert_not default_query.valid?
56
    assert_includes default_query.errors[:query_id], "is invalid"
57
    
58
    other_project_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => Project.find(2))
59
    default_query.query_id = other_project_query.id
60
    assert_not default_query.valid?
61
    assert_includes default_query.errors[:query_id], "is invalid"
62
  end
63

  
64
  def test_query_should_return_issue_query_object_when_associated_query_exist_and_visibility_public
65
    default_query = ProjectsDefaultQuery.create!(:project_id => @project.id, :query_id => @issue_query.id)
66

  
67
    assert_equal @issue_query, default_query.query
68

  
69
    @issue_query.update_attribute :project_id, nil
70
    default_query.reload
71

  
72
    assert_equal @issue_query, default_query.query
73
  end
74

  
75
  def test_query_should_return_nil_when_associated_query_exist_and_visibility_private
76
    default_query = ProjectsDefaultQuery.create!(:project_id => @project.id, :query_id => @issue_query.id)
77
   
78
    @issue_query.update_attribute :visibility, IssueQuery::VISIBILITY_PRIVATE
79
    default_query.reload
80

  
81
    assert_nil default_query.query
82
  end
83

  
84
  def test_query_should_return_nil_when_associated_query_exist_and_difarent_project_query
85
    default_query = ProjectsDefaultQuery.create!(:project_id => @project.id, :query_id => @issue_query.id)
86

  
87
    @issue_query.update_attribute :project_id, 2
88
    default_query.reload
89

  
90
    assert_nil default_query.query
91
  end
92

  
93
  def test_query_should_return_nil_when_associated_query_does_not_exist
94
    default_query = ProjectsDefaultQuery.create!(:project_id => @project.id, :query_id => @issue_query.id)
95

  
96
    @issue_query.destroy!
97
    default_query.reload
98

  
99
    assert_nil default_query.query
100
  end
101
end
test/unit/query_test.rb
999 999
    end
1000 1000
  end
1001 1001

  
1002
  def test_available_query_should_return_true_when_public_query_existed_on_project
1003
    project = Project.find(1)
1004
    IssueQuery.only_public.destroy_all
1005
    public_issue_query_on_project = IssueQuery.create!(:name => "q", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => project)
1006
    public_issue_query_nil_project = IssueQuery.create!(:name => "q", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => nil)
1007
    assert IssueQuery.available_query?(project.id, public_issue_query_on_project.id)
1008
    assert IssueQuery.available_query?(project.id, public_issue_query_nil_project.id)
1009
  end
1010

  
1011
  def test_available_query_should_return_false_when_public_query_does_not_existed_on_project
1012
    project = Project.find(1)
1013
    IssueQuery.only_public.destroy_all
1014
    private_issue_query_on_project = IssueQuery.create!(:name => "q", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => project)
1015
    public_issue_query_on_other = IssueQuery.create!(:name => "q", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => Project.find(2))
1016
    assert_equal false, IssueQuery.available_query?(project.id, private_issue_query_on_project.id)
1017
    assert_equal false, IssueQuery.available_query?(project.id, public_issue_query_on_other.id)
1018
  end
1019

  
1002 1020
  def test_default_columns
1003 1021
    q = IssueQuery.new
1004 1022
    assert q.columns.any?
(1-1/14)