diff --git a/app/models/vote.rb b/app/models/vote.rb index 2ce0e671..64ab74de 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -4,6 +4,8 @@ class Vote < ApplicationRecord belongs_to :user belongs_to :event + validates :user_id, uniqueness: { scope: :event_id } + has_paper_trail ignore: [:updated_at], meta: { conference_id: :conference_id } delegate :name, to: :user diff --git a/spec/models/vote_spec.rb b/spec/models/vote_spec.rb new file mode 100644 index 00000000..39afb352 --- /dev/null +++ b/spec/models/vote_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Vote do + let!(:vote) { create(:vote) } + + describe 'validation' do + it 'has a valid factory' do + expect(build(:vote)).to be_valid + end + + it { is_expected.to validate_uniqueness_of(:user_id).scoped_to(:event_id) } + + # This is testing the relationship instead of using the shoulda-matchers + context 'vote with user already exists' do + it 'fails when adding vote twice for user and event' do + expect { create(:vote, user: vote.user, event: vote.event) } + .to raise_error(ActiveRecord::RecordInvalid, 'Validation failed: User has already been taken') + end + end + end +end