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:
Sojan Jose
2025-05-29 15:17:20 -06:00
committed by GitHub
parent 3548948c92
commit 4ab0b17e6e
2 changed files with 88 additions and 8 deletions

View File

@@ -19,6 +19,7 @@ class Seeders::AccountSeeder
def perform!
set_up_account
seed_teams
seed_custom_roles
set_up_users
seed_labels
seed_canned_responses
@@ -32,6 +33,7 @@ class Seeders::AccountSeeder
@account.labels.destroy_all
@account.inboxes.destroy_all
@account.contacts.destroy_all
@account.custom_roles.destroy_all if @account.respond_to?(:custom_roles)
end
def seed_teams
@@ -40,6 +42,18 @@ class Seeders::AccountSeeder
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
@account_data['labels'].each do |label|
@account.labels.create!(label)
@@ -48,17 +62,34 @@ class Seeders::AccountSeeder
def set_up_users
@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.skip_confirmation!
user_record.save!
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'])
user_record = create_user_record(user)
create_account_user(user_record, user)
add_user_to_teams(user: user_record, teams: user['team']) if user['team'].present?
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:)
teams.each do |team|
team_record = @account.teams.where('name LIKE ?', "%#{team.downcase}%").first if team.present?
@@ -66,6 +97,12 @@ class Seeders::AccountSeeder
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)
count.times do
@account.canned_responses.create(content: Faker::Quote.fortune_cookie, short_code: Faker::Alphanumeric.alpha(number: 10))

View File

@@ -61,41 +61,49 @@ users:
email: 'karn@paperlayer.test'
team:
- 'Sales'
custom_role: 'Sales Representative'
- name: 'Danny Cordray'
gender: female
email: 'danny@paperlayer.test'
team:
- 'Sales'
custom_role: 'Customer Support Lead'
- name: 'Ben Nugent'
gender: male
email: 'ben@paperlayer.test'
team:
- 'Sales'
custom_role: 'Junior Agent'
- name: 'Todd Packer'
gender: male
email: 'todd@paperlayer.test'
team:
- 'Sales'
custom_role: 'Sales Representative'
- name: 'Cathy Simms'
gender: female
email: 'cathy@paperlayer.test'
team:
- 'Administration'
custom_role: 'Knowledge Manager'
- name: 'Hunter Jo'
gender: male
email: 'hunter@paperlayer.test'
team:
- 'Administration'
custom_role: 'Analytics Specialist'
- name: 'Rolando Silva'
gender: male
email: 'rolando@paperlayer.test'
team:
- 'Administration'
custom_role: 'Junior Agent'
- name: 'Stephanie Wilson'
gender: female
email: 'stephanie@paperlayer.test'
team:
- 'Administration'
custom_role: 'Escalation Handler'
- name: 'Jordan Garfield'
gender: male
email: 'jorodan@paperlayer.test'
@@ -111,6 +119,7 @@ users:
email: 'lonny@paperlayer.test'
team:
- 'Warehouse'
custom_role: 'Customer Support Lead'
- name: 'Madge Madsen'
gender: female
email: 'madge@paperlayer.test'
@@ -162,6 +171,7 @@ users:
- name: 'Devon White'
gender: male
email: 'devon@paperlayer.test'
custom_role: 'Escalation Handler'
- name: 'Kendall'
gender: male
email: 'kendall@paperlayer.test'
@@ -173,6 +183,39 @@ teams:
- '💼 Management'
- '👩‍💼 Administration'
- '🚛 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:
- title: 'billing'
color: '#28AD21'