55 lines
1.8 KiB
Ruby
55 lines
1.8 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require 'spec_helper'
|
||
|
|
||
|
RSpec.describe ExperimentSubject, type: :model do
|
||
|
describe 'associations' do
|
||
|
it { is_expected.to belong_to(:experiment) }
|
||
|
it { is_expected.to belong_to(:user) }
|
||
|
it { is_expected.to belong_to(:group) }
|
||
|
it { is_expected.to belong_to(:project) }
|
||
|
end
|
||
|
|
||
|
describe 'validations' do
|
||
|
it { is_expected.to validate_presence_of(:experiment) }
|
||
|
|
||
|
describe 'must_have_one_subject_present' do
|
||
|
let(:experiment_subject) { build(:experiment_subject, user: nil, group: nil, project: nil) }
|
||
|
let(:error_message) { 'Must have exactly one of User, Group, or Project.' }
|
||
|
|
||
|
it 'fails when no subject is present' do
|
||
|
expect(experiment_subject).not_to be_valid
|
||
|
expect(experiment_subject.errors[:base]).to include(error_message)
|
||
|
end
|
||
|
|
||
|
it 'passes when user subject is present' do
|
||
|
experiment_subject.user = build(:user)
|
||
|
expect(experiment_subject).to be_valid
|
||
|
end
|
||
|
|
||
|
it 'passes when group subject is present' do
|
||
|
experiment_subject.group = build(:group)
|
||
|
expect(experiment_subject).to be_valid
|
||
|
end
|
||
|
|
||
|
it 'passes when project subject is present' do
|
||
|
experiment_subject.project = build(:project)
|
||
|
expect(experiment_subject).to be_valid
|
||
|
end
|
||
|
|
||
|
it 'fails when more than one subject is present', :aggregate_failures do
|
||
|
# two subjects
|
||
|
experiment_subject.user = build(:user)
|
||
|
experiment_subject.group = build(:group)
|
||
|
expect(experiment_subject).not_to be_valid
|
||
|
expect(experiment_subject.errors[:base]).to include(error_message)
|
||
|
|
||
|
# three subjects
|
||
|
experiment_subject.project = build(:project)
|
||
|
expect(experiment_subject).not_to be_valid
|
||
|
expect(experiment_subject.errors[:base]).to include(error_message)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|