debian-mirror-gitlab/spec/models/service_desk/custom_email_verification_spec.rb
2023-07-09 08:55:56 +05:30

170 lines
4.7 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe ServiceDesk::CustomEmailVerification, feature_category: :service_desk do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
let(:generate_token_pattern) { /\A\p{Alnum}{12}\z/ }
describe '.generate_token' do
it 'matches expected output' do
expect(described_class.generate_token).to match(generate_token_pattern)
end
end
describe 'validations' do
subject { build(:service_desk_custom_email_verification, project: project) }
it { is_expected.to validate_presence_of(:project) }
it { is_expected.to validate_presence_of(:state) }
context 'when status is :started' do
before do
subject.mark_as_started!(user)
end
it { is_expected.to validate_presence_of(:token) }
it { is_expected.to validate_length_of(:token).is_equal_to(12) }
it 'matches .generate_token pattern' do
expect(subject.token).to match(generate_token_pattern)
end
it { is_expected.to validate_presence_of(:triggerer) }
it { is_expected.to validate_presence_of(:triggered_at) }
it { is_expected.to validate_absence_of(:error) }
end
context 'when status is :finished' do
before do
subject.mark_as_started!(user)
subject.mark_as_finished!
end
it { is_expected.to validate_absence_of(:token) }
it { is_expected.to validate_absence_of(:error) }
end
context 'when status is :failed' do
before do
subject.mark_as_started!(user)
subject.mark_as_failed!(:smtp_host_issue)
end
it { is_expected.to validate_presence_of(:error) }
it { is_expected.to validate_absence_of(:token) }
end
end
describe 'status state machine' do
subject { build(:service_desk_custom_email_verification, project: project) }
describe 'transitioning to started' do
it 'records the started at time and generates token' do
subject.mark_as_started!(user)
is_expected.to be_started
expect(subject.token).to be_present
expect(subject.triggered_at).to be_present
expect(subject.triggerer).to eq(user)
end
end
describe 'transitioning to finished' do
it 'removes the generated token' do
subject.mark_as_started!(user)
subject.mark_as_finished!
is_expected.to be_finished
expect(subject.token).not_to be_present
end
end
describe 'transitioning to failed' do
let(:error) { :smtp_host_issue }
it 'removes the generated token' do
subject.mark_as_started!(user)
subject.mark_as_failed!(error)
is_expected.to be_failed
expect(subject.token).not_to be_present
expect(subject.error).to eq(error.to_s)
end
end
end
describe '#accepted_until' do
it 'returns nil' do
expect(subject.accepted_until).to be_nil
end
context 'when state is :started and successfully transitioned' do
let(:triggered_at) { 2.minutes.ago }
before do
subject.project = project
subject.mark_as_started!(user)
end
it 'returns correct timeframe end time' do
expect(subject.accepted_until).to eq(described_class::TIMEFRAME.since(subject.triggered_at))
end
context 'when triggered_at is not set' do
it 'returns nil' do
subject.triggered_at = nil
expect(subject.accepted_until).to be nil
end
end
end
end
describe '#in_timeframe?' do
it { is_expected.not_to be_in_timeframe }
context 'when state is :started and successfully transitioned' do
before do
subject.project = project
subject.mark_as_started!(user)
end
it { is_expected.to be_in_timeframe }
context 'and timeframe was missed' do
before do
subject.triggered_at = (described_class::TIMEFRAME + 1).ago
end
it { is_expected.not_to be_in_timeframe }
end
end
end
describe 'encrypted #token' do
let(:token) { 'XXXXXXXXXXXX' }
subject { build_stubbed(:service_desk_custom_email_verification, token: token) }
it 'saves and retrieves the encrypted token and iv correctly' do
expect(subject.encrypted_token).not_to be_nil
expect(subject.encrypted_token_iv).not_to be_nil
expect(subject.token).to eq(token)
end
end
describe 'associations' do
it { is_expected.to belong_to(:project) }
it { is_expected.to belong_to(:triggerer) }
it 'can access service desk setting from project' do
subject.project = project
setting = build_stubbed(:service_desk_setting, project: subject.project)
expect(subject.service_desk_setting).to eq(setting)
end
end
end