summaryrefslogtreecommitdiffstats
path: root/test/helpers/version_helper_test.rb
blob: 09557a32ea3445d0f3dd9974e5522a2b263d8402 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# frozen_string_literal: true

# Redmine - project management software
# Copyright (C) 2006-2023  Jean-Philippe Lang
#
# 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.
#
# 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.
#
# 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.

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

class VersionsHelperTest < Redmine::HelperTest
  include Rails.application.routes.url_helpers

  fixtures :projects, :versions, :enabled_modules,
           :users, :members, :roles, :member_roles,
           :trackers, :projects_trackers,
           :issue_statuses

  def test_version_filtered_issues_path_sharing_none
    version = Version.new(:name => 'test', :sharing => 'none')
    version.project = Project.find(5)
    assert_match '/projects/private-child/issues?', version_filtered_issues_path(version)
  end

  def test_version_filtered_issues_path_sharing_descendants
    version = Version.new(:name => 'test', :sharing => 'descendants')
    version.project = Project.find(5)
    assert_match '/projects/private-child/issues?', version_filtered_issues_path(version)
  end

  def test_version_filtered_issues_path_sharing_hierarchy
    version = Version.new(:name => 'test', :sharing => 'hierarchy')
    version.project = Project.find(5)
    assert_match '/projects/private-child/issues?', version_filtered_issues_path(version)
  end

  def test_version_filtered_issues_path_sharing_tree
    version = Version.new(:name => 'test', :sharing => 'tree')
    version.project = Project.find(5)
    assert_match '/projects/ecookbook/issues?', version_filtered_issues_path(version)
  end

  def test_version_filtered_issues_path_sharing_tree_without_permission_to_root_project
    EnabledModule.where("name = 'issue_tracking' AND project_id = 1").delete_all
    version = Version.new(:name => 'test', :sharing => 'tree')
    version.project = Project.find(5)
    assert_no_match '/projects/ecookbook/issues?', version_filtered_issues_path(version)
    assert_match '/issues?', version_filtered_issues_path(version)
  end

  def test_version_filtered_issues_path_sharing_system
    version = Version.new(:name => 'test', :sharing => 'system')
    version.project = Project.find(5)
    assert_match /^\/issues\?/, version_filtered_issues_path(version)
  end

  def test_link_to_new_issue_should_return_link_to_add_issue
    version = Version.find(3)
    project = Project.find(1)
    User.current = User.find(1)

    # href should contain the following params:
    # fixed_version_id=3
    # tracker_id=1
    assert_select_in(
      link_to_new_issue(version, project),
      '[href=?]',
      '/projects/ecookbook/issues/new?back_url=' \
        '%2Fversions%2F3&issue%5Bfixed_version_id%5D=3&issue%5Btracker_id%5D=1',
      :text => 'New issue'
    )
  end

  def test_link_to_new_issue_should_return_nil_if_version_status_is_not_open
    # locked version
    version = Version.find(2)
    project = Project.find(1)
    User.current = User.find(1)

    assert_nil link_to_new_issue(version, project)
  end

  def test_link_to_new_issue_should_return_nil_if_user_does_not_have_permission_to_add_issue
    Role.find(1).remove_permission! :add_issues
    version = Version.find(3)
    project = Project.find(1)
    User.current = User.find(2)

    assert_nil link_to_new_issue(version, project)
  end

  def test_link_to_new_issue_should_return_nil_if_no_tracker_is_available_for_project
    trackers = Tracker::CORE_FIELDS - %w(fixed_version_id)
    # disable fixed_version_id field for all trackers
    Tracker.all.each do |tracker|
      tracker.core_fields = trackers
      tracker.save!
    end

    version = Version.find(3)
    project = Project.find(1)
    User.current = User.find(2)

    assert_nil link_to_new_issue(version, project)
  end

  def test_link_to_new_issue_should_take_into_account_user_permissions_on_fixed_version_id_field
    WorkflowPermission.delete_all
    WorkflowPermission.create!(:role_id => 1, :tracker_id => 1,
                               :old_status_id => 1,
                               :field_name => 'fixed_version_id',
                               :rule => 'readonly')
    version = Version.find(3)
    project = Project.find(1)
    User.current = User.find(2)

    # href should contain param tracker_id=2 because for tracker_id 1,
    # user has only readonly permissions on fixed_version_id
    assert_select_in(
      link_to_new_issue(version, project),
      '[href=?]',
      '/projects/ecookbook/issues/new?back_url=' \
        '%2Fversions%2F3&issue%5Bfixed_version_id%5D=3&issue%5Btracker_id%5D=2'
    )
  end
end