257 lines
9.9 KiB
Ruby
257 lines
9.9 KiB
Ruby
# encoding: utf-8
|
|
#
|
|
# This file is a part of Redmine CRM (redmine_contacts) plugin,
|
|
# customer relationship management plugin for Redmine
|
|
#
|
|
# Copyright (C) 2010-2018 RedmineUP
|
|
# http://www.redmineup.com/
|
|
#
|
|
# redmine_contacts 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 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# redmine_contacts 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 redmine_contacts. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
require File.expand_path('../../test_helper', __FILE__)
|
|
|
|
class ContactTest < ActiveSupport::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
|
|
fixtures :email_addresses if ActiveRecord::VERSION::MAJOR >= 4
|
|
|
|
RedmineContacts::TestCase.create_fixtures(Redmine::Plugin.find(:redmine_contacts).directory + '/test/fixtures/', [:contacts,
|
|
:contacts_projects,
|
|
:contacts_issues,
|
|
:deals,
|
|
:notes,
|
|
:tags,
|
|
:taggings,
|
|
:queries])
|
|
|
|
def setup
|
|
RedmineContacts::TestCase.prepare
|
|
end
|
|
|
|
def test_find_by_emails_first_email
|
|
emails = ['marat@mail.ru', 'domoway@mail.ru']
|
|
assert_equal 2, Contact.find_by_emails(emails).count
|
|
end
|
|
|
|
def test_find_by_emails_second_email
|
|
emails = ['marat@mail.com']
|
|
assert_equal 1, Contact.find_by_emails(emails).count
|
|
end
|
|
|
|
def test_scope_live_search
|
|
assert_equal 4, Contact.live_search('john').first.try(:id)
|
|
end
|
|
|
|
def test_visible_public_contacts
|
|
project = Project.find(1)
|
|
contact = Contact.find(1)
|
|
user = User.find(1) # John Smith
|
|
|
|
contact.visibility = Contact::VISIBILITY_PUBLIC
|
|
contact.save!
|
|
|
|
assert contact.visible?(user)
|
|
end
|
|
|
|
def test_visible_scope_for_non_member_without_view_contacts_permissions
|
|
# Non member user should not see issues without permission
|
|
Role.non_member.remove_permission!(:view_contacts)
|
|
user = User.find(9)
|
|
assert user.projects.empty?
|
|
contacts = Contact.visible(user).all
|
|
assert contacts.empty?
|
|
assert_visibility_match user, contacts
|
|
end
|
|
|
|
def test_visible_scope_for_member
|
|
user = User.find(2)
|
|
# User should see issues of projects for which he has view_issues permissions only
|
|
role = Role.create!(:name => 'CRM', :permissions => [:view_contacts])
|
|
Role.non_member.remove_permission!(:view_contacts)
|
|
project = Project.find(2)
|
|
Contact.delete_all
|
|
Member.where(:user_id => user).delete_all
|
|
member = Member.create!(:principal => user, :project_id => project.id, :role_ids => [role.id])
|
|
contact = Contact.create!(:project => project, :first_name => 'UnitTest', :visibility => Contact::VISIBILITY_PUBLIC)
|
|
|
|
contacts = Contact.visible(user).all
|
|
|
|
assert contacts.any?
|
|
assert_nil contacts.detect { |c| c.project.id != project.id }
|
|
# assert_nil contacts.detect {|c| c.is_private?}
|
|
assert_visibility_match user, contacts
|
|
|
|
contact.visibility = Contact::VISIBILITY_PRIVATE
|
|
contact.save!
|
|
contacts = Contact.visible(user).all
|
|
assert contacts.blank?, 'Private contacts are visible'
|
|
|
|
assert user.allowed_to?(:view_contacts, project)
|
|
contact.visibility = Contact::VISIBILITY_PROJECT
|
|
contact.save!
|
|
contacts = Contact.visible(user).all
|
|
assert contacts.any?, "Project contacts doesn't visible with permissions"
|
|
|
|
role.remove_permission!(:view_contacts)
|
|
user.reload
|
|
contact.visibility = Contact::VISIBILITY_PROJECT
|
|
contact.save!
|
|
contacts = project.contacts.visible(user).all
|
|
assert contacts.blank?, 'Contacts visible for user without view_contacts permissions'
|
|
|
|
role.add_permission!(:view_private_contacts)
|
|
user.reload
|
|
contact.visibility = Contact::VISIBILITY_PRIVATE
|
|
contact.save!
|
|
contacts = Contact.visible(user).all
|
|
assert contacts.any?, 'Contacts note visible for user with view_private_contacts permissions'
|
|
end
|
|
|
|
def test_create_should_send_email_notification
|
|
ActionMailer::Base.deliveries.clear
|
|
contact = Contact.new(:first_name => 'New contact', :project => Project.find(1))
|
|
|
|
with_settings :notified_events => %w(crm_contact_added) do
|
|
assert contact.save
|
|
end
|
|
assert_equal 1, ActionMailer::Base.deliveries.size
|
|
end
|
|
|
|
def assert_visibility_match(user, contacts)
|
|
assert_equal contacts.collect(&:id).sort, Contact.all.select { |contact| contact.visible?(user) }.collect(&:id).sort
|
|
end
|
|
|
|
def test_that_contact_with_email_containing_plus_is_valid
|
|
contact = Contact.find(1)
|
|
contact.email = 'foo+bar-baz@email.example'
|
|
assert contact.valid?
|
|
end
|
|
|
|
def test_if_email_with_local_domain_is_allowed
|
|
contact = Contact.find(1)
|
|
contact.email = 'email@mydomain'
|
|
assert contact.valid?
|
|
end
|
|
|
|
def test_special_characters_in_email_local_part
|
|
contact = Contact.find(1)
|
|
contact.email = "#!$%&'{}@email.example"
|
|
assert contact.valid?
|
|
end
|
|
|
|
def test_email_containing_unicode_characters
|
|
contact = Contact.find(1)
|
|
contact.email = 'денис@пример.рф'
|
|
assert contact.valid?
|
|
end
|
|
|
|
def test_that_email_can_include_ip_address
|
|
contact = Contact.find(1)
|
|
contact.email = 'foo@[IPv6:2001:db8::1]'
|
|
assert contact.valid?
|
|
end
|
|
|
|
def test_contact_with_multiple_email_addresses
|
|
contact = Contact.find(1)
|
|
contact.email = 'foo@email.example,bar@email.example'
|
|
assert contact.valid?
|
|
end
|
|
|
|
def test_if_email_without_at_sign_is_invalid
|
|
contact = Contact.find(1)
|
|
contact.email = 'hello'
|
|
assert contact.invalid?
|
|
end
|
|
|
|
def test_email_transformation_on_create
|
|
assert_equal 'test@test.com', Contact.create!(:project => Project.find(1), :first_name => 'Test', :email => ' test@test.com ').email
|
|
assert_equal 'test@test.com,foo@bar.com', Contact.create!(:project => Project.find(1), :first_name => 'Test', :email => ' test@test.com , foo@bar.com ').email
|
|
end
|
|
|
|
def test_duplicates_no_middle_name
|
|
project = Project.find(1)
|
|
User.current = User.find(1)
|
|
|
|
contact1 = Contact.create!(:project => project, :first_name => 'Kristiyan', :middle_name => 'Stoyanov')
|
|
contact2 = Contact.create!(:project => project, :first_name => 'Kristiyan', :middle_name => '')
|
|
assert contact2.duplicates.include?(contact1)
|
|
assert contact1.duplicates.include?(contact2)
|
|
end
|
|
|
|
def test_duplicates_by_just_email
|
|
project = Project.find(1)
|
|
User.current = User.find(1)
|
|
|
|
contact1 = Contact.create!(:project => project, :first_name => 'Kristiyan', :email => 'test@test.com')
|
|
contact2 = Contact.create!(:project => project, :first_name => 'Peter', :email => 'test@test.com')
|
|
assert contact2.duplicates.include?(contact1)
|
|
assert contact1.duplicates.include?(contact2)
|
|
end
|
|
|
|
def test_duplicates_no_middle_name_with_last_name
|
|
project = Project.find(1)
|
|
User.current = User.find(1)
|
|
|
|
contact1 = Contact.create!(:project => project, :first_name => 'Kristiyan', :middle_name => '', :last_name => 'Stoyanov')
|
|
contact2 = Contact.create!(:project => project, :first_name => 'Kristiyan', :middle_name => 'Petrov', :last_name => 'Stoyanov')
|
|
assert contact1.duplicates.include?(contact2)
|
|
assert contact2.duplicates.include?(contact1)
|
|
end
|
|
|
|
def test_duplicates_no_middle_name_with_last_name_and_email
|
|
project = Project.find(1)
|
|
User.current = User.find(1)
|
|
|
|
contact1 = Contact.create!(:project => project, :first_name => 'Kristiyan', :last_name => 'Stoyanov', :email => 'test@test.com')
|
|
contact2 = Contact.create!(:project => project, :first_name => 'Kristiyan', :middle_name => 'Petrov', :last_name => 'Stoyanov', :email => 'test@test.com')
|
|
assert contact1.duplicates.include?(contact2)
|
|
assert contact2.duplicates.include?(contact1)
|
|
end
|
|
|
|
def test_multiple_duplicates_different_criteria
|
|
project = Project.find(1)
|
|
User.current = User.find(1)
|
|
|
|
contact1 = Contact.create!(:project => project, :first_name => 'Kristiyan', :middle_name => '', :email => 'test@test.com')
|
|
contact2 = Contact.create!(:project => project, :first_name => 'Kristiyan', :middle_name => '', :last_name => 'Stoyanov', :email => 'test@test.com')
|
|
contact3 = Contact.create!(:project => project, :first_name => 'Kristiyan', :middle_name => 'Petrov', :last_name => 'Stoyanov')
|
|
contact4 = Contact.create!(:project => project, :first_name => 'Mr.Nobody', :middle_name => '', :last_name => 'Test', :email => 'test@test.com')
|
|
|
|
assert contact1.duplicates.include?(contact2)
|
|
assert contact1.duplicates.include?(contact3)
|
|
assert contact1.duplicates.include?(contact4)
|
|
end
|
|
end
|