From 375cba1f66b75350f73e7fee208ecc6f7e7db896 Mon Sep 17 00:00:00 2001 From: vinibispo Date: Thu, 19 Dec 2024 09:29:55 -0300 Subject: [PATCH 1/6] Fix required fix --- app/controllers/people_controller.rb | 2 +- app/views/people/index.html.slim | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb index 6559b9e..f8e3668 100644 --- a/app/controllers/people_controller.rb +++ b/app/controllers/people_controller.rb @@ -19,7 +19,7 @@ def create private def person_attributes - params.require(:person).permit(:name, :email, :phone) + params.require(:person).permit(:name, :email, :phone_number) end end diff --git a/app/views/people/index.html.slim b/app/views/people/index.html.slim index ddbf52f..5afea0f 100644 --- a/app/views/people/index.html.slim +++ b/app/views/people/index.html.slim @@ -13,7 +13,7 @@ table.table tr th[scope="row"]= person&.id td= person.try(:name) - td= person.try(:phone) + td= person.try(:phone_number) td= person.try(:email) td= person.try(:company).try(:name) From 364db6b26c1a7789d622c78ef980b69f32859ec9 Mon Sep 17 00:00:00 2001 From: vinibispo Date: Thu, 19 Dec 2024 09:59:12 -0300 Subject: [PATCH 2/6] Fix test to render people/index.html.slim --- spec/views/people/index.html.slim_spec.rb | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/spec/views/people/index.html.slim_spec.rb b/spec/views/people/index.html.slim_spec.rb index 7e2d362..3be06b7 100644 --- a/spec/views/people/index.html.slim_spec.rb +++ b/spec/views/people/index.html.slim_spec.rb @@ -1,5 +1,17 @@ require "rails_helper" describe "people/index.html.slim" do - it "Displays the users" + let(:company) { Company.create(name: "Default Company") } + let(:first_person) { Person.create(name: "John Doe", email: "john@doe.com.br", phone_number: "Foo", company: company) } + let(:second_person) { Person.create(name: "Jane Doe", email: "jane@doe.com.br", phone_number: "Bar", company: company) } + it "Displays the users" do + assign(:people, [first_person, second_person]) + render + + expect(rendered).to match(/John/) # name (John) + expect(rendered).to match(/Foo/) # phone number + expect(rendered).to match(/Jane/) # name (Jane) + expect(rendered).to match(/Bar/) # phone number + expect(rendered).to match(/Default Company/) # company name + end end From 63b89bd80a01b940af02a961e4b180814ac3d119 Mon Sep 17 00:00:00 2001 From: vinibispo Date: Thu, 19 Dec 2024 20:31:07 -0300 Subject: [PATCH 3/6] Reach 100% of coverage --- app/controllers/people_controller.rb | 5 +++-- app/models/person.rb | 4 ++++ spec/controllers/people_controller_spec.rb | 4 ++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb index f8e3668..0ea2138 100644 --- a/app/controllers/people_controller.rb +++ b/app/controllers/people_controller.rb @@ -9,10 +9,11 @@ def new end def create - if Person.create(person_attributes) + person = Person.new(person_attributes) + if person.save redirect_to people_path, notice: 'Successfully created entry' else - render :create, alert: 'Unsuccessfully created entry' + render :new, alert: 'Unsuccessfully created entry', status: :unprocessable_entity end end diff --git a/app/models/person.rb b/app/models/person.rb index f935e46..cea424c 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -14,4 +14,8 @@ class Person < ApplicationRecord belongs_to :company, optional: true + + validates :name, presence: true + validates :phone_number, presence: true + validates :email, presence: true end diff --git a/spec/controllers/people_controller_spec.rb b/spec/controllers/people_controller_spec.rb index 82220e8..00a4536 100644 --- a/spec/controllers/people_controller_spec.rb +++ b/spec/controllers/people_controller_spec.rb @@ -22,5 +22,9 @@ it 'has status found' do expect(post :create, params: { person: { name: 'foo', phone_number: '123', email: 'foo' } }).to have_http_status(:found) end + + it 'doesn\'t create a user when is missing phone_number' do + expect(post :create, params: { person: { name: 'foo', email: 'foo' } }).to have_http_status(:unprocessable_entity) + end end end From 13a31a5368f698c3a57ea276b586eaf27a376b56 Mon Sep 17 00:00:00 2001 From: vinibispo Date: Thu, 19 Dec 2024 21:59:59 -0300 Subject: [PATCH 4/6] Use factories instead of ActiveRecord models --- spec/factories/companies.rb | 5 +++++ spec/factories/people.rb | 7 +++++++ spec/features/people/index_spec.rb | 3 ++- spec/views/people/index.html.slim_spec.rb | 6 +++--- 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 spec/factories/companies.rb create mode 100644 spec/factories/people.rb diff --git a/spec/factories/companies.rb b/spec/factories/companies.rb new file mode 100644 index 0000000..0752e24 --- /dev/null +++ b/spec/factories/companies.rb @@ -0,0 +1,5 @@ +FactoryBot.define do + factory :company do + name { "Company default" } + end +end diff --git a/spec/factories/people.rb b/spec/factories/people.rb new file mode 100644 index 0000000..4683afa --- /dev/null +++ b/spec/factories/people.rb @@ -0,0 +1,7 @@ +FactoryBot.define do + factory :person do + name { "John Doe" } + email { "john@doe.com" } + phone_number { "9770607060" } + end +end diff --git a/spec/features/people/index_spec.rb b/spec/features/people/index_spec.rb index d9936a9..563ec64 100644 --- a/spec/features/people/index_spec.rb +++ b/spec/features/people/index_spec.rb @@ -2,7 +2,8 @@ RSpec.describe 'Listing people', type: :feature do before do - Person.create( + FactoryBot.create( + :person, name: 'Foo Bar', phone_number: 'Biz', email: 'Baz' diff --git a/spec/views/people/index.html.slim_spec.rb b/spec/views/people/index.html.slim_spec.rb index 3be06b7..82c6015 100644 --- a/spec/views/people/index.html.slim_spec.rb +++ b/spec/views/people/index.html.slim_spec.rb @@ -1,9 +1,9 @@ require "rails_helper" describe "people/index.html.slim" do - let(:company) { Company.create(name: "Default Company") } - let(:first_person) { Person.create(name: "John Doe", email: "john@doe.com.br", phone_number: "Foo", company: company) } - let(:second_person) { Person.create(name: "Jane Doe", email: "jane@doe.com.br", phone_number: "Bar", company: company) } + let(:company) { FactoryBot.create(:company, name: "Default Company") } + let(:first_person) { FactoryBot.create(:person, phone_number: "Foo", company: company) } + let(:second_person) { FactoryBot.create(:person, name: "Jane Doe", email: "jane@doe.com.br", phone_number: "Bar", company: company) } it "Displays the users" do assign(:people, [first_person, second_person]) render From 1d913bb16db2edd5d2f0fb4899438349f8be1b45 Mon Sep 17 00:00:00 2001 From: vinibispo Date: Thu, 19 Dec 2024 22:31:35 -0300 Subject: [PATCH 5/6] Fix form not working in the application --- app/controllers/people_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb index 0ea2138..939d436 100644 --- a/app/controllers/people_controller.rb +++ b/app/controllers/people_controller.rb @@ -9,8 +9,8 @@ def new end def create - person = Person.new(person_attributes) - if person.save + @person = Person.new(person_attributes) + if @person.save redirect_to people_path, notice: 'Successfully created entry' else render :new, alert: 'Unsuccessfully created entry', status: :unprocessable_entity From 6ed1d985dbf136975ea16e2448f7a8acb5604470 Mon Sep 17 00:00:00 2001 From: vinibispo Date: Thu, 19 Dec 2024 23:03:36 -0300 Subject: [PATCH 6/6] Add feedback when person is unable to be saved --- app/views/people/new.html.slim | 13 ++++++++++--- spec/features/people/index_spec.rb | 12 +++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/app/views/people/new.html.slim b/app/views/people/new.html.slim index 40bc446..fd1fcd1 100644 --- a/app/views/people/new.html.slim +++ b/app/views/people/new.html.slim @@ -1,14 +1,21 @@ h2 Creating an entry = form_for @person, class: 'row' do |f| + - if @person.errors.any? + .col-12 + .alert.alert-danger + h4.alert-heading Form contains errors + ul + - @person.errors.full_messages.each do |message| + li= message .col-auto = f.label :name, class: 'form-label' - = f.text_field :name, class: 'form-control' + = f.text_field :name, class: "form-control #{'is-invalid' if @person.errors[:name].any?}" .col-auto = f.label :phone_number, class: 'form-label' - = f.text_field :phone_number, class: 'form-control' + = f.text_field :phone_number, class: "form-control #{'is-invalid' if @person.errors[:phone_number].any?}" .col-auto = f.label :email, class: 'form-label' - = f.text_field :email, class: 'form-control' + = f.text_field :email, class: "form-control #{'is-invalid' if @person.errors[:email].any?}" .col-auto.mt-4 = f.submit class: 'btn btn-primary' diff --git a/spec/features/people/index_spec.rb b/spec/features/people/index_spec.rb index 563ec64..2ab37e7 100644 --- a/spec/features/people/index_spec.rb +++ b/spec/features/people/index_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'Listing people', type: :feature do - before do + before do FactoryBot.create( :person, name: 'Foo Bar', @@ -25,4 +25,14 @@ expect(page).to have_field :person_name end + scenario 'New person with errors', type: :feature do + visit new_person_path + + fill_in :person_name, with: 'John Doe' + + click_on 'Create Person' + + expect(page).to have_content("Email can't be blank") + expect(page).to have_content("Phone number can't be blank") + end end