diff --git a/app/models/mood.rb b/app/models/mood.rb index c065440..89d5501 100644 --- a/app/models/mood.rb +++ b/app/models/mood.rb @@ -1,4 +1,19 @@ class Mood < ApplicationRecord belongs_to :user belongs_to :mode + + validates :recorded_at, presence: true + validate :unique_per_day_and_user + + private + + def unique_per_day_and_user + return unless recorded_at && user + + existing = user.moods.where.not(id: id).any? do |mood| + mood.recorded_at.to_date == recorded_at.to_date + end + + errors.add(:recorded_at, :taken) if existing + end end diff --git a/spec/factories/moods.rb b/spec/factories/moods.rb index e75d860..127c759 100644 --- a/spec/factories/moods.rb +++ b/spec/factories/moods.rb @@ -1,7 +1,7 @@ FactoryBot.define do factory :mood do - mode { "croisiere" } - recorded_at { DateTime.now } + recorded_at { DateTime.parse("2026-01-15 10:00:00") } association :user + association :mode end end diff --git a/spec/models/mood_spec.rb b/spec/models/mood_spec.rb index 3dc71c8..54ef1b4 100644 --- a/spec/models/mood_spec.rb +++ b/spec/models/mood_spec.rb @@ -1,7 +1,46 @@ require 'rails_helper' -describe Mood, type: :model do - it 'works' do - expect(true) +describe Mood do + let(:user) { create(:user) } + let(:mode) { create(:mode, user: user) } + + subject { build(:mood, user: user, mode: mode, recorded_at: DateTime.parse("2026-01-15 10:00:00")) } + + it { is_expected.to be_valid } + + describe "validations" do + it "is invalid without a user" do + subject.user = nil + expect(subject).not_to be_valid + end + + it "is invalid without a mode" do + subject.mode = nil + expect(subject).not_to be_valid + end + + it "is invalid without a recorded_at" do + subject.recorded_at = nil + expect(subject).not_to be_valid + end + end + + describe "uniqueness per day and user" do + it "is invalid if a mood already exists for the same day and user" do + create(:mood, user: user, mode: mode, recorded_at: DateTime.parse("2026-01-15 18:00:00")) + expect(subject).not_to be_valid + end + + it "is valid if the same day exists but for a different user" do + other_user = create(:user) + other_mode = create(:mode, user: other_user) + create(:mood, user: other_user, mode: other_mode, recorded_at: DateTime.parse("2026-01-15 10:00:00")) + expect(subject).to be_valid + end + + it "is valid if the same user has a mood on a different day" do + create(:mood, user: user, mode: mode, recorded_at: DateTime.parse("2026-01-14 10:00:00")) + expect(subject).to be_valid + end end end