# Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/

require 'test_helper'

class RoleValidateAgentLimit < ActiveSupport::TestCase
  test 'role validate agent limit' do

    agent_max = User.with_permissions('ticket.agent').count
    UserInfo.current_user_id = 1
    Setting.set('system_agent_limit', agent_max + 2)

    permission_ticket_agent = Permission.where(name: 'ticket.agent')

    role_agent_limit_success = Role.create!(
      name:        'agent-limit-test-success',
      note:        'agent-limit-test-success Role.',
      permissions: [],
      active:      true,
    )
    role_agent_limit_fail = Role.create!(
      name:        'agent-limit-test-fail',
      note:        'agent-limit-test-fail Role.',
      permissions: [],
      active:      true,
    )

    user1 = User.create!(
      firstname: 'Firstname',
      lastname:  'Lastname',
      email:     'some-agentlimit-role@example.com',
      login:     'some-agentlimit-role@example.com',
      roles:     [role_agent_limit_success],
      active:    true,
    )
    user2 = User.create!(
      firstname: 'Firstname1',
      lastname:  'Lastname1',
      email:     'some-agentlimit-role-1@example.com',
      login:     'some-agentlimit-role-1@example.com',
      roles:     [role_agent_limit_success],
      active:    true,
    )
    user3 = User.create!(
      firstname: 'Firstname2',
      lastname:  'Lastname2',
      email:     'some-agentlimit-role-2@example.com',
      login:     'some-agentlimit-role-2@example.com',
      roles:     [role_agent_limit_fail],
      active:    true,
    )

    role_agent_limit_success.permissions = permission_ticket_agent
    assert_raises(Exceptions::UnprocessableEntity) do
      role_agent_limit_fail.permissions = permission_ticket_agent
    end

    role_agent_limit_fail.active = false
    role_agent_limit_fail.save!

    role_agent_limit_fail.permissions = permission_ticket_agent

    assert_raises(Exceptions::UnprocessableEntity) do
      role_agent_limit_fail.active = true
      role_agent_limit_fail.save!
    end

    user1.destroy!
    user2.destroy!
    user3.destroy!
    role_agent_limit_success.destroy!
    role_agent_limit_fail.destroy!
    Setting.set('system_agent_limit', nil)
  end

  test 'role validate agent limit as string' do

    agent_max = User.with_permissions('ticket.agent').count
    UserInfo.current_user_id = 1
    Setting.set('system_agent_limit', (agent_max + 2).to_s)

    permission_ticket_agent = Permission.where(name: 'ticket.agent')

    role_agent_limit_success = Role.create!(
      name:        'agent-limit-test-success',
      note:        'agent-limit-test-success Role.',
      permissions: [],
      active:      true,
    )
    role_agent_limit_fail = Role.create!(
      name:        'agent-limit-test-fail',
      note:        'agent-limit-test-fail Role.',
      permissions: [],
      active:      true,
    )

    user1 = User.create!(
      firstname: 'Firstname',
      lastname:  'Lastname',
      email:     'some-agentlimit-role@example.com',
      login:     'some-agentlimit-role@example.com',
      roles:     [role_agent_limit_success],
      active:    true,
    )
    user2 = User.create!(
      firstname: 'Firstname1',
      lastname:  'Lastname1',
      email:     'some-agentlimit-role-1@example.com',
      login:     'some-agentlimit-role-1@example.com',
      roles:     [role_agent_limit_success],
      active:    true,
    )
    user3 = User.create!(
      firstname: 'Firstname2',
      lastname:  'Lastname2',
      email:     'some-agentlimit-role-2@example.com',
      login:     'some-agentlimit-role-2@example.com',
      roles:     [role_agent_limit_fail],
      active:    true,
    )

    role_agent_limit_success.permissions = permission_ticket_agent
    assert_raises(Exceptions::UnprocessableEntity) do
      role_agent_limit_fail.permissions = permission_ticket_agent
    end

    role_agent_limit_fail.active = false
    role_agent_limit_fail.save!

    role_agent_limit_fail.permissions = permission_ticket_agent

    assert_raises(Exceptions::UnprocessableEntity) do
      role_agent_limit_fail.active = true
      role_agent_limit_fail.save!
    end

    user1.destroy!
    user2.destroy!
    user3.destroy!
    role_agent_limit_success.destroy!
    role_agent_limit_fail.destroy!
    Setting.set('system_agent_limit', nil)
  end

  test 'role validate agent limit - 1 user 2 ticket.agent roles' do

    current_agent_max = User.with_permissions('ticket.agent').count + 1
    UserInfo.current_user_id = 1
    Setting.set('system_agent_limit', current_agent_max)

    permission_ticket_agent = Permission.find_by(name: 'ticket.agent')

    role_agent_limit1 = Role.create!(
      name:        'agent-limit-test1',
      note:        'agent-limit-test1 Role.',
      permissions: [permission_ticket_agent],
      active:      true,
    )
    role_agent_limit2 = Role.create!(
      name:        'agent-limit-test2',
      note:        'agent-limit-test2 Role.',
      permissions: [permission_ticket_agent],
      active:      true,
    )

    user1 = User.create!(
      firstname: 'Firstname',
      lastname:  'Lastname',
      email:     'some-agentlimit-role@example.com',
      login:     'some-agentlimit-role@example.com',
      roles:     [role_agent_limit1, role_agent_limit2],
      active:    true,
    )

    user1.roles = Role.where(name: %w[Admin Agent])

    user1.role_ids = [Role.find_by(name: 'Agent').id]

    user1.role_ids = [Role.find_by(name: 'Agent').id, role_agent_limit1.id]

    user1.role_ids = [Role.find_by(name: 'Agent').id, role_agent_limit1.id, role_agent_limit2.id]

    assert_raises(Exceptions::UnprocessableEntity) do
      User.create!(
        firstname: 'Firstname2',
        lastname:  'Lastname2',
        email:     'some-agentlimit-role-2@example.com',
        login:     'some-agentlimit-role-2@example.com',
        roles:     [role_agent_limit1],
        active:    true,
      )
    end

    assert_equal(current_agent_max, User.with_permissions('ticket.agent').count)

    current_agent_max = User.with_permissions('ticket.agent').count + 1
    Setting.set('system_agent_limit', current_agent_max)

    User.create!(
      firstname: 'Firstname',
      lastname:  'Lastname',
      email:     'some-agentlimit-role-3@example.com',
      login:     'some-agentlimit-role-3@example.com',
      role_ids:  [Role.find_by(name: 'Agent').id],
      active:    true,
    )

    role_agent_limit1.destroy!
    role_agent_limit2.destroy!
    Setting.set('system_agent_limit', nil)
  end

end