diff options
Diffstat (limited to 'spec/lib/gitlab/spamcheck/client_spec.rb')
-rw-r--r-- | spec/lib/gitlab/spamcheck/client_spec.rb | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/spec/lib/gitlab/spamcheck/client_spec.rb b/spec/lib/gitlab/spamcheck/client_spec.rb new file mode 100644 index 00000000000..491e5e9a662 --- /dev/null +++ b/spec/lib/gitlab/spamcheck/client_spec.rb @@ -0,0 +1,121 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Spamcheck::Client do + include_context 'includes Spam constants' + + let(:endpoint) { 'grpc://grpc.test.url' } + let_it_be(:user) { create(:user, organization: 'GitLab') } + let(:verdict_value) { nil } + let(:error_value) { "" } + + let(:attribs_value) do + extra_attributes = Google::Protobuf::Map.new(:string, :string) + extra_attributes["monitorMode"] = "false" + extra_attributes + end + + let_it_be(:issue) { create(:issue, description: 'Test issue description') } + + let(:response) do + verdict = ::Spamcheck::SpamVerdict.new + verdict.verdict = verdict_value + verdict.error = error_value + verdict.extra_attributes = attribs_value + verdict + end + + subject { described_class.new.issue_spam?(spam_issue: issue, user: user) } + + before do + stub_application_setting(spam_check_endpoint_url: endpoint) + end + + describe '#issue_spam?' do + before do + allow_next_instance_of(::Spamcheck::SpamcheckService::Stub) do |instance| + allow(instance).to receive(:check_for_spam_issue).and_return(response) + end + end + + using RSpec::Parameterized::TableSyntax + + where(:verdict, :expected) do + ::Spamcheck::SpamVerdict::Verdict::ALLOW | Spam::SpamConstants::ALLOW + ::Spamcheck::SpamVerdict::Verdict::CONDITIONAL_ALLOW | Spam::SpamConstants::CONDITIONAL_ALLOW + ::Spamcheck::SpamVerdict::Verdict::DISALLOW | Spam::SpamConstants::DISALLOW + ::Spamcheck::SpamVerdict::Verdict::BLOCK | Spam::SpamConstants::BLOCK_USER + ::Spamcheck::SpamVerdict::Verdict::NOOP | Spam::SpamConstants::NOOP + end + + with_them do + let(:verdict_value) { verdict } + + it "returns expected spam constant" do + expect(subject).to eq([expected, { "monitorMode" => "false" }, ""]) + end + end + end + + describe "#build_issue_protobuf", :aggregate_failures do + it 'builds the expected protobuf object' do + cxt = { action: :create } + issue_pb = described_class.new.send(:build_issue_protobuf, + issue: issue, user: user, + context: cxt) + expect(issue_pb.title).to eq issue.title + expect(issue_pb.description).to eq issue.description + expect(issue_pb.user_in_project). to be false + expect(issue_pb.project.project_id).to eq issue.project_id + expect(issue_pb.created_at).to eq timestamp_to_protobuf_timestamp(issue.created_at) + expect(issue_pb.updated_at).to eq timestamp_to_protobuf_timestamp(issue.updated_at) + expect(issue_pb.action).to be ::Spamcheck::Action.lookup(::Spamcheck::Action::CREATE) + expect(issue_pb.user.username).to eq user.username + end + end + + describe '#build_user_proto_buf', :aggregate_failures do + it 'builds the expected protobuf object' do + user_pb = described_class.new.send(:build_user_protobuf, user) + expect(user_pb.username).to eq user.username + expect(user_pb.org).to eq user.organization + expect(user_pb.created_at).to eq timestamp_to_protobuf_timestamp(user.created_at) + expect(user_pb.emails.count).to be 1 + expect(user_pb.emails.first.email).to eq user.email + expect(user_pb.emails.first.verified).to eq user.confirmed? + end + + context 'when user has multiple email addresses' do + let(:secondary_email) {create(:email, :confirmed, user: user)} + + before do + user.emails << secondary_email + end + + it 'adds emails to the user pb object' do + user_pb = described_class.new.send(:build_user_protobuf, user) + expect(user_pb.emails.count).to eq 2 + expect(user_pb.emails.first.email).to eq user.email + expect(user_pb.emails.first.verified).to eq user.confirmed? + expect(user_pb.emails.last.email).to eq secondary_email.email + expect(user_pb.emails.last.verified).to eq secondary_email.confirmed? + end + end + end + + describe "#build_project_protobuf", :aggregate_failures do + it 'builds the expected protobuf object' do + project_pb = described_class.new.send(:build_project_protobuf, issue) + expect(project_pb.project_id).to eq issue.project_id + expect(project_pb.project_path).to eq issue.project.full_path + end + end + + private + + def timestamp_to_protobuf_timestamp(timestamp) + Google::Protobuf::Timestamp.new(seconds: timestamp.to_time.to_i, + nanos: timestamp.to_time.nsec) + end +end |