97 lines
2.6 KiB
Ruby
97 lines
2.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
require 'pry'
|
|
|
|
describe API::V2::Management::Otp, type: :request do
|
|
before do
|
|
defaults_for_management_api_v2_security_configuration!
|
|
management_api_v2_security_configuration.merge! \
|
|
scopes: {
|
|
otp_sign: { permitted_signers: %i[alex jeff], mandatory_signers: %i[alex] }
|
|
}
|
|
end
|
|
let!(:create_admin_permission) do
|
|
create :permission,
|
|
role: 'admin'
|
|
end
|
|
let!(:create_member_permission) do
|
|
create :permission,
|
|
role: 'member'
|
|
end
|
|
let!(:user) { create(:user, otp: otp_enabled) }
|
|
|
|
describe 'POST /otp/sign' do
|
|
let(:data) do
|
|
{
|
|
user_uid: user.uid,
|
|
otp_code: valid_otp_code,
|
|
jwt: jwt
|
|
}
|
|
end
|
|
let(:signers) { %i[alex jeff] }
|
|
let(:valid_otp_code) { '1111' }
|
|
let(:invalid_otp_code) { '1234' }
|
|
let(:jwt) { applogic_signed_jwt(amount: '1 BTC') }
|
|
let(:otp_enabled) { true }
|
|
let(:do_request) do
|
|
post_json '/api/v2/management/otp/sign',
|
|
multisig_jwt_management_api_v2({ data: data }, *signers)
|
|
end
|
|
let(:valid_payload_keys) do
|
|
%i[payload signatures]
|
|
end
|
|
|
|
before do
|
|
allow(TOTPService).to receive(:validate?)
|
|
.with(user.uid, valid_otp_code) { true }
|
|
allow(TOTPService).to receive(:validate?)
|
|
.with(user.uid, invalid_otp_code) { false }
|
|
end
|
|
|
|
it 'signs a request' do
|
|
do_request
|
|
expect(json_body.keys).to eq(valid_payload_keys)
|
|
expect(response.status).to eq 201
|
|
end
|
|
|
|
it 'renders an error when jwt is not a Hash' do
|
|
data[:jwt] = 'invalid'
|
|
do_request
|
|
expect_body.to eq(error: 'jwt is invalid')
|
|
expect(response.status).to eq 422
|
|
end
|
|
|
|
it 'renders an error when jwt is not RFC' do
|
|
data[:jwt] = { data: 'invalid' }
|
|
do_request
|
|
expect(json_body[:error]).to include('JWT is invalid by the reason')
|
|
expect(response.status).to eq 422
|
|
end
|
|
|
|
it 'renders an error when otp code is invalid' do
|
|
data[:otp_code] = invalid_otp_code
|
|
do_request
|
|
expect_body.to eq(error: 'OTP code is invalid')
|
|
expect(response.status).to eq 422
|
|
end
|
|
|
|
it 'renders an error when account is not found' do
|
|
data[:user_uid] = 'invalid'
|
|
do_request
|
|
expect_body.to eq error: 'Record is not found'
|
|
expect(response.status).to eq 404
|
|
end
|
|
|
|
context 'when data is blank' do
|
|
let(:data) { {} }
|
|
|
|
it 'renders errors' do
|
|
do_request
|
|
expect_body.to eq(error: "user_uid is missing, user_uid is empty, otp_code is missing, otp_code is empty, jwt is missing, jwt is empty")
|
|
expect(response.status).to eq 422
|
|
end
|
|
end
|
|
end
|
|
end
|