Files
Dalan/spec/api/v2/management/service_accounts_spec.rb
2026-08-13 19:56:46 +03:30

374 lines
12 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
require 'pry'
describe API::V2::Management::ServiceAccounts, type: :request do
before do
defaults_for_management_api_v2_security_configuration!
management_api_v2_security_configuration.merge! \
scopes: {
read_service_accounts: { permitted_signers: %i[alex jeff], mandatory_signers: %i[alex] },
write_service_accounts: { permitted_signers: %i[alex jeff], mandatory_signers: %i[alex] }
}
end
let!(:create_member_permission) do
create :permission,
role: 'member'
end
let!(:create_service_account_permission) do
create :permission,
role: 'service_account'
end
let!(:create_admin_permission) do
create :permission,
role: 'admin'
end
let!(:user) { create(:user, role: 'member') }
let!(:service_account) { create(:service_account, user: user) }
describe 'Show service_account info' do
let(:data) do
{
scope: :read_service_accounts
}
end
let(:expected_attributes) do
%i[email uid role level state user created_at updated_at]
end
let(:signers) { %i[alex jeff] }
let(:do_request) do
post_json '/api/v2/management/service_accounts/get',
multisig_jwt_management_api_v2({ data: data }, *signers)
end
it 'reads service_account info by uid' do
data[:uid] = service_account.uid
do_request
expect(response.status).to eq 200
expect(json_body.keys).to eq expected_attributes
end
it 'reads service_account info by email' do
data[:email] = service_account.email
do_request
expect(response.status).to eq 200
expect(json_body.keys).to eq expected_attributes
end
it 'denies when uid is not found' do
data[:uid] = 'invalid'
do_request
expect(response.status).to eq 404
end
it 'denies when email is not found' do
data[:email] = 'invalid'
do_request
expect(response.status).to eq 404
end
end
describe 'Returns array of service accounts as collection' do
let(:data) do
{
scope: :read_service_accounts
}
end
let(:signers) { %i[alex jeff] }
let(:do_request) do
post_json '/api/v2/management/service_accounts/list',
multisig_jwt_management_api_v2({ data: data }, *signers)
end
context 'service_accounts' do
let!(:test_service_account) { create(:service_account, email: 'testa@gmail.com', user: user) }
let!(:second_service_account) { create(:service_account, email: 'testb@gmail.com', user: user) }
let!(:third_service_account) { create(:service_account, email: 'testd@gmail.com', user: user) }
let!(:fourth_service_account) { create(:service_account, email: 'testc@gmail.com', user: user) }
include_context 'bearer authentication'
let(:do_service_accounts_request) do
post_json '/api/v2/management/service_accounts/get',
multisig_jwt_management_api_v2({ data: data }), headers: auth_header
end
it 'denies access for user JWT instead of management signature' do
do_service_accounts_request
expect(response.status).to eq 401
end
it 'denies access unless enough signatures are supplied' do
signers.clear.concat %i[james jeff]
do_request
expect(response.status).to eq 401
end
it 'returns list of service_accounts' do
do_request
service_accounts = JSON.parse(response.body)
expect(ServiceAccount.count).to eq service_accounts.count
end
context 'pagination test' do
let(:service_account_list_params) do
{
scope: :read_users,
limit: 2
}
end
it 'returns 1st page as default, limit 2 users per page' do
service_account_list_params[:page] = 1
post_json '/api/v2/management/service_accounts/list', multisig_jwt_management_api_v2({ data: service_account_list_params }, *signers), headers: auth_header
expect(response.headers.fetch('Total')).to eq ServiceAccount.all.count.to_s
expect(response.headers.fetch('Page')).to eq '1'
expect(response.headers.fetch('Per-Page')).to eq '2'
end
it 'returns 2nd page, limit 2 users per page' do
service_account_list_params[:page] = 2
post_json '/api/v2/management/service_accounts/list', multisig_jwt_management_api_v2({ data: service_account_list_params }, *signers), headers: auth_header
expect(response.headers.fetch('Total')).to eq ServiceAccount.all.count.to_s
expect(response.headers.fetch('Page')).to eq '2'
expect(response.headers.fetch('Per-Page')).to eq '2'
end
end
end
end
describe 'Create a service account' do
let(:signers) { %i[alex jeff] }
let(:data) { params.merge(scope: :write_service_accounts) }
let(:do_request) do
post_json '/api/v2/management/service_accounts/create',
multisig_jwt_management_api_v2({ data: data }, *signers)
end
context 'when uid is present' do
context 'when email is valid' do
let(:params) do
{
service_account_email: 'valid_email@example.com',
service_account_uid: 'Fai5aesoLEcx',
service_account_role: 'admin',
owner_uid: user.uid
}
end
it 'creates a service account' do
expect { do_request }.to change { ServiceAccount.count }.by(1)
expect_status_to_eq 201
end
end
context 'when params are blank' do
let(:params) { {} }
it 'renders an error' do
do_request
expect_status_to_eq 422
expect_body.to eq(error: 'service_account_role is missing, service_account_role is empty')
end
end
context 'when email is bad' do
let(:params) { { service_account_email: 'bad_email', service_account_uid: 'Fai5aesoLEcx', service_account_role: 'member', owner_uid: user.uid } }
it 'renders an error' do
expect { do_request }.to_not change { ServiceAccount.count }
expect_status_to_eq 422
expect_body.to eq(error: ['Email is invalid'])
end
end
context 'when role does not exist' do
let(:params) { { service_account_email: 'valid_email@example.com', service_account_uid: 'Fai5aesoLEcx', service_account_role: 'invalid', owner_uid: user.uid } }
it 'renders an error' do
expect { do_request }.to_not change { ServiceAccount.count }
expect_status_to_eq 422
expect_body.to eq(error: ['Role doesnt_exist'])
end
end
context 'when uid is not uniq, the same as user one' do
let(:params) { { service_account_email: 'valid_email@example.com', service_account_uid: user.uid, service_account_role: 'member', owner_uid: user.uid } }
it 'renders an error' do
expect { do_request }.to_not change { ServiceAccount.count }
expect_status_to_eq 422
expect(json_body[:error].first).to include 'Email or uid not_uniq'
end
end
end
end
describe 'Update a service account' do
let(:signers) { %i[alex jeff] }
let(:data) { params.merge(scope: :write_service_accounts) }
let!(:service_account) { create(:service_account, :without_user) }
let(:do_request) do
post_json '/api/v2/management/service_accounts/update',
multisig_jwt_management_api_v2({ data: data }, *signers)
end
context 'when params are blank' do
let(:params) { {} }
it 'renders an error' do
do_request
expect_status_to_eq 422
expect_body.to eq(error: 'uid is missing, uid is empty')
end
end
context 'when service account doesnt exists' do
let(:params) do
{
uid: 'example'
}
end
it 'renders an error' do
do_request
expect_status_to_eq 422
expect_body.to eq(error: 'Service account doesnt exist')
end
end
context 'update service account' do
context do
let(:params) do
{
uid: service_account.uid
}
end
context 'service account without user' do
it 'shouldnt modify service account' do
do_request
expect_status_to_eq 201
res = JSON.parse(response.body)
expect(res['state']).to eq 'pending'
expect(res['level']).to eq 0
expect(res['user']).to eq nil
end
end
context 'service account with user' do
let!(:service_account) { create(:service_account) }
it 'shouldnt modify service account' do
owner = service_account.user
do_request
expect_status_to_eq 201
res = JSON.parse(response.body)
expect(res['state']).to eq owner.state
expect(res['level']).to eq owner.level
expect(res['user']['uid']).to eq owner.uid
end
end
end
context do
context 'service account without user' do
let!(:user_with_phone) { create(:user, :with_phone) }
let(:params) do
{
uid: service_account.uid,
owner_uid: user_with_phone.uid
}
end
it 'should modify service account' do
expect(service_account.level).to eq 0
expect(service_account.state).to eq 'pending'
expect(service_account.user).to eq nil
do_request
expect_status_to_eq 201
res = JSON.parse(response.body)
expect(res['user']['uid']).to eq user_with_phone.uid
expect(res['level']).to eq user_with_phone.level
expect(res['state']).to eq user_with_phone.state
end
end
context 'service account with user' do
let!(:user_with_phone) { create(:user, :with_phone) }
let!(:user_with_profile) { create(:user, :with_profile) }
let!(:service_account) { create(:service_account, user: user_with_phone)}
let(:params) do
{
uid: service_account.uid,
owner_uid: user_with_profile.uid
}
end
it 'should modify service account' do
expect(service_account.level).to eq user_with_phone.level
expect(service_account.state).to eq user_with_phone.state
expect(service_account.user.uid).to eq user_with_phone.uid
do_request
expect_status_to_eq 201
res = JSON.parse(response.body)
expect(res['user']['uid']).to eq user_with_profile.uid
expect(res['level']).to eq user_with_profile.level
expect(res['state']).to eq user_with_profile.state
end
end
end
end
end
describe 'Delete a service account' do
let(:signers) { %i[alex jeff] }
let(:data) { params.merge(scope: :write_service_accounts) }
let(:do_request) do
post_json '/api/v2/management/service_accounts/delete',
multisig_jwt_management_api_v2({ data: data }, *signers)
end
context do
let(:params) { { uid: service_account.uid } }
it do
do_request
expect_status_to_eq 200
service_account = JSON.parse(response.body)
expect(service_account['state']).to eq 'disabled'
end
end
context 'when params are blank' do
let(:params) { {} }
it 'renders an error' do
do_request
expect_status_to_eq 422
expect_body.to eq(error: 'uid is missing, uid is empty')
end
end
end
end