513 lines
20 KiB
Ruby
513 lines
20 KiB
Ruby
require File.expand_path('../../test_helper', __FILE__)
|
|
|
|
# Re-raise errors caught by the controller.
|
|
# class HelpdeskMailerController; def rescue_action(e) raise e end; end
|
|
|
|
class IssuesControllerTest < ActionController::TestCase
|
|
fixtures :projects,
|
|
:users,
|
|
:roles,
|
|
:members,
|
|
:member_roles,
|
|
:issues,
|
|
:issue_statuses,
|
|
:versions,
|
|
:trackers,
|
|
:projects_trackers,
|
|
:issue_categories,
|
|
:enabled_modules,
|
|
:enumerations,
|
|
:attachments,
|
|
:workflows,
|
|
:custom_fields,
|
|
:custom_values,
|
|
:custom_fields_projects,
|
|
:custom_fields_trackers,
|
|
:time_entries,
|
|
:journals,
|
|
:journal_details,
|
|
:queries
|
|
|
|
RedmineHelpdesk::TestCase.create_fixtures(Redmine::Plugin.find(:redmine_contacts).directory + '/test/fixtures/', [:contacts,
|
|
:contacts_projects,
|
|
:contacts_issues,
|
|
:deals,
|
|
:notes,
|
|
:tags,
|
|
:taggings,
|
|
:queries])
|
|
|
|
RedmineHelpdesk::TestCase.create_fixtures(Redmine::Plugin.find(:redmine_contacts_helpdesk).directory + '/test/fixtures/', [:journal_messages,
|
|
:helpdesk_tickets])
|
|
|
|
include RedmineHelpdesk::TestHelper
|
|
|
|
def setup
|
|
RedmineHelpdesk::TestCase.prepare
|
|
ActionMailer::Base.deliveries.clear
|
|
|
|
@controller = IssuesController.new
|
|
@request = ActionController::TestRequest.new
|
|
@response = ActionController::TestResponse.new
|
|
User.current = nil
|
|
end
|
|
|
|
def test_show_issue
|
|
issue = Issue.find(1)
|
|
assert_not_nil issue.helpdesk_ticket
|
|
get :show, :id => 1
|
|
assert_response :success
|
|
end
|
|
|
|
def test_show_reply_to_for_issue_with_ticket
|
|
@request.session[:user_id] = 1
|
|
issue = Issue.find(1)
|
|
assert_not_nil issue.helpdesk_ticket
|
|
get :show, :id => issue.id
|
|
assert_response :success
|
|
assert_equal response.body.match('#content .contextual:first a:first').size, 1
|
|
assert_equal response.body.match('#content .contextual:last a:first').size, 1
|
|
end
|
|
|
|
def test_show_reply_to_for_issue_without_ticket
|
|
@request.session[:user_id] = 1
|
|
issue = Issue.find(3)
|
|
assert_nil issue.helpdesk_ticket
|
|
get :show, :id => issue.id
|
|
assert_response :success
|
|
assert_nil response.body.match('#content .contextual:first a:first')
|
|
assert_nil response.body.match('#content .contextual:last a:first')
|
|
end
|
|
|
|
def test_show_issue_with_uniq_cc_in_send_note
|
|
@request.session[:user_id] = 1
|
|
issue = Issue.find(1)
|
|
cc_contact = Contact.find(1)
|
|
issue.helpdesk_ticket.update_attributes(:cc_address => "#{cc_contact.primary_email},test@email.com")
|
|
issue.contacts << cc_contact
|
|
with_helpdesk_settings('send_note_by_default' => '1') do
|
|
assert_not_nil issue.helpdesk_ticket
|
|
get :show, :id => 1
|
|
assert_response :success
|
|
assert_select '#helpdesk_cc' do
|
|
assert_select '[value=?]', cc_contact.primary_email
|
|
assert_select '[value=?]', cc_contact.email_name, 0
|
|
assert_select '[value=?]', 'test@email.com'
|
|
end
|
|
end
|
|
ensure
|
|
issue.contacts = []
|
|
issue.helpdesk_ticket.update_attributes(:cc_address => '')
|
|
end
|
|
|
|
def test_get_index_with_filters
|
|
ticket = HelpdeskTicket.find(1)
|
|
ticket.save
|
|
|
|
@request.session[:user_id] = 1
|
|
get :index, :set_filter =>"1",
|
|
:f => ["ticket_reaction_time", ""],
|
|
:op => {"ticket_reaction_time" => ">="},
|
|
:v => {"ticket_reaction_time"=>["10"]},
|
|
:c => ["customer", "ticket_source", "customer_company", "helpdesk_ticket", "ticket_reaction_time", "ticket_first_response_time", "ticket_resolve_time"],
|
|
:project_id => "ecookbook"
|
|
assert_response :success
|
|
end
|
|
|
|
def test_get_vote_issues
|
|
ticket = HelpdeskTicket.find(1)
|
|
ticket.update_attributes(:vote => 1, :vote_comment => 'Good!')
|
|
|
|
@request.session[:user_id] = 1
|
|
get :index, :set_filter =>"1",
|
|
:f => ["vote", ""],
|
|
:op => { "vote" => "*" },
|
|
:c => ["tracker", "vote", "vote_comment"],
|
|
:project_id => "ecookbook"
|
|
assert_response :success
|
|
assert_select "table.list.issues td.vote span", /Just ok/
|
|
assert_select "table.list.issues td.vote_comment p", /Good/
|
|
end
|
|
|
|
def test_get_not_vote_issues
|
|
ticket = HelpdeskTicket.find(1)
|
|
ticket.update_attributes(:vote => 1, :vote_comment => 'Good!')
|
|
|
|
@request.session[:user_id] = 1
|
|
get :index, :set_filter =>"1",
|
|
:f => ["vote", ""],
|
|
:op => { "vote" => "!*" },
|
|
:c => ["tracker", "vote", "vote_comment"],
|
|
:project_id => "ecookbook"
|
|
assert_response :success
|
|
assert_select "table.list.issues td.vote", ""
|
|
end
|
|
|
|
def test_get_only_bad_voted_issues
|
|
ticket = HelpdeskTicket.find(1)
|
|
ticket.update_attributes(:vote => 1, :vote_comment => 'Good!')
|
|
ticket = HelpdeskTicket.find(2)
|
|
ticket.update_attributes(:vote => 0, :vote_comment => 'Bad!')
|
|
|
|
@request.session[:user_id] = 1
|
|
get :index, :set_filter =>"1",
|
|
:f => ["vote", ""],
|
|
:op => { "vote" => "=" },
|
|
:v => { "vote" => ["0"] },
|
|
:c => ["tracker", "vote", "vote_comment"],
|
|
:project_id => "ecookbook"
|
|
assert_response :success
|
|
assert_select "table.list.issues td.vote span", /Not good/
|
|
assert_select "table.list.issues td.vote_comment p", /Bad/
|
|
assert_select "table.list.issues td.vote span" do |votes|
|
|
votes.each do |vote|
|
|
assert_match /^((?!Just ok).)*/, vote.to_s
|
|
end
|
|
end
|
|
end
|
|
|
|
def test_get_tickets_as_csv
|
|
ticket = HelpdeskTicket.find(1)
|
|
ticket.update_attributes(:vote => 1, :vote_comment => 'Good!')
|
|
ticket = HelpdeskTicket.find(2)
|
|
ticket.update_attributes(:vote => 0, :vote_comment => 'Bad!')
|
|
|
|
@request.session[:user_id] = 1
|
|
get :index, :set_filter =>"1",
|
|
:f => ["vote", ""],
|
|
:op => { "vote" => "=" },
|
|
:v => { "vote"=>["1", "0"] },
|
|
:c => ["tracker", "vote", "vote_comment", "last_message", "last_message_date", "customer", "ticket_source", "customer_company", "helpdesk_ticket", "ticket_reaction_time", "ticket_first_response_time", "ticket_resolve_time"],
|
|
:project_id => "ecookbook"
|
|
get :index, :format => 'csv'
|
|
assert_response :success
|
|
assert_not_nil assigns(:issues)
|
|
assert_equal "text/csv; header=present", @response.content_type
|
|
assert @response.body.starts_with?("#,")
|
|
end
|
|
|
|
def test_should_send_note
|
|
user = User.find(1)
|
|
@request.session[:user_id] = 1
|
|
notes = "Hello, %%NAME%%\r\n Bye, %%NOTE_AUTHOR.FIRST_NAME%%"
|
|
# anonymous user
|
|
put :update,
|
|
:id => 1,
|
|
:helpdesk => {:is_send_mail => 1},
|
|
:issue => {:notes => notes}
|
|
assert_redirected_to :action => 'show', :id => '1'
|
|
j = Journal.order('id DESC').first
|
|
assert_equal "Hello, Ivan\r\n Bye, #{user.firstname}", j.notes
|
|
assert_equal 0, j.details.size
|
|
assert_equal User.find(1), j.user
|
|
|
|
mail = last_ticket_mail
|
|
assert_mail_body_match "Hello, Ivan\r\n Bye, #{user.firstname}", mail
|
|
assert_equal Issue.find(1).customer.primary_email, mail.to.first
|
|
end
|
|
|
|
def test_should_calculate_metrics
|
|
@request.session[:user_id] = 1
|
|
|
|
issue = Issue.find(1)
|
|
issue.journals.destroy_all
|
|
|
|
put :update,
|
|
:id => 1,
|
|
:helpdesk => {:is_send_mail => 1},
|
|
:issue => {:notes => 'Response to customer'}
|
|
|
|
issue.reload
|
|
assert_not_nil issue.helpdesk_ticket.first_response_time
|
|
assert (issue.helpdesk_ticket.reaction_time - issue.helpdesk_ticket.first_response_time) < 100
|
|
end
|
|
|
|
def test_should_forward_note
|
|
user = User.find(1)
|
|
@request.session[:user_id] = 1
|
|
notes = "Hello, %%NAME%%\r\n Bye, %%NOTE_AUTHOR.FIRST_NAME%%"
|
|
# anonymous user
|
|
put :update,
|
|
:id => 1,
|
|
:helpdesk => {:is_send_mail => 1},
|
|
:journal_message => {:to_address => ["jsmith@somenet.foo"]},
|
|
:issue => {:notes => notes}
|
|
assert_redirected_to :action => 'show', :id => '1'
|
|
j = Journal.order('id DESC').first
|
|
assert_match "Hello, Ivan\r\n Bye, #{user.firstname}", j.notes
|
|
assert_equal 0, j.details.size
|
|
assert_equal User.find(1), j.user
|
|
assert_equal Contact.find(4), j.journal_message.contact
|
|
|
|
mail = last_ticket_mail
|
|
assert_mail_body_match "Hello, Ivan\r\n Bye, #{user.firstname}", mail
|
|
assert_equal "jsmith@somenet.foo", mail.to.first
|
|
end
|
|
|
|
def test_should_send_note_with_bcc
|
|
issue = Issue.find(1)
|
|
contact = Contact.find(1)
|
|
user = User.find(1)
|
|
issue.helpdesk_ticket = HelpdeskTicket.new(:customer => contact,
|
|
:issue => issue,
|
|
:from_address => contact.primary_email,
|
|
:ticket_date => Time.now)
|
|
issue.save!
|
|
|
|
@request.session[:user_id] = 1
|
|
notes = "Hello, %%NAME%%\r\n Bye, %%NOTE_AUTHOR.FIRST_NAME%%"
|
|
# anonymous user
|
|
put :update,
|
|
:id => 1,
|
|
:helpdesk => {:is_send_mail => 1},
|
|
:journal_message => {:bcc_address => ["mail1@mail.com", "mail2@mail.com"]},
|
|
:issue => {:notes => notes}
|
|
assert_redirected_to :action => 'show', :id => '1'
|
|
j = Journal.order('id DESC').first
|
|
assert_equal "Hello, Ivan\r\n Bye, #{user.firstname}", j.notes
|
|
assert_equal 0, j.details.size
|
|
assert_equal User.find(1), j.user
|
|
|
|
mail = last_ticket_mail
|
|
assert_mail_body_match "Hello, Ivan\r\n Bye, #{user.firstname}", mail
|
|
assert_equal Issue.find(1).customer.primary_email, mail.to.first
|
|
assert_equal ["mail1@mail.com", "mail2@mail.com"].sort, mail.bcc.sort
|
|
end
|
|
|
|
def test_should_not_send_note_with_cc
|
|
issue = Issue.find(1)
|
|
contact = Contact.find(1)
|
|
user = User.find(1)
|
|
issue.helpdesk_ticket = HelpdeskTicket.new(:customer => contact,
|
|
:issue => issue,
|
|
:from_address => contact.primary_email,
|
|
:ticket_date => Time.now)
|
|
issue.save!
|
|
|
|
@request.session[:user_id] = 1
|
|
notes = "Hello, %%NAME%%\r\n Bye, %%NOTE_AUTHOR.FIRST_NAME%%"
|
|
# anonymous user
|
|
put :update,
|
|
:id => 1,
|
|
:helpdesk => {:is_send_mail => 1},
|
|
:journal_message => {:cc_address => ["mail3@mail.com", "mail4@mail.com"]},
|
|
:issue => {:notes => notes}
|
|
assert_redirected_to :action => 'show', :id => '1'
|
|
j = Journal.order('id DESC').first
|
|
assert_equal "Hello, Ivan\r\n Bye, #{user.firstname}", j.notes
|
|
assert_equal 0, j.details.size
|
|
assert_equal User.find(1), j.user
|
|
|
|
mail = last_ticket_mail
|
|
assert_mail_body_match "Hello, Ivan\r\n Bye, #{user.firstname}", mail
|
|
assert_equal Issue.find(1).customer.primary_email, mail.to.first
|
|
assert_equal ["mail3@mail.com", "mail4@mail.com"].sort, mail.cc.sort
|
|
assert mail.bcc.empty?, "Bcc should be empty"
|
|
end
|
|
|
|
def test_should_send_note_with_attachments
|
|
issue = Issue.find(1)
|
|
contact = Contact.find(1)
|
|
user = User.find(1)
|
|
issue.helpdesk_ticket = HelpdeskTicket.new(:customer => contact,
|
|
:issue => issue,
|
|
:from_address => contact.primary_email,
|
|
:ticket_date => Time.now)
|
|
issue.save!
|
|
|
|
@request.session[:user_id] = user.id
|
|
notes = "Hello, %%NAME%%\r\n Bye, %%NOTE_AUTHOR.FIRST_NAME%%"
|
|
# anonymous user
|
|
put :update,
|
|
:id => 1,
|
|
:helpdesk => {:is_send_mail => 1},
|
|
:issue => {:notes => notes},
|
|
:attachments => {'1' => {'file' => helpdesk_uploaded_file('attachment.zip', 'application/octet-stream')}}
|
|
mail = last_ticket_mail
|
|
assert_not_nil mail.attachments
|
|
assert_equal 3855, mail.attachments.first.decoded.size
|
|
end
|
|
|
|
def test_should_send_private_note_with_attachments
|
|
issue = Issue.find(1)
|
|
contact = Contact.find(1)
|
|
user = User.find(1)
|
|
issue.helpdesk_ticket = HelpdeskTicket.new(:customer => contact,
|
|
:issue => issue,
|
|
:from_address => contact.primary_email,
|
|
:ticket_date => Time.now)
|
|
issue.save!
|
|
|
|
@request.session[:user_id] = user.id
|
|
notes = "Hello, %%NAME%%\r\n Bye, %%NOTE_AUTHOR.FIRST_NAME%%"
|
|
# anonymous user
|
|
put :update,
|
|
:id => 1,
|
|
:helpdesk => { :is_send_mail => 1 },
|
|
:issue => { :notes => notes, :private_notes => 1 },
|
|
:attachments => { '1' => { 'file' => helpdesk_uploaded_file('attachment.zip', 'application/octet-stream') } }
|
|
assert_equal issue.reload.journals.last.private_notes, true
|
|
mail = last_ticket_mail
|
|
assert_not_nil mail.attachments
|
|
assert_equal 3855, mail.attachments.first.decoded.size
|
|
end
|
|
|
|
def test_should_send_note_issue_from_anonymous
|
|
issue = Issue.find(1)
|
|
issue.author_id = 6
|
|
contact = Contact.find(1)
|
|
user = User.find(1)
|
|
issue.helpdesk_ticket = HelpdeskTicket.new(:customer => contact,
|
|
:issue => issue,
|
|
:from_address => contact.primary_email,
|
|
:ticket_date => Time.now)
|
|
issue.save!
|
|
|
|
@request.session[:user_id] = 1
|
|
notes = "Hello, %%NAME%%\r\n Bye, %%NOTE_AUTHOR.FIRST_NAME%%"
|
|
# anonymous user
|
|
put :update,
|
|
:id => 1,
|
|
:helpdesk => {:is_send_mail => 1},
|
|
:issue => { :notes => notes }
|
|
assert_redirected_to :action => 'show', :id => '1'
|
|
j = Journal.order('id DESC').first
|
|
assert_equal "Hello, Ivan\r\n Bye, #{user.firstname}", j.notes
|
|
assert_equal 0, j.details.size
|
|
assert_equal User.find(1), j.user
|
|
|
|
mail = last_ticket_mail
|
|
assert_mail_body_match "Hello, Ivan\r\n Bye, #{user.firstname}", mail
|
|
assert_equal Issue.find(1).customer.primary_email, mail.to.first
|
|
end
|
|
|
|
def test_should_create_ticket
|
|
@request.session[:user_id] = 1
|
|
project = Project.find('ecookbook')
|
|
assert_difference 'HelpdeskTicket.count' do
|
|
post :create,
|
|
:issue => {:tracker_id => 3, :subject => "test", :status_id => 2, :priority_id => 5,
|
|
:helpdesk_ticket_attributes => {:contact_id => 1,
|
|
:source => "0",
|
|
:ticket_date => "2013-01-01 01:01:01 +0400"}},
|
|
:project_id => project
|
|
end
|
|
assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
|
|
assert_not_nil Issue.last.helpdesk_ticket
|
|
end
|
|
|
|
def test_should_send_auto_answer
|
|
@request.session[:user_id] = 1
|
|
project = Project.find('ecookbook')
|
|
assert_difference 'HelpdeskTicket.count' do
|
|
post :create,
|
|
:issue => {:tracker_id => 3, :subject => "test", :status_id => 2,
|
|
:priority_id => 5, :description => "test description",
|
|
:helpdesk_ticket_attributes => {:contact_id => 1,
|
|
:source => "0",
|
|
:ticket_date => "2013-01-01 01:01:01 +0400"}},
|
|
:helpdesk_send_as => HelpdeskTicket::SEND_AS_NOTIFICATION,
|
|
:project_id => 1
|
|
end
|
|
mail = last_ticket_mail
|
|
assert_mail_body_match "We hereby confirm that we have received your message", mail
|
|
end
|
|
|
|
def test_should_send_initial_message
|
|
with_helpdesk_settings("helpdesk_first_answer_subject" => 'Message for ticket id: #{%ticket.id%}') do
|
|
@request.session[:user_id] = 1
|
|
project = Project.find('ecookbook')
|
|
assert_difference 'HelpdeskTicket.count' do
|
|
post :create,
|
|
:issue => {:tracker_id => 3, :subject => "test", :status_id => 2,
|
|
:priority_id => 5, :description => "test initial description",
|
|
:helpdesk_ticket_attributes => {:contact_id => 1,
|
|
:source => "0",
|
|
:ticket_date => "2013-01-01 01:01:01 +0400"}},
|
|
:helpdesk_send_as => HelpdeskTicket::SEND_AS_MESSAGE,
|
|
:project_id => 1
|
|
end
|
|
mail = last_ticket_mail
|
|
assert_mail_body_match "test initial description", mail
|
|
assert_equal mail.subject, "Message for ticket id: \##{Issue.maximum(:id)}"
|
|
assert_equal HelpdeskTicket.order('id ASC').last.message_id, mail.message_id
|
|
assert_equal false, HelpdeskTicket.order('id ASC').last.is_incoming
|
|
end
|
|
end
|
|
|
|
def test_should_not_create_ticket_for_invalid_issue
|
|
@request.session[:user_id] = 1
|
|
project = Project.find('ecookbook')
|
|
ActionMailer::Base.deliveries.clear
|
|
put :update,
|
|
:id => 1,
|
|
:helpdesk => {:is_send_mail => 1},
|
|
:issue => { :notes => 'Test notes', :subject => '' }
|
|
assert_equal ActionMailer::Base.deliveries, []
|
|
end
|
|
|
|
def test_should_not_create_ticket_with_empty_customer
|
|
@request.session[:user_id] = 1
|
|
project = Project.find('ecookbook')
|
|
assert_no_difference 'HelpdeskTicket.count' do
|
|
post :create,
|
|
:issue => {:tracker_id => 3, :subject => "Test subject", :status_id => 2, :priority_id => 5,
|
|
:helpdesk_ticket_attributes => {:source => "0",
|
|
:contact_id => '',
|
|
:ticket_date => "2013-01-01 01:01:01 +0400"}},
|
|
:project_id => project
|
|
if ActiveRecord::VERSION::MAJOR >= 4
|
|
assert_select 'div#errorExplanation', /customer cannot be blank/i
|
|
else
|
|
assert_error_tag :content => /helpdesk_ticket.customer can't be blank/i
|
|
end
|
|
end
|
|
end
|
|
|
|
def test_put_update_form
|
|
if ActiveRecord::VERSION::MAJOR < 4
|
|
@request.session[:user_id] = 1
|
|
issue = Issue.find(1)
|
|
ContactsSetting["helpdesk_tracker", issue.project.id] = 2
|
|
xhr :put, :update_form,
|
|
:issue => {:tracker_id => 2,
|
|
:helpdesk_ticket_attributes => {:contact_id => 3,
|
|
:source => HelpdeskTicket::HELPDESK_PHONE_SOURCE}},
|
|
:helpdesk_send_as => HelpdeskTicket::SEND_AS_MESSAGE,
|
|
:project_id => issue.project
|
|
assert_response :success
|
|
assert_equal 'text/javascript', response.content_type
|
|
assert_template 'update_form'
|
|
|
|
|
|
issue = assigns(:issue)
|
|
assert_kind_of Issue, issue
|
|
assert_equal 3, issue.helpdesk_ticket.customer.id
|
|
assert_equal HelpdeskTicket::HELPDESK_PHONE_SOURCE, issue.helpdesk_ticket.source
|
|
end
|
|
end
|
|
|
|
def test_should_set_from_field_for_ticket
|
|
@request.session[:user_id] = 1
|
|
project = Project.find('ecookbook')
|
|
contact = Contact.find(1)
|
|
assert_difference 'HelpdeskTicket.count' do
|
|
post :create,
|
|
:issue => {:tracker_id => 3, :subject => "test_for_field", :status_id => 2, :priority_id => 5,
|
|
:helpdesk_ticket_attributes => {:contact_id => contact.id,
|
|
:source => "0",
|
|
:ticket_date => "2013-01-01 01:01:01 +0400"}},
|
|
:project_id => project
|
|
end
|
|
assert_not_nil Issue.last.helpdesk_ticket
|
|
assert_equal Issue.last.helpdesk_ticket.from_address, contact.primary_email
|
|
end
|
|
|
|
private
|
|
|
|
def last_ticket_mail
|
|
ActionMailer::Base.deliveries.detect{|m| m["X-Redmine-Ticket-ID"]}
|
|
end
|
|
|
|
end
|