176 lines
5.2 KiB
Ruby
176 lines
5.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Users::CreateService, feature_category: :user_management do
|
|
describe '#execute' do
|
|
let(:password) { User.random_password }
|
|
let(:admin_user) { create(:admin) }
|
|
|
|
context 'with an admin user' do
|
|
let(:service) { described_class.new(admin_user, params) }
|
|
let(:email) { 'jd@example.com' }
|
|
|
|
context 'when required parameters are provided' do
|
|
let(:params) do
|
|
{ name: 'John Doe', username: 'jduser', email: email, password: password }
|
|
end
|
|
|
|
it 'returns a persisted user' do
|
|
expect(service.execute).to be_persisted
|
|
end
|
|
|
|
it 'persists the given attributes' do
|
|
user = service.execute
|
|
user.reload
|
|
|
|
expect(user).to have_attributes(
|
|
name: params[:name],
|
|
username: params[:username],
|
|
email: params[:email],
|
|
password: params[:password],
|
|
created_by_id: admin_user.id
|
|
)
|
|
end
|
|
|
|
context 'when the current_user is not persisted' do
|
|
let(:admin_user) { build(:admin) }
|
|
|
|
it 'persists the given attributes and sets created_by_id to nil' do
|
|
user = service.execute
|
|
user.reload
|
|
|
|
expect(user).to have_attributes(
|
|
name: params[:name],
|
|
username: params[:username],
|
|
email: params[:email],
|
|
password: params[:password],
|
|
created_by_id: nil
|
|
)
|
|
end
|
|
end
|
|
|
|
it 'user is not confirmed if skip_confirmation param is not present' do
|
|
expect(service.execute).not_to be_confirmed
|
|
end
|
|
|
|
it 'logs the user creation' do
|
|
expect(service).to receive(:log_info).with("User \"John Doe\" (jd@example.com) was created")
|
|
|
|
service.execute
|
|
end
|
|
|
|
it 'executes system hooks' do
|
|
system_hook_service = spy(:system_hook_service)
|
|
|
|
expect(service).to receive(:system_hook_service).and_return(system_hook_service)
|
|
|
|
user = service.execute
|
|
|
|
expect(system_hook_service).to have_received(:execute_hooks_for).with(user, :create)
|
|
end
|
|
|
|
it 'does not send a notification email' do
|
|
notification_service = spy(:notification_service)
|
|
|
|
expect(service).not_to receive(:notification_service)
|
|
|
|
service.execute
|
|
|
|
expect(notification_service).not_to have_received(:new_user)
|
|
end
|
|
end
|
|
|
|
context 'when force_random_password parameter is true' do
|
|
let(:params) do
|
|
{ name: 'John Doe', username: 'jduser', email: 'jd@example.com', password: password, force_random_password: true }
|
|
end
|
|
|
|
it 'generates random password' do
|
|
user = service.execute
|
|
|
|
expect(user.password).not_to eq password
|
|
expect(user.password).to be_present
|
|
end
|
|
end
|
|
|
|
context 'when password_automatically_set parameter is true' do
|
|
let(:params) do
|
|
{
|
|
name: 'John Doe',
|
|
username: 'jduser',
|
|
email: 'jd@example.com',
|
|
password: password,
|
|
password_automatically_set: true
|
|
}
|
|
end
|
|
|
|
it 'persists the given attributes' do
|
|
user = service.execute
|
|
user.reload
|
|
|
|
expect(user).to have_attributes(
|
|
name: params[:name],
|
|
username: params[:username],
|
|
email: params[:email],
|
|
password: params[:password],
|
|
created_by_id: admin_user.id,
|
|
password_automatically_set: params[:password_automatically_set]
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'when skip_confirmation parameter is true' do
|
|
let(:params) do
|
|
{ name: 'John Doe', username: 'jduser', email: 'jd@example.com', password: password, skip_confirmation: true }
|
|
end
|
|
|
|
it 'confirms the user' do
|
|
expect(service.execute).to be_confirmed
|
|
end
|
|
end
|
|
|
|
context 'when reset_password parameter is true' do
|
|
let(:params) do
|
|
{ name: 'John Doe', username: 'jduser', email: 'jd@example.com', password: password, reset_password: true }
|
|
end
|
|
|
|
it 'resets password even if a password parameter is given' do
|
|
expect(service.execute).to be_recently_sent_password_reset
|
|
end
|
|
|
|
it 'sends a notification email' do
|
|
notification_service = spy(:notification_service)
|
|
|
|
expect(service).to receive(:notification_service).and_return(notification_service)
|
|
|
|
user = service.execute
|
|
|
|
expect(notification_service).to have_received(:new_user).with(user, an_instance_of(String))
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with nil user' do
|
|
let(:params) do
|
|
{ name: 'John Doe', username: 'jduser', email: 'jd@example.com', password: password, skip_confirmation: true }
|
|
end
|
|
|
|
let(:service) { described_class.new(nil, params) }
|
|
|
|
it 'persists the given attributes' do
|
|
user = service.execute
|
|
user.reload
|
|
|
|
expect(user).to have_attributes(
|
|
name: params[:name],
|
|
username: params[:username],
|
|
email: params[:email],
|
|
password: params[:password],
|
|
created_by_id: nil,
|
|
admin: false
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|