# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/ require 'test_helper' class UserTest < ActiveSupport::TestCase test 'user' do tests = [ { name: '#1 - simple create', create: { firstname: 'Firstname', lastname: 'Lastname', email: 'some@example.com', login: 'some@example.com', updated_by_id: 1, created_by_id: 1, }, create_verify: { firstname: 'Firstname', lastname: 'Lastname', image: nil, fullname: 'Firstname Lastname', email: 'some@example.com', login: 'some@example.com', }, }, { name: '#2 - simple create - no lastname', create: { firstname: 'Firstname Lastname', lastname: '', email: 'some@example.com', login: 'some@example.com', updated_by_id: 1, created_by_id: 1, }, create_verify: { firstname: 'Firstname', lastname: 'Lastname', image: nil, email: 'some@example.com', login: 'some@example.com', }, }, { name: '#3 - simple create - no firstname', create: { firstname: '', lastname: 'Firstname Lastname', email: 'some@example.com', login: 'some@example.com', updated_by_id: 1, created_by_id: 1, }, create_verify: { firstname: 'Firstname', lastname: 'Lastname', image: nil, email: 'some@example.com', login: 'some@example.com', }, }, { name: '#4 - simple create - nil as lastname', create: { firstname: 'Firstname Lastname', lastname: '', email: 'some@example.com', login: 'some@example.com', updated_by_id: 1, created_by_id: 1, }, create_verify: { firstname: 'Firstname', lastname: 'Lastname', image: nil, email: 'some@example.com', login: 'some@example.com', }, }, { name: '#5 - simple create - no lastname, firstname with ","', create: { firstname: 'Lastname, Firstname', lastname: '', email: 'some@example.com', login: 'some@example.com', updated_by_id: 1, created_by_id: 1, }, create_verify: { firstname: 'Firstname', lastname: 'Lastname', email: 'some@example.com', login: 'some@example.com', }, }, { name: '#6 - simple create - no lastname/firstname', create: { firstname: '', lastname: '', email: 'firstname.lastname@example.com', login: 'login-1', updated_by_id: 1, created_by_id: 1, }, create_verify: { firstname: 'Firstname', lastname: 'Lastname', fullname: 'Firstname Lastname', email: 'firstname.lastname@example.com', login: 'login-1', }, }, { name: '#7 - simple create - no lastname/firstnam', create: { firstname: '', lastname: '', email: 'FIRSTNAME.lastname@example.com', login: 'login-2', updated_by_id: 1, created_by_id: 1, }, create_verify: { firstname: 'Firstname', lastname: 'Lastname', email: 'firstname.lastname@example.com', login: 'login-2', }, }, { name: '#8 - simple create - nill as fristname and lastname', create: { firstname: '', lastname: '', email: 'FIRSTNAME.lastname@example.com', login: 'login-3', updated_by_id: 1, created_by_id: 1, }, create_verify: { firstname: 'Firstname', lastname: 'Lastname', email: 'firstname.lastname@example.com', login: 'login-3', }, }, { name: '#9 - update with avatar check', create: { firstname: 'Bob', lastname: 'Smith', email: 'bob.smith@example.com', login: 'login-4', updated_by_id: 1, created_by_id: 1, }, create_verify: { firstname: 'Bob', lastname: 'Smith', image: nil, email: 'bob.smith@example.com', login: 'login-4', }, update: { email: 'unit-test1@znuny.com', }, update_verify: { firstname: 'Bob', lastname: 'Smith', image: '7c3af305038fc695a9563eda2eb78f57', image_md5: '7c3af305038fc695a9563eda2eb78f57', email: 'unit-test1@znuny.com', login: 'login-4', } }, { name: '#10 - update create with avatar check', create: { firstname: 'Bob', lastname: 'Smith', email: 'unit-test2@znuny.com', login: 'login-5', updated_by_id: 1, created_by_id: 1, }, create_verify: { firstname: 'Bob', lastname: 'Smith', image: 'cc98289b7af056fbd00ff0c1d08284c4', image_md5: 'cc98289b7af056fbd00ff0c1d08284c4', email: 'unit-test2@znuny.com', login: 'login-5', }, update: { email: 'unit-test1@znuny.com', }, update_verify: { firstname: 'Bob', lastname: 'Smith', image: '7c3af305038fc695a9563eda2eb78f57', image_md5: '7c3af305038fc695a9563eda2eb78f57', email: 'unit-test1@znuny.com', login: 'login-5', } }, { name: '#11 - update create with login/email check', create: { firstname: '', lastname: '', email: 'caoyaoewfzfw@21222cn.com', updated_by_id: 1, created_by_id: 1, }, create_verify: { firstname: '', lastname: '', fullname: 'caoyaoewfzfw@21222cn.com', email: 'caoyaoewfzfw@21222cn.com', login: 'caoyaoewfzfw@21222cn.com', }, update: { email: 'caoyaoewfzfw@212224cn.com', }, update_verify: { firstname: '', lastname: '', email: 'caoyaoewfzfw@212224cn.com', fullname: 'caoyaoewfzfw@212224cn.com', login: 'caoyaoewfzfw@212224cn.com', } }, { name: '#12 - update create with login/email check', create: { firstname: 'Firstname', lastname: 'Lastname', email: 'some_tEst11@example.com', updated_by_id: 1, created_by_id: 1, }, create_verify: { firstname: 'Firstname', lastname: 'Lastname', fullname: 'Firstname Lastname', email: 'some_test11@example.com', }, update: { email: 'some_Test11-1@example.com', }, update_verify: { firstname: 'Firstname', lastname: 'Lastname', email: 'some_test11-1@example.com', fullname: 'Firstname Lastname', login: 'some_test11-1@example.com', } }, ] default_disable_in_test_env = Service::Image::Zammad.const_get(:DISABLE_IN_TEST_ENV) Service::Image::Zammad.const_set(:DISABLE_IN_TEST_ENV, false) tests.each do |test| # check if user exists user = User.find_by(login: test[:create][:login]) user&.destroy! user = User.create!(test[:create]) test[:create_verify].each do |key, value| next if key == :image_md5 if user.respond_to?(key) result = user.send(key) if value.nil? assert_nil(result, "create check #{key} in (#{test[:name]})") else assert_equal(result, value, "create check #{key} in (#{test[:name]})") end else assert_equal(user[key], value, "create check #{key} in (#{test[:name]})") end end if test[:create_verify][:image_md5] file = Avatar.get_by_hash(user.image) file_md5 = Digest::MD5.hexdigest(file.content) assert_equal(file_md5, test[:create_verify][:image_md5], "create avatar md5 check in (#{test[:name]})") end if test[:update] user.update!(test[:update]) test[:update_verify].each do |key, value| next if key == :image_md5 if user.respond_to?(key) assert_equal(user.send(key), value, "update check #{key} in (#{test[:name]})") else assert_equal(user[key], value, "update check #{key} in (#{test[:name]})") end end if test[:update_verify][:image_md5] file = Avatar.get_by_hash(user.image) file_md5 = Digest::MD5.hexdigest(file.content) assert_equal(file_md5, test[:update_verify][:image_md5], "update avatar md5 check in (#{test[:name]})") end end user.destroy! end Service::Image::Zammad.const_set(:DISABLE_IN_TEST_ENV, default_disable_in_test_env) end test 'strange spaces' do name = "#{Time.zone.now.to_i}-#{SecureRandom.uuid}" email = "customer_email#{name}@example.com" customer = User.create!( firstname: 'Role', lastname: "Customer#{name}", email: " #{email} ", password: 'customerpw', active: true, roles: Role.where(name: %w[Customer]), updated_by_id: 1, created_by_id: 1, ) assert(customer) assert_equal(email, customer.email) customer.destroy! name = "#{Time.zone.now.to_i}-#{SecureRandom.uuid}" email = "customer_email#{name}@example.com" customer = User.create!( firstname: "\u{00a0}\u{00a0}Role", lastname: "Customer#{name} \u{00a0}", email: "\u{00a0}#{email}\u{00a0}", password: 'customerpw', active: true, roles: Role.where(name: %w[Customer]), updated_by_id: 1, created_by_id: 1, ) assert(customer) assert_equal('Role', customer.firstname) assert_equal("Customer#{name}", customer.lastname) assert_equal(email, customer.email) customer.destroy! name = "#{Time.zone.now.to_i}-#{SecureRandom.uuid}" email = "customer_email#{name}@example.com" customer = User.create!( firstname: "\u{200B}\u{200B}Role", lastname: "Customer#{name} \u{200B}", email: "\u{200B}#{email}\u{200B}", password: 'customerpw', active: true, roles: Role.where(name: %w[Customer]), updated_by_id: 1, created_by_id: 1, ) assert(customer) assert_equal('Role', customer.firstname) assert_equal("Customer#{name}", customer.lastname) assert_equal(email, customer.email) customer.destroy! name = "#{Time.zone.now.to_i}-#{SecureRandom.uuid}" email = "customer_email#{name}@example.com" customer = User.create!( firstname: "\u{200B}\u{200B}Role\u{00a0}", lastname: "\u{00a0}\u{00a0}Customer#{name} \u{200B}", email: "\u{200B}#{email}\u{200B}", password: 'customerpw', active: true, roles: Role.where(name: %w[Customer]), updated_by_id: 1, created_by_id: 1, ) assert(customer) assert_equal('Role', customer.firstname) assert_equal("Customer#{name}", customer.lastname) assert_equal(email, customer.email) customer.destroy! name = "#{Time.zone.now.to_i}-#{SecureRandom.uuid}" email = "customer_email#{name}@example.com" customer = User.create!( firstname: "\u{200a}\u{200b}\u{202F}\u{205F}Role\u{2007}\u{2008}", lastname: "\u{00a0}\u{00a0}Customer#{name}\u{3000}\u{FEFF}\u{2000}", email: "\u{200B}#{email}\u{200B}\u{2007}\u{2008}", password: 'customerpw', active: true, roles: Role.where(name: %w[Customer]), updated_by_id: 1, created_by_id: 1, ) assert(customer) assert_equal('Role', customer.firstname) assert_equal("Customer#{name}", customer.lastname) assert_equal(email, customer.email) customer.destroy! end test 'without email - but login eq email' do name = SecureRandom.uuid login = "admin-role_without_email#{name}@example.com" email = "admin-role_without_email#{name}@example.com" admin = User.create_or_update( login: login, firstname: 'Role', lastname: "Admin#{name}", # email: "", password: 'adminpw', active: true, roles: Role.where(name: %w[Admin Agent]), updated_by_id: 1, created_by_id: 1, ) assert(admin.id) assert_equal(admin.login, login) assert_equal(admin.email, '') admin.email = email admin.save! assert_equal(admin.login, login) assert_equal(admin.email, email) admin.email = '' admin.save! assert(admin.id) assert(admin.login) assert_not_equal(admin.login, login) assert_equal(admin.email, '') admin.destroy! end test 'without email - but login ne email' do name = SecureRandom.uuid login = "admin-role_without_email#{name}" email = "admin-role_without_email#{name}@example.com" admin = User.create_or_update( login: login, firstname: 'Role', lastname: "Admin#{name}", # email: "", password: 'adminpw', active: true, roles: Role.where(name: %w[Admin Agent]), updated_by_id: 1, created_by_id: 1, ) assert(admin.id) assert_equal(admin.login, login) assert_equal(admin.email, '') admin.email = email admin.save! assert_equal(admin.login, login) assert_equal(admin.email, email) admin.email = '' admin.save! assert(admin.id) assert_equal(admin.login, login) assert_equal(admin.email, '') admin.destroy! end test 'uniq email' do name = SecureRandom.uuid email1 = "admin1-role_without_email#{name}@example.com" admin1 = User.create!( login: email1, firstname: 'Role', lastname: "Admin1#{name}", email: email1, password: 'adminpw', active: true, roles: Role.where(name: %w[Admin Agent]), updated_by_id: 1, created_by_id: 1, ) assert(admin1.id) assert_equal(admin1.email, email1) assert_raises(ActiveRecord::RecordInvalid) do User.create!( login: "#{email1}-1", firstname: 'Role', lastname: "Admin1#{name}", email: email1, password: 'adminpw', active: true, roles: Role.where(name: %w[Admin Agent]), updated_by_id: 1, created_by_id: 1, ) end email2 = "admin2-role_without_email#{name}@example.com" admin2 = User.create!( firstname: 'Role', lastname: "Admin2#{name}", email: email2, password: 'adminpw', active: true, roles: Role.where(name: %w[Admin Agent]), updated_by_id: 1, created_by_id: 1, ) assert_raises(ActiveRecord::RecordInvalid) do admin2.email = email1 admin2.save! end admin1.email = admin1.email admin1.save! admin2.destroy! admin1.destroy! end test 'uniq email - multiple use' do Setting.set('user_email_multiple_use', true) name = SecureRandom.uuid email1 = "admin1-role_without_email#{name}@example.com" admin1 = User.create!( login: email1, firstname: 'Role', lastname: "Admin1#{name}", email: email1, password: 'adminpw', active: true, roles: Role.where(name: %w[Admin Agent]), updated_by_id: 1, created_by_id: 1, ) assert(admin1.id) assert_equal(admin1.email, email1) admin2 = User.create!( login: "#{email1}-1", firstname: 'Role', lastname: "Admin1#{name}", email: email1, password: 'adminpw', active: true, roles: Role.where(name: %w[Admin Agent]), updated_by_id: 1, created_by_id: 1, ) assert_equal(admin2.email, email1) admin2.destroy! admin1.destroy! Setting.set('user_email_multiple_use', false) end test 'ensure roles' do name = SecureRandom.uuid admin = User.create_or_update( login: "admin-role#{name}@example.com", firstname: 'Role', lastname: "Admin#{name}", email: "admin-role#{name}@example.com", password: 'adminpw', active: true, roles: Role.where(name: %w[Admin Agent]), updated_by_id: 1, created_by_id: 1, ) customer1 = User.create_or_update( login: "user-ensure-role1-#{name}@example.com", firstname: 'Role', lastname: "Customer#{name}", email: "user-ensure-role1-#{name}@example.com", password: 'customerpw', active: true, updated_by_id: 1, created_by_id: 1, ) assert_equal(customer1.role_ids.sort, Role.signup_role_ids) roles = Role.where(name: 'Agent') customer1.roles = roles customer1.save! assert_equal(customer1.role_ids.count, 1) assert_equal(customer1.role_ids.first, roles.first.id) assert_equal(customer1.roles.first.id, roles.first.id) customer1.roles = [] customer1.save! assert_equal(customer1.role_ids.sort, Role.signup_role_ids) customer1.destroy! customer2 = User.create_or_update( login: "user-ensure-role2-#{name}@example.com", firstname: 'Role', lastname: "Customer#{name}", email: "user-ensure-role2-#{name}@example.com", password: 'customerpw', roles: roles, active: true, updated_by_id: 1, created_by_id: 1, ) assert_equal(customer2.role_ids.count, 1) assert_equal(customer2.role_ids.first, roles.first.id) assert_equal(customer2.roles.first.id, roles.first.id) roles = Role.where(name: 'Admin') customer2.role_ids = [roles.first.id] customer2.save! assert_equal(customer2.role_ids.count, 1) assert_equal(customer2.role_ids.first, roles.first.id) assert_equal(customer2.roles.first.id, roles.first.id) customer2.roles = [] customer2.save! assert_equal(customer2.role_ids.sort, Role.signup_role_ids) customer2.destroy! customer3 = User.create_or_update( login: "user-ensure-role2-#{name}@example.com", firstname: 'Role', lastname: "Customer#{name}", email: "user-ensure-role2-#{name}@example.com", password: 'customerpw', roles: roles, active: true, updated_by_id: 1, created_by_id: 1, ) customer3.roles = Role.where(name: %w[Admin Agent]) customer3.roles.each do |role| assert_not_equal(role.name, 'Customer') end customer3.roles = Role.where(name: 'Admin') customer3.roles.each do |role| assert_not_equal(role.name, 'Customer') end customer3.roles = Role.where(name: 'Agent') customer3.roles.each do |role| assert_not_equal(role.name, 'Customer') end customer3.destroy! admin.destroy! end test 'user default preferences' do name = SecureRandom.uuid groups = Group.where(name: 'Users') roles = Role.where(name: 'Agent') agent1 = User.create_or_update( login: "agent-default-preferences#{name}@example.com", firstname: 'Preferences', lastname: "Agent#{name}", email: "agent-default-preferences#{name}@example.com", password: 'agentpw', active: true, roles: roles, groups: groups, preferences: { locale: 'de-de', }, updated_by_id: 1, created_by_id: 1, ) agent1 = User.find(agent1.id) assert(agent1.preferences) assert(agent1.preferences['locale']) assert_equal(agent1.preferences['locale'], 'de-de') assert(agent1.preferences['notification_config']) assert(agent1.preferences['notification_config']['matrix']) assert(agent1.preferences['notification_config']['matrix']['create']) assert(agent1.preferences['notification_config']['matrix']['update']) roles = Role.where(name: 'Customer') customer1 = User.create_or_update( login: "customer-default-preferences#{name}@example.com", firstname: 'Preferences', lastname: "Customer#{name}", email: "customer-default-preferences#{name}@example.com", password: 'customerpw', active: true, roles: roles, preferences: { locale: 'de-de', }, updated_by_id: 1, created_by_id: 1, ) customer1 = User.find(customer1.id) assert(customer1.preferences) assert(customer1.preferences['locale']) assert_equal(customer1.preferences['locale'], 'de-de') assert_not(customer1.preferences['notification_config']) customer1 = User.find(customer1.id) customer1.roles = Role.where(name: 'Agent') customer1 = User.find(customer1.id) assert(customer1.preferences) assert(customer1.preferences['locale']) assert_equal(customer1.preferences['locale'], 'de-de') assert(customer1.preferences['notification_config']) assert(customer1.preferences['notification_config']['matrix']['create']) assert(customer1.preferences['notification_config']['matrix']['update']) end test 'permission' do test_role_1 = Role.create_or_update( name: 'Test1', note: 'To configure your system.', preferences: { not: ['Test3'], }, updated_by_id: 1, created_by_id: 1 ) test_role_2 = Role.create_or_update( name: 'Test2', note: 'To work on Tickets.', preferences: { not: ['Test3'], }, updated_by_id: 1, created_by_id: 1 ) test_role_3 = Role.create_or_update( name: 'Test3', note: 'People who create Tickets ask for help.', preferences: { not: %w[Test1 Test2], }, updated_by_id: 1, created_by_id: 1 ) test_role_4 = Role.create_or_update( name: 'Test4', note: 'Access the report area.', preferences: {}, created_by_id: 1, updated_by_id: 1, ) name = SecureRandom.uuid assert_raises(RuntimeError) do User.create_or_update( login: "customer-role#{name}@example.com", firstname: 'Role', lastname: "Customer#{name}", email: "customer-role#{name}@example.com", password: 'customerpw', active: true, roles: [test_role_1, test_role_3], updated_by_id: 1, created_by_id: 1, ) end assert_raises(RuntimeError) do User.create_or_update( login: "customer-role#{name}@example.com", firstname: 'Role', lastname: "Customer#{name}", email: "customer-role#{name}@example.com", password: 'customerpw', active: true, roles: [test_role_2, test_role_3], updated_by_id: 1, created_by_id: 1, ) end user1 = User.create_or_update( login: "customer-role#{name}@example.com", firstname: 'Role', lastname: "Customer#{name}", email: "customer-role#{name}@example.com", password: 'customerpw', active: true, roles: [test_role_1, test_role_2], updated_by_id: 1, created_by_id: 1, ) assert(user1.role_ids.include?(test_role_1.id)) assert(user1.role_ids.include?(test_role_2.id)) assert_not(user1.role_ids.include?(test_role_3.id)) assert_not(user1.role_ids.include?(test_role_4.id)) user1 = User.create_or_update( login: "customer-role#{name}@example.com", firstname: 'Role', lastname: "Customer#{name}", email: "customer-role#{name}@example.com", password: 'customerpw', active: true, roles: [test_role_1, test_role_4], updated_by_id: 1, created_by_id: 1, ) assert(user1.role_ids.include?(test_role_1.id)) assert_not(user1.role_ids.include?(test_role_2.id)) assert_not(user1.role_ids.include?(test_role_3.id)) assert(user1.role_ids.include?(test_role_4.id)) assert_raises(RuntimeError) do User.create_or_update( login: "customer-role#{name}@example.com", firstname: 'Role', lastname: "Customer#{name}", email: "customer-role#{name}@example.com", password: 'customerpw', active: true, roles: [test_role_1, test_role_3], updated_by_id: 1, created_by_id: 1, ) end assert_raises(RuntimeError) do User.create_or_update( login: "customer-role#{name}@example.com", firstname: 'Role', lastname: "Customer#{name}", email: "customer-role#{name}@example.com", password: 'customerpw', active: true, roles: [test_role_2, test_role_3], updated_by_id: 1, created_by_id: 1, ) end assert(user1.role_ids.include?(test_role_1.id)) assert_not(user1.role_ids.include?(test_role_2.id)) assert_not(user1.role_ids.include?(test_role_3.id)) assert(user1.role_ids.include?(test_role_4.id)) end test 'permission default' do name = SecureRandom.uuid admin_count = User.with_permissions('admin').count admin = User.create_or_update( login: "admin-role#{name}@example.com", firstname: 'Role', lastname: "Admin#{name}", email: "admin-role#{name}@example.com", password: 'adminpw', active: true, roles: Role.where(name: %w[Admin Agent]), updated_by_id: 1, created_by_id: 1, ) agent_count = User.with_permissions('ticket.agent').count agent = User.create_or_update( login: "agent-role#{name}@example.com", firstname: 'Role', lastname: "Agent#{name}", email: "agent-role#{name}@example.com", password: 'agentpw', active: true, roles: Role.where(name: 'Agent'), updated_by_id: 1, created_by_id: 1, ) customer_count = User.with_permissions('ticket.customer').count customer = User.create_or_update( login: "customer-role#{name}@example.com", firstname: 'Role', lastname: "Customer#{name}", email: "customer-role#{name}@example.com", password: 'customerpw', active: true, roles: Role.where(name: 'Customer'), updated_by_id: 1, created_by_id: 1, ) users = User.with_permissions('not_existing') assert(users.blank?) users = User.with_permissions('admin') assert_equal(admin_count + 1, users.count) assert_equal(admin.login, users.last.login) users = User.with_permissions('admin.session') assert_equal(admin_count + 1, users.count) assert_equal(admin.login, users.last.login) users = User.with_permissions(['admin.session', 'not_existing']) assert_equal(admin_count + 1, users.count) assert_equal(admin.login, users.last.login) users = User.with_permissions('ticket.agent') assert_equal(agent_count + 1, users.count) assert_equal(agent.login, users.last.login) users = User.with_permissions(['ticket.agent', 'not_existing']) assert_equal(agent_count + 1, users.count) assert_equal(agent.login, users.last.login) users = User.with_permissions('ticket.customer') assert_equal(customer_count + 1, users.count) assert_equal(customer.login, users.last.login) users = User.with_permissions(['ticket.customer', 'not_existing']) assert_equal(customer_count + 1, users.count) assert_equal(customer.login, users.last.login) end test 'min admin permission check' do # delete inital admin User.find_by(login: 'admin@example.com').destroy # store current admin count admin_count_inital = User.with_permissions('admin').count assert_equal(0, admin_count_inital) # create two admin users random = SecureRandom.uuid admin1 = User.create_or_update( login: "1admin-role#{random}@example.com", firstname: 'Role', lastname: "Admin#{random}", email: "admin-role#{random}@example.com", password: 'adminpw', active: true, roles: Role.where(name: %w[Admin Agent]), updated_by_id: 1, created_by_id: 1, ) random = SecureRandom.uuid admin2 = User.create_or_update( login: "2admin-role#{random}@example.com", firstname: 'Role', lastname: "Admin#{random}", email: "admin-role#{random}@example.com", password: 'adminpw', active: true, roles: Role.where(name: %w[Admin Agent]), updated_by_id: 1, created_by_id: 1, ) random = SecureRandom.uuid admin3 = User.create_or_update( login: "2admin-role#{random}@example.com", firstname: 'Role', lastname: "Admin#{random}", email: "admin-role#{random}@example.com", password: 'adminpw', active: true, roles: Role.where(name: %w[Admin Agent]), updated_by_id: 1, created_by_id: 1, ) admin_count_inital = User.with_permissions('admin').count assert_equal(3, admin_count_inital) admin1.update!(roles: Role.where(name: %w[Agent])) admin_count_inital = User.with_permissions('admin').count assert_equal(2, admin_count_inital) admin2.update!(roles: Role.where(name: %w[Agent])) admin_count_inital = User.with_permissions('admin').count assert_equal(1, admin_count_inital) assert_raises(Exceptions::UnprocessableEntity) do admin3.update!(roles: Role.where(name: %w[Agent])) end admin_count_inital = User.with_permissions('admin').count assert_equal(1, admin_count_inital) assert_raises(Exceptions::UnprocessableEntity) do admin3.active = false admin3.save! end assert_equal(1, User.with_permissions('admin').count) admin_role = Role.find_by(name: 'Admin') assert_raises(Exceptions::UnprocessableEntity) do admin_role.active = false admin_role.save! end assert_raises(Exceptions::UnprocessableEntity) do admin_role.permission_revoke('admin') end assert_equal(1, User.with_permissions('admin').count) end test 'only valid agent in group permission check' do name = SecureRandom.uuid group = Group.create!( name: "ValidAgentGroupPermission-#{name}", active: true, updated_by_id: 1, created_by_id: 1, ) roles = Role.where(name: 'Agent') User.create_or_update( login: "agent-default-valid_agent_group_permission-1#{name}@example.com", firstname: 'valid_agent_group_permission-1', lastname: "Agent#{name}", email: "agent-default-valid_agent_group_permission-1#{name}@example.com", password: 'agentpw', active: true, roles: roles, groups: [group], updated_by_id: 1, created_by_id: 1, ) agent2 = User.create_or_update( login: "agent-default-valid_agent_group_permission-2#{name}@example.com", firstname: 'valid_agent_group_permission-2', lastname: "Agent#{name}", email: "agent-default-valid_agent_group_permission-2#{name}@example.com", password: 'agentpw', active: true, roles: roles, groups: [group], updated_by_id: 1, created_by_id: 1, ) assert_equal(2, User.group_access(group.id, 'full').count) agent2.active = false agent2.save! assert_equal(1, User.group_access(group.id, 'full').count) agent2.active = true agent2.save! assert_equal(2, User.group_access(group.id, 'full').count) roles = Role.where(name: 'Customer') agent2.roles = roles agent2.save! assert_equal(1, User.group_access(group.id, 'full').count) end test 'preferences[:notification_sound][:enabled] value check' do name = SecureRandom.uuid roles = Role.where(name: 'Agent') agent1 = User.create!( login: "agent-default-preferences-1#{name}@example.com", firstname: 'valid_agent_group_permission-1', lastname: "Agent#{name}", email: "agent-default-preferences-1#{name}@example.com", password: 'agentpw', active: true, roles: roles, preferences: { notification_sound: { enabled: true, } }, updated_by_id: 1, created_by_id: 1, ) assert_equal(true, agent1.preferences[:notification_sound][:enabled]) agent2 = User.create!( login: "agent-default-preferences-2#{name}@example.com", firstname: 'valid_agent_group_permission-2', lastname: "Agent#{name}", email: "agent-default-preferences-2#{name}@example.com", password: 'agentpw', active: true, roles: roles, preferences: { notification_sound: { enabled: false, } }, updated_by_id: 1, created_by_id: 1, ) assert_equal(false, agent2.preferences[:notification_sound][:enabled]) agent3 = User.create!( login: "agent-default-preferences-3#{name}@example.com", firstname: 'valid_agent_group_permission-3', lastname: "Agent#{name}", email: "agent-default-preferences-3#{name}@example.com", password: 'agentpw', active: true, roles: roles, preferences: { notification_sound: { enabled: true, } }, updated_by_id: 1, created_by_id: 1, ) assert_equal(true, agent3.preferences[:notification_sound][:enabled]) agent3.preferences[:notification_sound][:enabled] = 'false' agent3.save! agent3.reload assert_equal(false, agent3.preferences[:notification_sound][:enabled]) agent4 = User.create!( login: "agent-default-preferences-4#{name}@example.com", firstname: 'valid_agent_group_permission-4', lastname: "Agent#{name}", email: "agent-default-preferences-4#{name}@example.com", password: 'agentpw', active: true, roles: roles, preferences: { notification_sound: { enabled: false, } }, updated_by_id: 1, created_by_id: 1, ) assert_equal(false, agent4.preferences[:notification_sound][:enabled]) agent4.preferences[:notification_sound][:enabled] = 'true' agent4.save! agent4.reload assert_equal(true, agent4.preferences[:notification_sound][:enabled]) agent4.preferences[:notification_sound][:enabled] = 'invalid' assert_raises(Exceptions::UnprocessableEntity) do agent4.save! end assert_raises(Exceptions::UnprocessableEntity) do User.create!( login: "agent-default-preferences-5#{name}@example.com", firstname: 'valid_agent_group_permission-5', lastname: "Agent#{name}", email: "agent-default-preferences-5#{name}@example.com", password: 'agentpw', active: true, roles: roles, preferences: { notification_sound: { enabled: 'invalid string', } }, updated_by_id: 1, created_by_id: 1, ) end end test 'cleanup references on destroy' do agent1 = User.create!( login: "agent-cleanup_check-1#{name}@example.com", firstname: 'valid_agent_group_permission-1', lastname: "Agent#{name}", email: "agent-cleanup_check-1#{name}@example.com", password: 'agentpw', active: true, roles: Role.where(name: 'Agent'), groups: Group.all, updated_by_id: 1, created_by_id: 1, ) agent1_id = agent1.id assert_equal(1, Avatar.list('User', agent1_id).count) UserDevice.add( 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36', '91.115.248.231', agent1_id, 'fingerprint1234', 'session', ) assert_equal(1, UserDevice.where(user_id: agent1_id).count) Karma::User.sync(agent1) assert_equal(1, Karma::User.where(user_id: agent1_id).count) OnlineNotification.add( type: 'Assigned to you', object: 'Ticket', o_id: 1, seen: false, user_id: agent1_id, created_by_id: 1, updated_by_id: 1, created_at: Time.zone.now, updated_at: Time.zone.now, ) assert_equal(1, OnlineNotification.where(user_id: agent1_id).count) Authorization.create!( user: agent1, uid: '123', username: '123', provider: 'some', token: 'token', secret: 'secret', ) assert_equal(1, Authorization.where(user_id: agent1_id).count) Cti::CallerId.maybe_add( caller_id: '49123456789', comment: 'Hairdresser Bob Smith, San Francisco', # optional level: 'maybe', # known|maybe user_id: agent1_id, # optional object: 'Ticket', o_id: 1, ) assert_equal(1, Cti::CallerId.where(user_id: agent1_id).count) Taskbar.create!( client_id: 123, key: 'Ticket-1', callback: 'TicketZoom', params: { id: 1, }, state: {}, user_id: agent1_id, prio: 1, notify: false, ) assert_equal(1, Taskbar.where(user_id: agent1_id).count) ticket1 = Ticket.create!( title: 'test 1234-1', group: Group.lookup(name: 'Users'), customer_id: 2, owner_id: 2, updated_by_id: 1, created_by_id: 1, ) RecentView.log(ticket1.class.to_s, ticket1.id, agent1) assert_equal(1, RecentView.where(created_by_id: agent1_id).count) Token.create!(action: 'api', user_id: agent1_id) StatsStore.create( stats_storable: agent1, key: 'some_key', data: { A: 1, B: 2 }, created_at: Time.zone.now, created_by_id: 1, ) item = StatsStore.find_by( stats_storable: agent1, key: 'some_key', ) assert(item) agent1.destroy! assert_equal(0, UserDevice.where(user_id: agent1_id).count) assert_equal(0, Avatar.list('User', agent1_id, false).count) assert_equal(0, Karma::User.where(user_id: agent1_id).count) assert_equal(0, OnlineNotification.where(user_id: agent1_id).count) assert_equal(0, Authorization.where(user_id: agent1_id).count) assert_equal(0, Cti::CallerId.where(user_id: agent1_id).count) assert_equal(0, Taskbar.where(user_id: agent1_id).count) assert_equal(0, RecentView.where(created_by_id: agent1_id).count) assert_equal(0, Token.where(user_id: agent1_id).count) assert_equal(0, Token.where(user_id: agent1_id).count) item = StatsStore.find_by( stats_storable: agent1, key: 'some_key', ) assert_nil(item) end test 'adding group drops cache' do agent1 = User.create!( login: "agent-cleanup_check-1#{name}@example.com", firstname: 'valid_agent_group_permission-1', lastname: "Agent#{name}", email: "agent-cleanup_check-1#{name}@example.com", password: 'agentpw', active: true, roles: Role.where(name: 'Agent'), groups: Group.all, updated_by_id: 1, created_by_id: 1, ) group1 = Group.create_or_update( name: "GroupWithoutPermission-#{SecureRandom.uuid}", active: true, updated_by_id: 1, created_by_id: 1, ) differences = %w[ group1.attributes_with_association_ids['user_ids'].count agent1.attributes_with_association_ids['group_ids'].keys.count ] assert_difference differences, 1 do agent1.groups << group1 end end end