Compare commits

...

3 commits

Author SHA1 Message Date
Christophe Robillard
8a5ed6efc7 add day logs controller 2026-03-19 21:22:05 +01:00
Christophe Robillard
5c67b91302 add username to user factory 2026-03-19 21:22:05 +01:00
Christophe Robillard
962915829f add day_log model 2026-03-19 21:22:05 +01:00
12 changed files with 179 additions and 2 deletions

View file

@ -0,0 +1,21 @@
class DayLogsController < ApplicationController
def new
@day_log = DayLog.new
end
def create
@day_log = Current.user.day_logs.build(day_log_params)
if @day_log.save
redirect_to root_path
else
render :new, status: :unprocessable_entity
end
end
private
def day_log_params
params.expect(day_log: [ :day, :info ])
end
end

6
app/models/day_log.rb Normal file
View file

@ -0,0 +1,6 @@
class DayLog < ApplicationRecord
belongs_to :user
validates :day, presence: true
validates :info, presence: true
end

View file

@ -3,6 +3,7 @@ class User < ApplicationRecord
has_many :sessions, dependent: :destroy has_many :sessions, dependent: :destroy
has_many :moods, -> { order "recorded_at" } has_many :moods, -> { order "recorded_at" }
has_many :modes has_many :modes
has_many :day_logs
normalizes :email_address, with: ->(e) { e.strip.downcase } normalizes :email_address, with: ->(e) { e.strip.downcase }

View file

@ -0,0 +1,15 @@
%h1 Nouveau journal
= form_with model: @day_log do |f|
- @day_log.errors.full_messages.each do |msg|
%p= msg
.field
= f.label :day
= f.date_field :day
.field
= f.label :info
= f.text_area :info
= f.submit

View file

@ -21,4 +21,6 @@ Rails.application.routes.draw do
patch "/invite/:token", to: "invitations#update", as: :invitation patch "/invite/:token", to: "invitations#update", as: :invitation
get "/moods", to: "moods#index", as: :dashboard get "/moods", to: "moods#index", as: :dashboard
resources :day_logs, only: [ :new, :create ]
end end

View file

@ -0,0 +1,13 @@
class CreateDayLogs < ActiveRecord::Migration[8.0]
def change
create_table :day_logs do |t|
t.date :day, null: false
t.text :info, null: false
t.references :user, null: false, foreign_key: true
t.index :day, unique: true
t.timestamps
end
end
end

13
db/schema.rb generated
View file

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.0].define(version: 2026_03_15_183258) do ActiveRecord::Schema[8.0].define(version: 2026_03_19_181607) do
create_table "active_storage_attachments", force: :cascade do |t| create_table "active_storage_attachments", force: :cascade do |t|
t.string "name", null: false t.string "name", null: false
t.string "record_type", null: false t.string "record_type", null: false
@ -39,6 +39,16 @@ ActiveRecord::Schema[8.0].define(version: 2026_03_15_183258) do
t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
end end
create_table "day_logs", force: :cascade do |t|
t.date "day", null: false
t.text "info", null: false
t.integer "user_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["day"], name: "index_day_logs_on_day", unique: true
t.index ["user_id"], name: "index_day_logs_on_user_id"
end
create_table "modes", force: :cascade do |t| create_table "modes", force: :cascade do |t|
t.string "label" t.string "label"
t.string "color" t.string "color"
@ -92,6 +102,7 @@ ActiveRecord::Schema[8.0].define(version: 2026_03_15_183258) do
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
add_foreign_key "day_logs", "users"
add_foreign_key "modes", "users" add_foreign_key "modes", "users"
add_foreign_key "moods", "modes" add_foreign_key "moods", "modes"
add_foreign_key "moods", "users" add_foreign_key "moods", "users"

View file

@ -0,0 +1,7 @@
FactoryBot.define do
factory :day_log do
day { "2026-03-19" }
info { "Arrivée à Paris" }
user { association :user }
end
end

View file

@ -1,6 +1,8 @@
FactoryBot.define do FactoryBot.define do
factory :user do factory :user do
sequence(:email_address) { |n| "user#{n}@example.com" } sequence(:email_address) { |n| "user#{n}@example.com" }
password_digest { BCrypt::Password.create('password123') } sequence(:username) { |n| "user#{n}" }
password { "obanonalors" }
password_digest { BCrypt::Password.create(password) }
end end
end end

View file

@ -0,0 +1,24 @@
require 'rails_helper'
describe DayLog, type: :model do
subject { build(:day_log) }
it { is_expected.to be_valid }
describe "validations" do
it "is invalid without a day" do
subject.day = nil
expect(subject).not_to be_valid
end
it "is invalid without info" do
subject.info = nil
expect(subject).not_to be_valid
end
it "is invalid without a user" do
subject.user = nil
expect(subject).not_to be_valid
end
end
end

View file

@ -0,0 +1,63 @@
require 'rails_helper'
RSpec.describe "DayLogs", type: :request do
let(:user) { create(:user) }
let(:day) { Date.new(2026, 1, 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
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 "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

View file

@ -0,0 +1,12 @@
module AuthenticationHelper
def login_as(user)
post session_path, params: {
email_address: user.email_address,
password: user.password
}
end
end
RSpec.configure do |config|
config.include AuthenticationHelper, type: :request
end