diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb index 6559b9e..939d436 100644 --- a/app/controllers/people_controller.rb +++ b/app/controllers/people_controller.rb @@ -9,17 +9,18 @@ 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 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/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/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) 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/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 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..2ab37e7 100644 --- a/spec/features/people/index_spec.rb +++ b/spec/features/people/index_spec.rb @@ -1,8 +1,9 @@ require 'rails_helper' RSpec.describe 'Listing people', type: :feature do - before do - Person.create( + before do + FactoryBot.create( + :person, name: 'Foo Bar', phone_number: 'Biz', email: 'Baz' @@ -24,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 diff --git a/spec/views/people/index.html.slim_spec.rb b/spec/views/people/index.html.slim_spec.rb index 7e2d362..82c6015 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) { 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 + + 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