# frozen_string_literal: true require 'rails_helper' require 'pry' describe API::V2::Management::Labels, type: :request do before do defaults_for_management_api_v2_security_configuration! management_api_v2_security_configuration.merge! \ scopes: { write_labels: { permitted_signers: %i[alex jeff], mandatory_signers: %i[alex] }, read_labels: { permitted_signers: %i[alex jeff], mandatory_signers: %i[alex] }, read_users: { 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) } let!(:user_with_private_label) { create(:user) } let!(:user_with_public_label) { create(:user) } describe '#filter/users' do let!(:private_label) do create(:label, scope: 'private', key: 'profile', value: 'pending', user: user_with_private_label) end let!(:public_label) do create(:label, scope: 'public', key: 'profile', value: 'pending', user: user_with_public_label) end let(:data) { { key: 'profile', value: 'pending', scope: 'private' } } let(:signers) { %i[alex] } let(:do_request) do post_json '/api/v2/management/labels/filter/users', multisig_jwt_management_api_v2({ data: data }, *signers) end it 'filters users based on label attributes. doesnt mix PUBLIC and PRIVATE labels' do # filtering params key: 'profile', value: 'pending', scope: 'private' do_request expect(json_body.count == 1) expect(json_body.first[:email]).to eq(user_with_private_label.attributes.symbolize_keys[:email]) expect(json_body.first[:uid]).to eq(user_with_private_label.attributes.symbolize_keys[:uid]) end it 'filters users based on label timestamp attributes' do # filtering params key: 'profile', to: 1.day.ago data.clear data[:to] = 1.day.ago.to_i data[:key] = 'profile' public_label.update(created_at: 3.days.ago) do_request expect(json_body.count == 1) expect(json_body.first[:email]).to eq(user_with_public_label.attributes.symbolize_keys[:email]) expect(json_body.first[:uid]).to eq(user_with_public_label.attributes.symbolize_keys[:uid]) end it 'returns empty array if no mathes found' do # filtering params key: 'documents', value: 'pending', scope: 'private' data[:key] = 'documents' do_request expect(json_body.count == 0) expect(json_body).to eq([]) end it 'returns user with profile if extended is true' do data[:extended] = true do_request expect(json_body.first).to include(:profiles) end end describe '#list' do let!(:private_label) do create(:label, scope: 'private', user: user) end let!(:public_label) do create(:label, scope: 'public', user: user) end let(:data) do { user_uid: user.uid } end let(:signers) { %i[alex] } let(:do_request) do post_json '/api/v2/management/labels/list', multisig_jwt_management_api_v2({ data: data }, *signers) end it 'get list of user labels' do do_request expect(response.status).to eq 201 expect(json_body.size).to eq 2 end end describe 'create label' do let(:data) do { user_uid: user.uid, key: 'email', value: 'verified', scope: 'private' } end let(:expected_attributes) do { 'key' => 'email', 'value' => 'verified', 'user_id' => user.id, 'scope' => 'private' } end let(:signers) { %i[alex jeff] } let(:do_request) do post_json '/api/v2/management/labels', multisig_jwt_management_api_v2({ data: data }, *signers) end it 'creates a label' do expect { do_request }.to change { Label.count }.from(0).to(1) expect(response.status).to eq 201 expect(Label.first.attributes).to include(expected_attributes) end it 'denies access unless enough signatures are supplied' do signers.clear.concat %i[james jeff] expect { do_request }.to_not change { Label.count } expect(response.status).to eq 401 end it 'denies when user is not found' do data[:user_uid] = 'invalid' expect { do_request }.to_not change { Label.count } expect(response.status).to eq 404 end context 'when data is blank' do let(:data) { {} } it 'renders errors' do do_request expect(response.status).to eq 422 expect_body.to eq(error: 'user_uid is missing, user_uid is empty, key is missing, key is empty, value is missing, value is empty') end end end describe 'update label' do let!(:label) do create(:label, key: 'email', value: 'verified', scope: 'private', description: 'initial label', user: user) end let(:data) do { user_uid: user.uid, key: 'email', value: 'rejected', description: 'management api label update test' } end let(:signers) { %i[alex jeff] } let(:do_request) do put_json '/api/v2/management/labels', multisig_jwt_management_api_v2({ data: data }, *signers) end it 'updates a label value' do expect { do_request }.to change { label.reload.value }.from('verified').to('rejected') expect(response.status).to eq 200 end it 'updates a label value' do expect { do_request }.to change { label.reload.description }.from('initial label').to('management api label update test') expect(response.status).to eq 200 end it 'denies access unless enough signatures are supplied' do signers.clear.concat %i[james jeff] expect { do_request }.to_not change { label.reload.value } expect(response.status).to eq 401 end it 'denies when user is not found' do data[:user_uid] = 'invalid' expect { do_request }.to_not change { label.reload.value } expect(response.status).to eq 404 end context 'when data is blank' do let(:data) { {} } it 'renders errors' do do_request expect(response.status).to eq 422 expect_body.to eq(error: 'user_uid is missing, user_uid is empty, key is missing, key is empty, value is missing, value is empty') end end context 'when label doesnt exist yet with default replace policy' do let(:data) do { user_uid: user.uid, key: 'phone', value: 'verified' } end it 'creates a label' do expect(user.labels.find_by(key: 'phone')).to eq(nil) do_request expect(response.status).to eq 200 expect(user.labels.find_by(key: 'phone')).not_to eq(nil) end context 'when data is incomplete' do let(:data) do { user_uid: user.uid, key: 'phone' } end it 'receive an error' do expect(user.labels.find_by(key: 'phone')).to eq(nil) do_request expect(response.status).to eq 422 expect(response.body).to eq "{\"error\":\"value is missing, value is empty\"}" expect(user.labels.find_by(key: 'phone')).to eq(nil) end end end context 'when label doesnt exist yet with false replace policy' do let(:data) do { user_uid: user.uid, key: 'phone', value: 'verified', replace: false } end it 'receives an error' do expect(user.labels.find_by(key: 'phone')).to eq(nil) do_request expect(response.status).to eq 404 expect(user.labels.find_by(key: 'phone')).to eq(nil) expect(response.body).to eq "{\"error\":\"label doesnt exist\"}" end end end describe 'delete label' do let!(:label) do create(:label, key: 'email', value: 'verified', scope: 'private', user: user) end let(:data) do { user_uid: user.uid, key: 'email' } end let(:signers) { %i[alex jeff] } let(:do_request) do post_json '/api/v2/management/labels/delete', multisig_jwt_management_api_v2({ data: data }, *signers) end it 'deletes a label' do expect { do_request }.to change { Label.count }.from(1).to(0) expect(response.status).to eq 204 end it 'denies access unless enough signatures are supplied' do signers.clear.concat %i[james jeff] expect { do_request }.to_not change { label.reload.value } expect(response.status).to eq 401 end it 'denies when user is not found' do data[:user_uid] = 'invalid' expect { do_request }.to_not change { label.reload.value } expect(response.status).to eq 404 end end end