From d6fba7e6e8b0286aa4958b6e67eb3354e6660f6e Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Fri, 20 Mar 2026 18:13:12 +0100 Subject: [PATCH] valid mood unique per day per user --- app/models/mood.rb | 15 ++++++++++++++ spec/factories/moods.rb | 4 ++-- spec/models/mood_spec.rb | 45 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 59 insertions(+), 5 deletions(-) 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