aboutsummaryrefslogtreecommitdiffstats
path: root/hyph
Commit message (Expand)AuthorAgeFilesLines
* Changed license headers and updated NOTICE file according to: http://www.apac...Jeremias Maerki2006-07-281-5/+6
* Updated the readme file for hyphenation; a few small corrections toSimon Pepping2005-09-281-40/+90
* PR:Andreas L. Delmelle2005-03-212-0/+111
* Moved hyphenation source files over to src/hyph.Jeremias Maerki2003-01-1522-84118/+0
* white-space and line-ending fixesWilliam Victor Mote2002-11-3019-418/+418
* Added czech hyphenation patterns from branchKeiron Liddle2002-06-281-0/+3692
* turkish hyphenation fileKeiron Liddle2002-04-151-0/+607
* portuguese hyphenation patternsKeiron Liddle2002-04-101-0/+226
* hungarian hyphenationKeiron Liddle2002-02-111-0/+2374
* added greek hyph infoKeiron Liddle2001-12-271-0/+382
* synced with branchKeiron Liddle2001-12-111-0/+4174
* added slovak hyphenation patternsKeiron Liddle2001-08-021-0/+2533
* Added Norwegian hyphenation based on Rune Kleveland's originalTore Engvig2001-06-071-0/+26075
* Submitted by: Alex Alishevskikh (alex@vismech.ru)Tore Engvig2001-06-071-0/+7751
* corrected danish hyphenation (Carlos Villegas)fotis2001-04-121-5/+3
* adds Danish hyphenation file (Carlos Villegas)fotis2001-04-122-1/+1197
* fixed: hexadecimal escape sequences in dutch hyphenation file converted to is...fotis2001-03-221-184/+197
* adds new dutch hyphenation pattern (submitted by Reinout Verkerk)fotis2001-03-052-1/+12822
* adding italian hyphenation file (thanks to Stephane Bline)fotis2001-01-192-1/+114
* explains language and country codesfotis2000-12-181-0/+11
* de (traditional German), de_DR(new German) hyphenation patterns (Carlos Ville...fotis2000-12-182-524/+2033
* hpyhenation pattern file for Finnish (by Jarno Elovirta)fotis2000-12-131-0/+355
* adds hyphenation (Carlos Villegas, Fotis Jannidis) and simple configuration ...fotis2000-12-128-0/+20288
#n319'>319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641
# frozen_string_literal: true

# Redmine - project management software
# Copyright (C) 2006-2017  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 AttachmentsControllerTest < Redmine::ControllerTest
  fixtures :users, :projects, :roles, :members, :member_roles,
           :enabled_modules, :issues, :trackers, :attachments,
           :versions, :wiki_pages, :wikis, :documents

  def setup
    User.current = nil
    set_fixtures_attachments_directory
  end

  def teardown
    set_tmp_attachments_directory
  end

  def test_show_diff
    ['inline', 'sbs'].each do |dt|
      # 060719210727_changeset_utf8.diff
      get :show, :params => {
          :id => 14,
          :type => dt
        }
      assert_response :success

      assert_equal 'text/html', @response.content_type
      assert_select 'th.filename', :text => /issues_controller.rb\t\(révision 1484\)/
      assert_select 'td.line-code', :text => /Demande créée avec succès/
    end
    set_tmp_attachments_directory
  end

  def test_show_diff_replace_cannot_convert_content
    with_settings :repositories_encodings => 'UTF-8' do
      ['inline', 'sbs'].each do |dt|
        # 060719210727_changeset_iso8859-1.diff
        get :show, :params => {
            :id => 5,
            :type => dt
          }
        assert_response :success

        assert_equal 'text/html', @response.content_type
        assert_select 'th.filename', :text => /issues_controller.rb\t\(r\?vision 1484\)/
        assert_select 'td.line-code', :text => /Demande cr\?\?e avec succ\?s/
      end
    end
    set_tmp_attachments_directory
  end

  def test_show_diff_latin_1
    with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
      ['inline', 'sbs'].each do |dt|
        # 060719210727_changeset_iso8859-1.diff
        get :show, :params => {
            :id => 5,
            :type => dt
          }
        assert_response :success

        assert_equal 'text/html', @response.content_type
        assert_select 'th.filename', :text => /issues_controller.rb\t\(révision 1484\)/
        assert_select 'td.line-code', :text => /Demande créée avec succès/
      end
    end
    set_tmp_attachments_directory
  end

  def test_show_should_save_diff_type_as_user_preference
    user1 = User.find(1)
    user1.pref[:diff_type] = nil
    user1.preference.save
    user = User.find(1)
    assert_nil user.pref[:diff_type]
    @request.session[:user_id] = 1 # admin

    get :show, :params => {
        :id => 5
      }
    assert_response :success
    user.reload
    assert_equal "inline", user.pref[:diff_type]

    get :show, :params => {
        :id => 5,
        :type => 'sbs'
      }
    assert_response :success
    user.reload
    assert_equal "sbs", user.pref[:diff_type]
  end

  def test_diff_show_filename_in_mercurial_export
    set_tmp_attachments_directory
    a = Attachment.new(:container => Issue.find(1),
                       :file => uploaded_test_file("hg-export.diff", "text/plain"),
                       :author => User.find(1))
    assert a.save
    assert_equal 'hg-export.diff', a.filename

    get :show, :params => {
        :id => a.id,
        :type => 'inline'
      }
    assert_response :success
    assert_equal 'text/html', @response.content_type
    assert_select 'th.filename', :text => 'test1.txt'
  end

  def test_show_text_file
    get :show, :params => {
        :id => 4
      }
    assert_response :success
    assert_equal 'text/html', @response.content_type
    set_tmp_attachments_directory
  end

  def test_show_text_file_utf_8
    set_tmp_attachments_directory
    a = Attachment.new(:container => Issue.find(1),
                       :file => uploaded_test_file("japanese-utf-8.txt", "text/plain"),
                       :author => User.find(1))
    assert a.save
    assert_equal 'japanese-utf-8.txt', a.filename

    get :show, :params => {
        :id => a.id
      }
    assert_response :success
    assert_equal 'text/html', @response.content_type
    assert_select 'tr#L1' do
      assert_select 'th.line-num', :text => '1'
      assert_select 'td', :text => /日本語/
    end
  end

  def test_show_text_file_replace_cannot_convert_content
    set_tmp_attachments_directory
    with_settings :repositories_encodings => 'UTF-8' do
      a = Attachment.new(:container => Issue.find(1),
                         :file => uploaded_test_file("iso8859-1.txt", "text/plain"),
                         :author => User.find(1))
      assert a.save
      assert_equal 'iso8859-1.txt', a.filename

      get :show, :params => {
          :id => a.id
        }
      assert_response :success
      assert_equal 'text/html', @response.content_type
      assert_select 'tr#L7' do
        assert_select 'th.line-num', :text => '7'
        assert_select 'td', :text => /Demande cr\?\?e avec succ\?s/
      end
    end
  end

  def test_show_text_file_latin_1
    set_tmp_attachments_directory
    with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
      a = Attachment.new(:container => Issue.find(1),
                         :file => uploaded_test_file("iso8859-1.txt", "text/plain"),
                         :author => User.find(1))
      assert a.save
      assert_equal 'iso8859-1.txt', a.filename

      get :show, :params => {
          :id => a.id
        }
      assert_response :success
      assert_equal 'text/html', @response.content_type
      assert_select 'tr#L7' do
        assert_select 'th.line-num', :text => '7'
        assert_select 'td', :text => /Demande créée avec succès/
      end
    end
  end

  def test_show_text_file_should_show_other_if_too_big
    @request.session[:user_id] = 2
    with_settings :file_max_size_displayed => 512 do
      Attachment.find(4).update_attribute :filesize, 754.kilobyte
      get :show, :params => {
          :id => 4
        }
      assert_response :success
      assert_equal 'text/html', @response.content_type
      assert_select '.nodata', :text => 'No preview available. Download the file instead.'
    end
    set_tmp_attachments_directory
  end

  def test_show_image
    @request.session[:user_id] = 2
    get :show, :params => {
        :id => 16
      }
    assert_response :success
    assert_equal 'text/html', @response.content_type
    assert_select 'img.filecontent', :src => attachments(:attachments_010).filename
  end

  def test_show_other_with_no_preview
    @request.session[:user_id] = 2
    get :show, :params => {
        :id => 6
      }
    assert_equal 'text/html', @response.content_type
    assert_select '.nodata', :text => 'No preview available. Download the file instead.'
    set_tmp_attachments_directory
  end

  def test_show_file_from_private_issue_without_permission
    get :show, :params => {
        :id => 15
      }
    assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fattachments%2F15'
    set_tmp_attachments_directory
  end

  def test_show_file_from_private_issue_with_permission
    @request.session[:user_id] = 2
    get :show, :params => {
        :id => 15
      }
    assert_response :success
    assert_select 'h2', :text => /private.diff/
    set_tmp_attachments_directory
  end

  def test_show_file_without_container_should_be_allowed_to_author
    set_tmp_attachments_directory
    attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)

    @request.session[:user_id] = 2
    get :show, :params => {
        :id => attachment.id
      }
    assert_response 200
  end

  def test_show_file_without_container_should_be_denied_to_other_users
    set_tmp_attachments_directory
    attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)

    @request.session[:user_id] = 3
    get :show, :params => {
        :id => attachment.id
      }
    assert_response 403
  end

  def test_show_issue_attachment_should_highlight_issues_menu_item
    get :show, :params => {
        :id => 4
      }
    assert_response :success
    assert_select '#main-menu a.issues.selected'
  end

  def test_show_invalid_should_respond_with_404
    get :show, :params => {
        :id => 999
      }
    assert_response 404
  end

  def test_show_renders_pagination
    get :show, :params => { :id => 5, :type => 'inline' }
    assert_response :success

    assert_select 'ul.pages li.next', :text => /next/i
    assert_select 'ul.pages li.previous', :text => /previous/i

    set_tmp_attachments_directory
  end

  def test_download_text_file
    get :download, :params => {
        :id => 4
      }
    assert_response :success
    assert_equal 'application/x-ruby', @response.content_type
    etag = @response.etag
    assert_not_nil etag

    @request.env["HTTP_IF_NONE_MATCH"] = etag
    get :download, :params => {
        :id => 4
      }
    assert_response 304

    set_tmp_attachments_directory
  end

  def test_download_js_file
    set_tmp_attachments_directory
    attachment = Attachment.create!(
      :file => mock_file_with_options(:original_filename => "hello.js", :content_type => "text/javascript"),
      :author_id => 2,
      :container => Issue.find(1)
    )

    get :download, :params => {
        :id => attachment.id
      }
    assert_response :success
    assert_equal 'text/javascript', @response.content_type
  end

  def test_download_version_file_with_issue_tracking_disabled
    Project.find(1).disable_module! :issue_tracking
    get :download, :params => {
        :id => 9
      }
    assert_response :success
  end

  def test_download_should_assign_content_type_if_blank
    Attachment.find(4).update_attribute(:content_type, '')

    get :download, :params => {
        :id => 4
      }
    assert_response :success
    assert_equal 'text/x-ruby', @response.content_type
    set_tmp_attachments_directory
  end

  def test_download_should_assign_better_content_type_than_application_octet_stream
    Attachment.find(4).update! :content_type => "application/octet-stream"

    get :download, :params => {
        :id => 4
      }
    assert_response :success
    assert_equal 'text/x-ruby', @response.content_type
    set_tmp_attachments_directory
  end

  def test_download_should_assign_application_octet_stream_if_content_type_is_not_determined
    get :download, :params => {
        :id => 22
      }
    assert_response :success
    assert_nil Redmine::MimeType.of(attachments(:attachments_022).filename)
    assert_equal 'application/octet-stream', @response.content_type
    set_tmp_attachments_directory
  end

  def test_download_missing_file
    get :download, :params => {
        :id => 2
      }
    assert_response 404
    set_tmp_attachments_directory
  end

  def test_download_should_be_denied_without_permission
    get :download, :params => {
        :id => 7
      }
    assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fattachments%2Fdownload%2F7'
    set_tmp_attachments_directory
  end

  if convert_installed?
    def test_thumbnail
      Attachment.clear_thumbnails
      @request.session[:user_id] = 2
      get :thumbnail, :params => {
          :id => 16
        }
      assert_response :success
      assert_equal 'image/png', response.content_type

      etag = @response.etag
      assert_not_nil etag

      @request.env["HTTP_IF_NONE_MATCH"] = etag
      get :thumbnail, :params => {
          :id => 16
        }
      assert_response 304
    end

    def test_thumbnail_for_pdf_should_be_png
      Attachment.clear_thumbnails
      @request.session[:user_id] = 2
      get :thumbnail, :params => {
          :id => 23   # ecookbook-gantt.pdf
        }
      assert_response :success
      assert_equal 'image/png', response.content_type
    end

    def test_thumbnail_should_not_exceed_maximum_size
      Redmine::Thumbnail.expects(:generate).with {|source, target, size| size == 800}

      @request.session[:user_id] = 2
      get :thumbnail, :params => {
          :id => 16,
          :size => 2000
        }
    end

    def test_thumbnail_should_round_size
      Redmine::Thumbnail.expects(:generate).with {|source, target, size| size == 300}

      @request.session[:user_id] = 2
      get :thumbnail, :params => {
          :id => 16,
          :size => 260
        }
    end

    def test_thumbnail_should_return_404_for_non_image_attachment
      @request.session[:user_id] = 2

      get :thumbnail, :params => {
          :id => 15
        }
      assert_response 404
    end

    def test_thumbnail_should_return_404_if_thumbnail_generation_failed
      Attachment.any_instance.stubs(:thumbnail).returns(nil)
      @request.session[:user_id] = 2

      get :thumbnail, :params => {
          :id => 16
        }
      assert_response 404
    end

    def test_thumbnail_should_be_denied_without_permission
      get :thumbnail, :params => {
          :id => 16
        }
      assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fattachments%2Fthumbnail%2F16'
    end
  else
    puts '(ImageMagick convert not available)'
  end

  def test_edit_all
    @request.session[:user_id] = 2
    get :edit_all, :params => {
        :object_type => 'issues',
        :object_id => '2'
      }
    assert_response :success

    assert_select 'form[action=?]', '/attachments/issues/2' do
      Issue.find(2).attachments.each do |attachment|
        assert_select "tr#attachment-#{attachment.id}"
      end

      assert_select 'tr#attachment-4' do
        assert_select 'input[name=?][value=?]', 'attachments[4][filename]', 'source.rb'
        assert_select 'input[name=?][value=?]', 'attachments[4][description]', 'This is a Ruby source file'
      end
    end

    # Link to the container in heading
    assert_select 'h2 a', :text => "Feature request #2"
  end

  def test_edit_all_with_invalid_container_class_should_return_404
    get :edit_all, :params => {
        :object_type => 'nuggets',
        :object_id => '3'
      }
    assert_response 404
  end

  def test_edit_all_with_invalid_object_should_return_404
    get :edit_all, :params => {
        :object_type => 'issues',
        :object_id => '999'
      }
    assert_response 404
  end

  def test_edit_all_for_object_that_is_not_visible_should_return_403
    get :edit_all, :params => {
        :object_type => 'issues',
        :object_id => '4'
      }
    assert_response 403
  end

  def test_update_all
    @request.session[:user_id] = 2
    patch :update_all, :params => {
        :object_type => 'issues',
        :object_id => '2',
        :attachments => {
          '1' => {
            :filename => 'newname.text',
            :description => ''
          },    
                  '4' => {
            :filename => 'newname.rb',
            :description => 'Renamed'
          },    
                
        }
      }

    assert_response 302
    attachment = Attachment.find(4)
    assert_equal 'newname.rb', attachment.filename
    assert_equal 'Renamed', attachment.description
  end

  def test_update_all_with_failure
    @request.session[:user_id] = 2
    patch :update_all, :params => {
        :object_type => 'issues',
        :object_id => '3',
        :attachments => {
          '1' => {
            :filename => '',
            :description => ''
          },    
                  '4' => {
            :filename => 'newname.rb',
            :description => 'Renamed'
          },    
                
        }
      }

    assert_response :success
    assert_select_error /file cannot be blank/i

    # The other attachment should not be updated
    attachment = Attachment.find(4)
    assert_equal 'source.rb', attachment.filename
    assert_equal 'This is a Ruby source file', attachment.description
  end

  def test_destroy_issue_attachment
    set_tmp_attachments_directory
    issue = Issue.find(3)
    @request.session[:user_id] = 2

    assert_difference 'issue.attachments.count', -1 do
      assert_difference 'Journal.count' do
        delete :destroy, :params => {
            :id => 1
          }
        assert_redirected_to '/projects/ecookbook'
      end
    end
    assert_nil Attachment.find_by_id(1)
    j = Journal.order('id DESC').first
    assert_equal issue, j.journalized
    assert_equal 'attachment', j.details.first.property
    assert_equal '1', j.details.first.prop_key
    assert_equal 'error281.txt', j.details.first.old_value
    assert_equal User.find(2), j.user
  end

  def test_destroy_wiki_page_attachment
    set_tmp_attachments_directory
    @request.session[:user_id] = 2
    assert_difference 'Attachment.count', -1 do
      delete :destroy, :params => {
          :id => 3
        }
      assert_response 302
    end
  end

  def test_destroy_project_attachment
    set_tmp_attachments_directory
    @request.session[:user_id] = 2
    assert_difference 'Attachment.count', -1 do
      delete :destroy, :params => {
          :id => 8
        }
      assert_response 302
    end
  end

  def test_destroy_version_attachment
    set_tmp_attachments_directory
    @request.session[:user_id] = 2
    assert_difference 'Attachment.count', -1 do
      delete :destroy, :params => {
          :id => 9
        }
      assert_response 302
    end
  end

  def test_destroy_version_attachment_with_issue_tracking_disabled
    Project.find(1).disable_module! :issue_tracking
    set_tmp_attachments_directory
    @request.session[:user_id] = 2
    assert_difference 'Attachment.count', -1 do
      delete :destroy, :params => {
          :id => 9
        }
      assert_response 302
    end
  end

  def test_destroy_without_permission
    set_tmp_attachments_directory
    assert_no_difference 'Attachment.count' do
      delete :destroy, :params => {
          :id => 3
        }
    end
    assert_response 302
    assert Attachment.find_by_id(3)
  end
end