require 'rails_helper' describe "DayLogs", type: :request do let(:user) { create(:user) } let(:mode) { create(:mode, user: user) } let(:day) { Date.parse("2026-01-15") } describe "GET /day_logs/new" do context "when not authenticated" do it "redirects to the login page" do get new_day_log_path expect(response).to redirect_to(new_session_path) end end context "when authenticated" do before { login_as(user) } it "returns http success" do get new_day_log_path expect(response).to have_http_status(:success) end end end describe "POST /day_logs" do context "when not authenticated" do it "redirects to the login page" do post day_logs_path, params: { day_log: { day: day, info: "Une info" } } expect(response).to redirect_to(new_session_path) end end context "when authenticated" do before { login_as(user) } context "with valid params" do context "without mode" do it "creates a day_log" do expect { post day_logs_path, params: { day_log: { day: day, info: "Une info" } } }.to change(DayLog, :count).by(1) end it "does not create a mood" do expect { post day_logs_path, params: { day_log: { day: day, info: "Une info" } } }.not_to change(Mood, :count) end end context "with mode, no existing mood" do it "creates a day_log" do expect { post day_logs_path, params: { day_log: { day: day, info: "Une info", mode_id: mode.id } } }.to change(DayLog, :count).by(1) end it "creates a mood" do expect { post day_logs_path, params: { day_log: { day: day, info: "Une info", mode_id: mode.id } } }.to change(Mood, :count).by(1) end end context "with mode, existing mood" do let!(:existing_mood) { create(:mood, user: user, mode: mode, recorded_at: DateTime.parse("2026-01-15 08:00:00")) } let(:other_mode) { create(:mode, user: user) } it "creates a day_log" do expect { post day_logs_path, params: { day_log: { day: day, info: "Une info", mode_id: other_mode.id } } }.to change(DayLog, :count).by(1) end it "does not create a new mood" do expect { post day_logs_path, params: { day_log: { day: day, info: "Une info", mode_id: other_mode.id } } }.not_to change(Mood, :count) end it "updates the existing mood mode" do post day_logs_path, params: { day_log: { day: day, info: "Une info", mode_id: other_mode.id } } expect(existing_mood.reload.mode).to eq(other_mode) end end it "redirects after creation" do post day_logs_path, params: { day_log: { day: day, info: "Une info" } } expect(response).to have_http_status(:redirect) end end context "with invalid params" do it "does not create a day_log" do expect { post day_logs_path, params: { day_log: { day: nil, info: nil } } }.not_to change(DayLog, :count) end it "returns unprocessable entity" do post day_logs_path, params: { day_log: { day: nil, info: nil } } expect(response).to have_http_status(:unprocessable_entity) end end end end end