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

203 lines
7.4 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
describe API::V2::Admin::Restrictions do
include_context 'bearer authentication'
before { create(:permission, role: 'superadmin') }
let!(:test_user) { create(:user, role: 'superadmin') }
describe 'GET /api/v2/admin/restrictions' do
before do
create(:restriction, scope: 'ip', value: '0.0.0.1', category: 'blacklist', updated_at: 1.days.ago)
create(:restriction, scope: 'ip', value: '0.0.0.0', category: 'blacklist', updated_at: 3.days.ago)
create(:restriction, scope: 'ip_subnet', value: '1.2.3.4/24', category: 'blacklist', updated_at: 3.days.ago)
end
context 'successful response' do
it 'returns all restrictions' do
get '/api/v2/admin/restrictions', headers: auth_header
expect(response).to be_successful
expect(json_body.count).to eq(Restriction.count)
end
it 'filters by scope' do
get '/api/v2/admin/restrictions', headers: auth_header, params: { scope: 'ip' }
expect(json_body.length).to eq Restriction.where(scope: 'ip').count
expect(json_body.map { |r| r[:scope] }).to all eq 'ip'
end
it 'filters by category' do
get '/api/v2/admin/restrictions', headers: auth_header, params: { category: 'blacklist' }
expect(json_body.length).to eq Restriction.where(category: 'blacklist').count
expect(json_body.map { |r| r[:category] }).to all eq 'blacklist'
end
it 'filters with date range' do
get '/api/v2/admin/restrictions', headers: auth_header, params: { from: 2.days.ago.to_i, range: 'updated' }
expected = Restriction.where("updated_at >= ?", 2.days.ago)
expect(json_body.map { |r| r[:id] }).to match_array expected.map(&:id)
end
it 'returns paginated restrictions' do
get '/api/v2/admin/restrictions', headers: auth_header, params: { limit: 1 }
result = json_body
expect(response).to be_successful
expect(response.headers.fetch('Total')).to eq '3'
expect(result.size).to eq 1
end
end
end
describe 'POST /api/v2/admin/whitelink' do
context 'with default expire time' do
it 'create a whitelink token' do
post '/api/v2/admin/restrictions/whitelink', headers: auth_header
expect(response).to be_successful
expect(json_body[:whitelink_token]).not_to be nil
end
end
context 'with custom expire time' do
it 'create a whitelink token' do
post '/api/v2/admin/restrictions/whitelink', headers: auth_header, params: { expire_time: 30 }
expect(response).to be_successful
expect(json_body[:whitelink_token]).not_to be nil
end
it 'returns error if expire time too big' do
post '/api/v2/admin/restrictions/whitelink', headers: auth_header, params: { expire_time: 31 }
expect(response.status).to eq 422
expect(json_body[:whitelink_token]).to be nil
expect(json_body[:errors]).to include "invalid_expire"
end
end
end
describe 'POST /api/v2/admin/restrictions' do
it 'creates new restriction' do
expect {
post '/api/v2/admin/restrictions', headers: auth_header, params: { scope: 'ip', value: '127.0.0.0', category: 'blacklist' }
}.to change { Restriction.count }.by(1)
expect(response).to be_successful
end
it 'creates new restriction with code' do
expect {
post '/api/v2/admin/restrictions', headers: auth_header, params: { scope: 'ip', value: '127.0.0.0', category: 'blacklist', code: 522 }
}.to change { Restriction.count }.by(1)
expect(response).to be_successful
end
it 'creates new whitelist restriction' do
expect {
post '/api/v2/admin/restrictions', headers: auth_header, params: { scope: 'ip', value: '127.0.0.0', category: 'whitelist' }
}.to change { Restriction.count }.by(1)
expect(response).to be_successful
end
it 'creates new maintenance restriction' do
expect {
post '/api/v2/admin/restrictions', headers: auth_header, params: { scope: 'ip', value: '127.0.0.0', category: 'maintenance' }
}.to change { Restriction.count }.by(1)
expect(response).to be_successful
end
context 'validation' do
it 'scope and state' do
post '/api/v2/admin/restrictions', headers: auth_header, params: { scope: 'office', value: '127.0.0.0', state: 'running' }
expect(json_body[:errors]).to include "admin.restriction.invalid_scope"
expect(json_body[:errors]).to include "admin.restriction.invalid_state"
end
it 'value' do
post '/api/v2/admin/restrictions', headers: auth_header, params: { scope: 'ip', value: '127.a.b.c', category: 'blacklist' }
expect(json_body[:errors]).to include "value.invalid"
end
it 'category' do
post '/api/v2/admin/restrictions', headers: auth_header, params: { scope: 'country', value: 'Ukraine', category: 'allow' }
expect(json_body[:errors]).to include "admin.restriction.invalid_category"
end
end
end
describe 'PUT /api/v2/admin/restrictions' do
let!(:restriction) { create(:restriction, scope: 'ip', value: '127.0.0.1', category: 'blacklist') }
it 'updates state' do
expect {
put '/api/v2/admin/restrictions', headers: auth_header, params: { id: restriction.id, state: 'disabled' }
}.to change { restriction.reload.state }.to('disabled')
end
it 'updates value' do
expect {
put '/api/v2/admin/restrictions', headers: auth_header, params: { id: restriction.id, value: '192.168.0.1' }
}.to change { restriction.reload.value }.to('192.168.0.1')
end
it 'does not change scope if value becomes invalid' do
expect {
put '/api/v2/admin/restrictions', headers: auth_header, params: { id: restriction.id, scope: 'ip_subnet' }
}.not_to change { restriction.reload.scope }
end
it 'validates value' do
put '/api/v2/admin/restrictions', headers: auth_header, params: { id: restriction.id, value: '192.168.0.abc' }
expect(response).not_to be_successful
end
it 'updates scope' do
expect {
put '/api/v2/admin/restrictions', headers: auth_header, params: { id: restriction.id, scope: 'ip_subnet', value: '192.168.0.1/24' }
}.to change { restriction.reload.scope }.to('ip_subnet').and change { restriction.reload.value }.to '192.168.0.1/24'
end
it 'updates category' do
expect {
put '/api/v2/admin/restrictions', headers: auth_header, params: { id: restriction.id, category: 'whitelist' }
}.to change { restriction.reload.category }.to('whitelist')
end
end
describe 'DELETE /api/v2/admin/restrictions' do
let!(:restriction) { create(:restriction, scope: 'ip', value: '127.0.0.1', category: 'blacklist') }
context 'successful response' do
let(:do_request) { delete '/api/v2/admin/restrictions', params: { id: restriction.id }, headers: auth_header }
it 'delete restriction' do
expect { do_request }.to change { Restriction.count }.by(-1)
expect(response).to be_successful
end
end
context 'unsuccessful response' do
it 'return error while restriction doesnt exist' do
delete '/api/v2/admin/restrictions', headers: auth_header, params: { id: 0 }
result = JSON.parse(response.body)
expect(response.code).to eq '404'
expect(result['errors']).to eq(['admin.restriction.doesnt_exist'])
end
end
end
end