view test/integration/issues_test.rb @ 1082:997f6d7738f7 bug_531

In repo controller entry action, show the page for the file even if it's binary (so user still has access to history etc links). This makes it possible to use the entry action as the default when a file is clicked on
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Thu, 22 Nov 2012 18:04:17 +0000
parents cbb26bc654de
children 433d4f72a19b
line wrap: on
line source
# Redmine - project management software
# Copyright (C) 2006-2011  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 IssuesTest < ActionController::IntegrationTest
  fixtures :projects,
           :users,
           :roles,
           :members,
           :trackers,
           :projects_trackers,
           :enabled_modules,
           :issue_statuses,
           :issues,
           :enumerations,
           :custom_fields,
           :custom_values,
           :custom_fields_trackers

  # create an issue
  def test_add_issue
    log_user('jsmith', 'jsmith')
    get 'projects/1/issues/new', :tracker_id => '1'
    assert_response :success
    assert_template 'issues/new'

    post 'projects/1/issues', :tracker_id => "1",
                                 :issue => { :start_date => "2006-12-26",
                                             :priority_id => "4",
                                             :subject => "new test issue",
                                             :category_id => "",
                                             :description => "new issue",
                                             :done_ratio => "0",
                                             :due_date => "",
                                             :assigned_to_id => "" },
                                 :custom_fields => {'2' => 'Value for field 2'}
    # find created issue
    issue = Issue.find_by_subject("new test issue")
    assert_kind_of Issue, issue

    # check redirection
    assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
    follow_redirect!
    assert_equal issue, assigns(:issue)

    # check issue attributes
    assert_equal 'jsmith', issue.author.login
    assert_equal 1, issue.project.id
    assert_equal 1, issue.status.id
  end

  # add then remove 2 attachments to an issue
  def test_issue_attachments
    log_user('jsmith', 'jsmith')
    set_tmp_attachments_directory

    put 'issues/1',
         :notes => 'Some notes',
         :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'This is an attachment'}}
    assert_redirected_to "/issues/1"

    # make sure attachment was saved
    attachment = Issue.find(1).attachments.find_by_filename("testfile.txt")
    assert_kind_of Attachment, attachment
    assert_equal Issue.find(1), attachment.container
    assert_equal 'This is an attachment', attachment.description
    # verify the size of the attachment stored in db
    #assert_equal file_data_1.length, attachment.filesize
    # verify that the attachment was written to disk
    assert File.exist?(attachment.diskfile)

    # remove the attachments
    Issue.find(1).attachments.each(&:destroy)
    assert_equal 0, Issue.find(1).attachments.length
  end

  def test_other_formats_links_on_get_index
    get '/projects/ecookbook/issues'

    %w(Atom PDF CSV).each do |format|
      assert_tag :a, :content => format,
                     :attributes => { :href => "/projects/ecookbook/issues.#{format.downcase}",
                                      :rel => 'nofollow' }
    end
  end

  def test_other_formats_links_on_post_index_without_project_id_in_url
    post '/issues', :project_id => 'ecookbook'

    %w(Atom PDF CSV).each do |format|
      assert_tag :a, :content => format,
                     :attributes => { :href => "/projects/ecookbook/issues.#{format.downcase}",
                                      :rel => 'nofollow' }
    end
  end

  def test_pagination_links_on_get_index
    Setting.per_page_options = '2'
    get '/projects/ecookbook/issues'

    assert_tag :a, :content => '2',
                   :attributes => { :href => '/projects/ecookbook/issues?page=2' }

  end

  def test_pagination_links_on_post_index_without_project_id_in_url
    Setting.per_page_options = '2'
    post '/issues', :project_id => 'ecookbook'

    assert_tag :a, :content => '2',
                   :attributes => { :href => '/projects/ecookbook/issues?page=2' }

  end

  def test_issue_with_user_custom_field
    @field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true, :trackers => Tracker.all)
    Role.anonymous.add_permission! :add_issues, :edit_issues
    users = Project.find(1).users
    tester = users.first

    # Issue form
    get '/projects/ecookbook/issues/new'
    assert_response :success
    assert_tag :select,
      :attributes => {:name => "issue[custom_field_values][#{@field.id}]"},
      :children => {:count => (users.size + 1)}, # +1 for blank value
      :child => {
        :tag => 'option',
        :attributes => {:value => tester.id.to_s},
        :content => tester.name
      }

    # Create issue
    assert_difference 'Issue.count' do
      post '/projects/ecookbook/issues',
        :issue => {
          :tracker_id => '1',
          :priority_id => '4',
          :subject => 'Issue with user custom field',
          :custom_field_values => {@field.id.to_s => users.first.id.to_s}
        }
    end
    issue = Issue.first(:order => 'id DESC')
    assert_response 302

    # Issue view
    follow_redirect!
    assert_tag :th,
      :content => /Tester/,
      :sibling => {
        :tag => 'td',
        :content => tester.name
      }
    assert_tag :select,
      :attributes => {:name => "issue[custom_field_values][#{@field.id}]"},
      :children => {:count => (users.size + 1)}, # +1 for blank value
      :child => {
        :tag => 'option',
        :attributes => {:value => tester.id.to_s, :selected => 'selected'},
        :content => tester.name
      }

    # Update issue
    new_tester = users[1]
    assert_difference 'Journal.count' do
      put "/issues/#{issue.id}",
        :notes => 'Updating custom field',
        :issue => {
          :custom_field_values => {@field.id.to_s => new_tester.id.to_s}
        }
    end
    assert_response 302

    # Issue view
    follow_redirect!
    assert_tag :content => 'Tester',
      :ancestor => {:tag => 'ul', :attributes => {:class => /details/}},
      :sibling => {
        :content => tester.name,
        :sibling => {
          :content => new_tester.name
        }
      }
  end
end