feat: add custom roles seeding to account seeder (#11623)
Introduce custom roles in account seed data to support testing of realistic role-based access scenarios. Includes six distinct roles with varied permission sets and assigns them to multiple users for comprehensive test coverage.
This commit is contained in:
@@ -19,6 +19,7 @@ class Seeders::AccountSeeder
|
|||||||
def perform!
|
def perform!
|
||||||
set_up_account
|
set_up_account
|
||||||
seed_teams
|
seed_teams
|
||||||
|
seed_custom_roles
|
||||||
set_up_users
|
set_up_users
|
||||||
seed_labels
|
seed_labels
|
||||||
seed_canned_responses
|
seed_canned_responses
|
||||||
@@ -32,6 +33,7 @@ class Seeders::AccountSeeder
|
|||||||
@account.labels.destroy_all
|
@account.labels.destroy_all
|
||||||
@account.inboxes.destroy_all
|
@account.inboxes.destroy_all
|
||||||
@account.contacts.destroy_all
|
@account.contacts.destroy_all
|
||||||
|
@account.custom_roles.destroy_all if @account.respond_to?(:custom_roles)
|
||||||
end
|
end
|
||||||
|
|
||||||
def seed_teams
|
def seed_teams
|
||||||
@@ -40,6 +42,18 @@ class Seeders::AccountSeeder
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def seed_custom_roles
|
||||||
|
return unless @account_data['custom_roles'].present? && @account.respond_to?(:custom_roles)
|
||||||
|
|
||||||
|
@account_data['custom_roles'].each do |role_data|
|
||||||
|
@account.custom_roles.create!(
|
||||||
|
name: role_data['name'],
|
||||||
|
description: role_data['description'],
|
||||||
|
permissions: role_data['permissions']
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def seed_labels
|
def seed_labels
|
||||||
@account_data['labels'].each do |label|
|
@account_data['labels'].each do |label|
|
||||||
@account.labels.create!(label)
|
@account.labels.create!(label)
|
||||||
@@ -48,17 +62,34 @@ class Seeders::AccountSeeder
|
|||||||
|
|
||||||
def set_up_users
|
def set_up_users
|
||||||
@account_data['users'].each do |user|
|
@account_data['users'].each do |user|
|
||||||
user_record = User.create_with(name: user['name'], password: 'Password1!.').find_or_create_by!(email: (user['email']).to_s)
|
user_record = create_user_record(user)
|
||||||
user_record.skip_confirmation!
|
create_account_user(user_record, user)
|
||||||
user_record.save!
|
add_user_to_teams(user: user_record, teams: user['team']) if user['team'].present?
|
||||||
Avatar::AvatarFromUrlJob.perform_later(user_record, "https://xsgames.co/randomusers/avatar.php?g=#{user['gender']}")
|
|
||||||
AccountUser.create_with(role: (user['role'] || 'agent')).find_or_create_by!(account_id: @account.id, user_id: user_record.id)
|
|
||||||
next if user['team'].blank?
|
|
||||||
|
|
||||||
add_user_to_teams(user: user_record, teams: user['team'])
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def create_user_record(user)
|
||||||
|
user_record = User.create_with(name: user['name'], password: 'Password1!.').find_or_create_by!(email: user['email'].to_s)
|
||||||
|
user_record.skip_confirmation!
|
||||||
|
user_record.save!
|
||||||
|
Avatar::AvatarFromUrlJob.perform_later(user_record, "https://xsgames.co/randomusers/avatar.php?g=#{user['gender']}")
|
||||||
|
user_record
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_account_user(user_record, user)
|
||||||
|
account_user_attrs = build_account_user_attrs(user)
|
||||||
|
AccountUser.create_with(account_user_attrs).find_or_create_by!(account_id: @account.id, user_id: user_record.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_account_user_attrs(user)
|
||||||
|
attrs = { role: (user['role'] || 'agent') }
|
||||||
|
custom_role = find_custom_role(user['custom_role']) if user['custom_role'].present?
|
||||||
|
attrs[:custom_role] = custom_role if custom_role
|
||||||
|
attrs
|
||||||
|
end
|
||||||
|
|
||||||
def add_user_to_teams(user:, teams:)
|
def add_user_to_teams(user:, teams:)
|
||||||
teams.each do |team|
|
teams.each do |team|
|
||||||
team_record = @account.teams.where('name LIKE ?', "%#{team.downcase}%").first if team.present?
|
team_record = @account.teams.where('name LIKE ?', "%#{team.downcase}%").first if team.present?
|
||||||
@@ -66,6 +97,12 @@ class Seeders::AccountSeeder
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def find_custom_role(role_name)
|
||||||
|
return nil unless @account.respond_to?(:custom_roles)
|
||||||
|
|
||||||
|
@account.custom_roles.find_by(name: role_name)
|
||||||
|
end
|
||||||
|
|
||||||
def seed_canned_responses(count: 50)
|
def seed_canned_responses(count: 50)
|
||||||
count.times do
|
count.times do
|
||||||
@account.canned_responses.create(content: Faker::Quote.fortune_cookie, short_code: Faker::Alphanumeric.alpha(number: 10))
|
@account.canned_responses.create(content: Faker::Quote.fortune_cookie, short_code: Faker::Alphanumeric.alpha(number: 10))
|
||||||
|
|||||||
@@ -61,41 +61,49 @@ users:
|
|||||||
email: 'karn@paperlayer.test'
|
email: 'karn@paperlayer.test'
|
||||||
team:
|
team:
|
||||||
- 'Sales'
|
- 'Sales'
|
||||||
|
custom_role: 'Sales Representative'
|
||||||
- name: 'Danny Cordray'
|
- name: 'Danny Cordray'
|
||||||
gender: female
|
gender: female
|
||||||
email: 'danny@paperlayer.test'
|
email: 'danny@paperlayer.test'
|
||||||
team:
|
team:
|
||||||
- 'Sales'
|
- 'Sales'
|
||||||
|
custom_role: 'Customer Support Lead'
|
||||||
- name: 'Ben Nugent'
|
- name: 'Ben Nugent'
|
||||||
gender: male
|
gender: male
|
||||||
email: 'ben@paperlayer.test'
|
email: 'ben@paperlayer.test'
|
||||||
team:
|
team:
|
||||||
- 'Sales'
|
- 'Sales'
|
||||||
|
custom_role: 'Junior Agent'
|
||||||
- name: 'Todd Packer'
|
- name: 'Todd Packer'
|
||||||
gender: male
|
gender: male
|
||||||
email: 'todd@paperlayer.test'
|
email: 'todd@paperlayer.test'
|
||||||
team:
|
team:
|
||||||
- 'Sales'
|
- 'Sales'
|
||||||
|
custom_role: 'Sales Representative'
|
||||||
- name: 'Cathy Simms'
|
- name: 'Cathy Simms'
|
||||||
gender: female
|
gender: female
|
||||||
email: 'cathy@paperlayer.test'
|
email: 'cathy@paperlayer.test'
|
||||||
team:
|
team:
|
||||||
- 'Administration'
|
- 'Administration'
|
||||||
|
custom_role: 'Knowledge Manager'
|
||||||
- name: 'Hunter Jo'
|
- name: 'Hunter Jo'
|
||||||
gender: male
|
gender: male
|
||||||
email: 'hunter@paperlayer.test'
|
email: 'hunter@paperlayer.test'
|
||||||
team:
|
team:
|
||||||
- 'Administration'
|
- 'Administration'
|
||||||
|
custom_role: 'Analytics Specialist'
|
||||||
- name: 'Rolando Silva'
|
- name: 'Rolando Silva'
|
||||||
gender: male
|
gender: male
|
||||||
email: 'rolando@paperlayer.test'
|
email: 'rolando@paperlayer.test'
|
||||||
team:
|
team:
|
||||||
- 'Administration'
|
- 'Administration'
|
||||||
|
custom_role: 'Junior Agent'
|
||||||
- name: 'Stephanie Wilson'
|
- name: 'Stephanie Wilson'
|
||||||
gender: female
|
gender: female
|
||||||
email: 'stephanie@paperlayer.test'
|
email: 'stephanie@paperlayer.test'
|
||||||
team:
|
team:
|
||||||
- 'Administration'
|
- 'Administration'
|
||||||
|
custom_role: 'Escalation Handler'
|
||||||
- name: 'Jordan Garfield'
|
- name: 'Jordan Garfield'
|
||||||
gender: male
|
gender: male
|
||||||
email: 'jorodan@paperlayer.test'
|
email: 'jorodan@paperlayer.test'
|
||||||
@@ -111,6 +119,7 @@ users:
|
|||||||
email: 'lonny@paperlayer.test'
|
email: 'lonny@paperlayer.test'
|
||||||
team:
|
team:
|
||||||
- 'Warehouse'
|
- 'Warehouse'
|
||||||
|
custom_role: 'Customer Support Lead'
|
||||||
- name: 'Madge Madsen'
|
- name: 'Madge Madsen'
|
||||||
gender: female
|
gender: female
|
||||||
email: 'madge@paperlayer.test'
|
email: 'madge@paperlayer.test'
|
||||||
@@ -162,6 +171,7 @@ users:
|
|||||||
- name: 'Devon White'
|
- name: 'Devon White'
|
||||||
gender: male
|
gender: male
|
||||||
email: 'devon@paperlayer.test'
|
email: 'devon@paperlayer.test'
|
||||||
|
custom_role: 'Escalation Handler'
|
||||||
- name: 'Kendall'
|
- name: 'Kendall'
|
||||||
gender: male
|
gender: male
|
||||||
email: 'kendall@paperlayer.test'
|
email: 'kendall@paperlayer.test'
|
||||||
@@ -173,6 +183,39 @@ teams:
|
|||||||
- '💼 Management'
|
- '💼 Management'
|
||||||
- '👩💼 Administration'
|
- '👩💼 Administration'
|
||||||
- '🚛 Warehouse'
|
- '🚛 Warehouse'
|
||||||
|
custom_roles:
|
||||||
|
- name: 'Customer Support Lead'
|
||||||
|
description: 'Lead support agent with full conversation and contact management'
|
||||||
|
permissions:
|
||||||
|
- 'conversation_manage'
|
||||||
|
- 'contact_manage'
|
||||||
|
- 'report_manage'
|
||||||
|
- name: 'Sales Representative'
|
||||||
|
description: 'Sales team member with conversation and contact access'
|
||||||
|
permissions:
|
||||||
|
- 'conversation_unassigned_manage'
|
||||||
|
- 'conversation_participating_manage'
|
||||||
|
- 'contact_manage'
|
||||||
|
- name: 'Knowledge Manager'
|
||||||
|
description: 'Manages knowledge base and participates in conversations'
|
||||||
|
permissions:
|
||||||
|
- 'knowledge_base_manage'
|
||||||
|
- 'conversation_participating_manage'
|
||||||
|
- name: 'Junior Agent'
|
||||||
|
description: 'Entry-level agent with basic conversation access'
|
||||||
|
permissions:
|
||||||
|
- 'conversation_participating_manage'
|
||||||
|
- name: 'Analytics Specialist'
|
||||||
|
description: 'Focused on reports and data analysis'
|
||||||
|
permissions:
|
||||||
|
- 'report_manage'
|
||||||
|
- 'conversation_participating_manage'
|
||||||
|
- name: 'Escalation Handler'
|
||||||
|
description: 'Handles unassigned conversations and escalations'
|
||||||
|
permissions:
|
||||||
|
- 'conversation_unassigned_manage'
|
||||||
|
- 'conversation_participating_manage'
|
||||||
|
- 'contact_manage'
|
||||||
labels:
|
labels:
|
||||||
- title: 'billing'
|
- title: 'billing'
|
||||||
color: '#28AD21'
|
color: '#28AD21'
|
||||||
|
|||||||
Reference in New Issue
Block a user