Skip to content

Commit

Permalink
updates and creating reservations tested and functional
Browse files Browse the repository at this point in the history
  • Loading branch information
srinjoyc committed Apr 3, 2018
1 parent b060dd9 commit bcd1972
Show file tree
Hide file tree
Showing 13 changed files with 230 additions and 17 deletions.
17 changes: 15 additions & 2 deletions app/controllers/reservations_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,20 @@ class ReservationsController < ApplicationController
# GET /reservations
def index
@reservations = Reservation.all

render json: @reservations
end

# GET reservations/restaurant/:id
def restaurants
restaurant = Restaurant.find(params[:id])
restaurant_reservations = Reservation.joins(:guest, :restaurant_table)
.select("reservation_time,
guest_count,
guests.name as guest_name,
restaurant_tables.name as table_name")
render json: restaurant_reservations.to_json
end

# GET /reservations/1
def show
render json: @reservation
Expand All @@ -18,6 +28,7 @@ def mobile_create

request = mobile_create_params
restaurant = Restaurant.find(request[:restaurant_id])
guest = Guest.find(request[:guest_id])
reserved_table_ids = Reservation.get_reserved_tables request[:restaurant_id], request[:reservation_time].to_time
if reserved_table_ids.to_json.include?(request[:restaurant_table_id])
table = nil
Expand All @@ -42,14 +53,15 @@ def mobile_create

@reservation = Reservation.new({
restaurant_id: request[:restaurant_id],
guest_id: request[:guest_id],
guest_id: guest.id,
restaurant_table_id: table.id,
restaurant_shift_id: shift.id,
guest_count: request[:guest_count],
reservation_time: request[:reservation_time].to_time
})
if @reservation.save
Reservation.reserve_table @reservation, table
ReservationMailer.reservation_confirmed(@reservation).deliver_later
render json: @reservation, status: :created, location: @reservation
else
render json: @reservation.errors, status: :unprocessable_entity
Expand Down Expand Up @@ -83,6 +95,7 @@ def create
})
if @reservation.save
Reservation.reserve_table @reservation, table
ReservationMailer.reservation_confirmed(@reservation).deliver_later
render json: @reservation, status: :created, location: @reservation
else
render json: @reservation.errors, status: :unprocessable_entity
Expand Down
12 changes: 12 additions & 0 deletions app/mailers/reservation_mailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class ReservationMailer < ApplicationMailer
layout 'mailer'
default from: '[email protected]'

def reservation_confirmed reservation
@guest = reservation.guest
@reservation = reservation
@restaurant = reservation.restaurant
email_with_name = %("#{@guest.name}" <#{@guest.email}>)
mail(to: email_with_name, subject: "Reservation confirmed at #{@restaurant.name} ")
end
end
10 changes: 5 additions & 5 deletions app/models/reservation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,16 @@ def check_update
# table change
if current_reservation.restaurant_table_id != self.restaurant_table_id
reserved_table_ids = Reservation.get_reserved_tables self.restaurant_id, self.reservation_time
not_reserved_table = reserved_table_ids.include?(self.restaurant_table_id)
if !not_reserved_table
reserved_table = reserved_table_ids.include?(self.restaurant_table_id)
if reserved_table
self.errors.add(:update, "Table already booked")
raise ActiveRecord::Rollback
end
end
# shift change
if current_reservation.restaurant_shift_id != self.restaurant_shift_id
shift = restaurant.get_shift self.reservation_time
correct_shift = (shift == self.restaurant_shift_id)
correct_shift = (shift == self.restaurant_shift)
if !correct_shift
self.errors.add(:update, "Restaurant doest not have a shift during your reservation time")
raise ActiveRecord::Rollback
Expand All @@ -87,9 +87,9 @@ def check_update
.where(reservation_time: self.reservation_time - 3600...self.reservation_time + 3600)
.where(restaurant_table_id: self.restaurant_table_id)
.where.not(reservation_id: self.id)
puts reserved_tables.to_json

shift = restaurant.get_shift self.reservation_time
correct_shift = (shift == self.restaurant_shift_id)
correct_shift = (shift == self.restaurant_shift)
if !reserved_tables.empty? || !correct_shift
self.errors.add(:update, "The table is not available at the requested time")
raise ActiveRecord::Rollback
Expand Down
2 changes: 1 addition & 1 deletion app/models/restaurant.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ def get_shift time
hour = time.hour
shift = self.restaurant_shifts.where("start_time <= ? AND end_time >= ?", hour, hour + 1).first
end

#Wed, 11 Jul 2012 08:30:00 GMT +00:00, res_id: 8
end
9 changes: 9 additions & 0 deletions app/views/reservation_mailer/reservation_confirmed.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@

<h1>Welcome to umai.com, <%= @guest.name %></h1>
<p>
You have successfully book a reservation on, : <%= @reservation.reservation_time %>.<br>
</p>
<p>
Your table is: <%= @reservation.restaurant_table.name %>, with <%= @reservation.guest_count %> total guests.
</p>
<p>Thanks for using UMAI and have a great day!</p>
10 changes: 10 additions & 0 deletions app/views/reservation_mailer/reservation_updated.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

<h1>Welcome to example2.com, <%= @user.name %></h1>
<p>
You have successfully signed up to example.com,
your username is: <%= @user.login %>.<br>
</p>
<p>
To login to the site, just follow this link: <%= @url %>.
</p>
<p>Thanks for joining and have a great day!</p>
2 changes: 1 addition & 1 deletion config/application.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

module BookingSystem
class Application < Rails::Application
config.time_zone = 'Eastern Time (US & Canada)'
config.time_zone = 'GMT'
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 5.1

Expand Down
9 changes: 9 additions & 0 deletions config/environments/development.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
config.action_controller.action_on_unpermitted_parameters = :raise
config.action_mailer.smtp_settings = {
:address => "smtp.gmail.com",
:port => 587,
:domain => "gmail.com",
:user_name => "[email protected]",
:password => "101ckattainor",
:authentication => "plain",
:enable_starttls_auto => true
}
# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes.
Expand Down
9 changes: 9 additions & 0 deletions config/environments/production.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
config.action_controller.action_on_unpermitted_parameters = :raise
config.action_mailer.smtp_settings = {
:address => "smtp.gmail.com",
:port => 587,
:domain => "gmail.com",
:user_name => "[email protected]",
:password => "101ckattainor",
:authentication => "plain",
:enable_starttls_auto => true
}
# Code is not reloaded between requests.
config.cache_classes = true

Expand Down
6 changes: 5 additions & 1 deletion config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
resources :guests
resources :restaurants
resources :reservations
resources :reservations do
collection do
get 'restaurants/:id', to: 'reservations#restaurants'
end
end
resources :restaurant_shifts
resources :restaurant_tables

Expand Down
152 changes: 145 additions & 7 deletions spec/controllers/reservations_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
restaurant_shift_id: @shift.id,
guest_id: @guest.id,
guest_count: 4,
reservation_time: "Wed, 11 Jul 2012 8:10:00"
reservation_time: "Wed, 11 Jul 2012 8:10:00 GMT"
})
end

Expand All @@ -46,10 +46,12 @@
restaurant_shift_id: @shift.id,
guest_id: @guest.id,
guest_count: 4,
reservation_time: "Wed, 11 Jul 2012 9:10:00"
reservation_time: "Wed, 11 Jul 2012 9:10:00 GMT"
}
}
post :mobile_create, params: params
email = ActionMailer::Base.deliveries.last
puts email
expect(Reservation.count).to eq(2)
end
end
Expand All @@ -63,7 +65,7 @@
restaurant_shift_id: @shift.id,
guest_id: @guest.id,
guest_count: 4,
reservation_time: "Wed, 11 Jul 2012 8:30:00" # same time as existing resevation
reservation_time: "Wed, 11 Jul 2012 8:30:00 GMT" # same time as existing resevation
}
}
post :mobile_create, params: params
Expand All @@ -79,7 +81,7 @@
restaurant_shift_id: @shift.id,
guest_id: @guest.id,
guest_count: 4,
reservation_time: "Wed, 11 Jul 2012 14:30:00" # same time as existing resevation
reservation_time: "Wed, 11 Jul 2012 14:30:00 GMT" # same time as existing resevation
}
}
post :mobile_create, params: params
Expand All @@ -96,7 +98,7 @@
restaurant_shift_id: @shift.id,
guest_id: @guest.id,
guest_count: 8,
reservation_time: "Wed, 11 Jul 2012 9:10:00" # same time as existing resevation
reservation_time: "Wed, 11 Jul 2012 9:10:00 GMT" # same time as existing resevation
}
}
post :mobile_create, params: params
Expand All @@ -112,7 +114,7 @@
restaurant_shift_id: @shift.id,
guest_id: @guest.id,
guest_count: 1,
reservation_time: "Wed, 11 Jul 2012 9:10:00" # same time as existing resevation
reservation_time: "Wed, 11 Jul 2012 9:10:00 GMT" # same time as existing resevation
}
}
post :mobile_create, params: params
Expand All @@ -128,7 +130,7 @@
restaurant_shift_id: @shift.id,
guest_id: 100,
guest_count: 1,
reservation_time: "Wed, 11 Jul 2012 9:10:00" # same time as existing resevation
reservation_time: "Wed, 11 Jul 2012 9:10:00 GMT" # same time as existing resevation
}
}
post :mobile_create, params: params
Expand All @@ -139,6 +141,142 @@
end

end
# UPDATE
describe 'Update a reservation' do
# Sample guest already in database
before :example do
@guest = Guest.create!({
name: 'Srinjoy',
email: '[email protected]'
})
@restaurant = Restaurant.create!({
name: 'Food Palace',
email: '[email protected]',
phone_number: '444-444-4444'
})
@table = RestaurantTable.create!({
name: 'Booth 1',
restaurant_id: @restaurant.id,
minimum_count: 3,
maximum_count: 5
})
@table_two = RestaurantTable.create!({
name: 'Booth 2',
restaurant_id: @restaurant.id,
minimum_count: 2,
maximum_count: 6
})
@shift = RestaurantShift.create!({
name: 'Morning',
restaurant_id: @restaurant.id,
start_time: 8,
end_time: 13
})
@shift_two = RestaurantShift.create!({
name: 'Evening',
restaurant_id: @restaurant.id,
start_time: 18,
end_time: 22
})
@reservation = Reservation.create!({
restaurant_id: @restaurant.id,
restaurant_table_id: @table.id,
restaurant_shift_id: @shift.id,
guest_id: @guest.id,
guest_count: 4,
reservation_time: "Wed, 11 Jul 2012 9:10:00 GMT"
})
@reservation_two = Reservation.create!({
restaurant_id: @restaurant.id,
restaurant_table_id: @table.id,
restaurant_shift_id: @shift.id,
guest_id: @guest.id,
guest_count: 4,
reservation_time: "Wed, 11 Jul 2012 10:15:00 GMT"
})
end

context 'all details are valid and no conflicting reservations during update' do
it 'updates the guest count' do
params = {
id: @reservation.id,
reservation: {
guest_count: 3,
}
}
put :update, params: params
expect(Reservation.find(@reservation.id).guest_count).to eq(3)
end
it 'changes the reservation time to another time in the same shift' do
params = {
id: @reservation.id,
reservation: {
reservation_time: "Wed, 11 Jul 2012 9:30:00 GMT",
}
}
put :update, params: params
expect(Reservation.find(@reservation.id).reservation_time).to eq("Wed, 11 Jul 2012 9:30:00 GMT".to_time)
end
it 'changes the reservation time and shift app' do
params = {
id: @reservation.id,
reservation: {
restaurant_shift_id: @shift_two.id,
reservation_time: "Wed, 11 Jul 2012 19:30:00 GMT",
}
}
put :update, params: params
expect(Reservation.find(@reservation.id).reservation_time).to eq("Wed, 11 Jul 2012 19:30:00 GMT".to_time)
end

it 'changes the table to another valid, available table' do
params = {
id: @reservation.id,
reservation: {
restaurant_table_id: @table_two.id,
}
}
put :update, params: params
expect(Reservation.find(@reservation.id).restaurant_table_id).to eq(@table_two.id)
end
end

context 'all details are NOT valid and there ARE conflicting reservations during update' do
it 'updates the guest count to past the maximum' do
params = {
id: @reservation.id,
reservation: {
guest_count: 20,
}
}
put :update, params: params
expect(Reservation.find(@reservation.id).guest_count).to eq(4)
end
it 'changes the reservation time to a time not in the shift of a restaurant' do
params = {
id: @reservation.id,
reservation: {
reservation_time: "Wed, 11 Jul 2012 14:30:00 GMT",
}
}
put :update, params: params
expect(Reservation.find(@reservation.id).reservation_time).to eq("Wed, 11 Jul 2012 9:10:00 GMT".to_time)
end
it 'changes the reservation time to an already booked time by another guest on the same table' do
params = {
id: @reservation.id,
reservation: {
restaurant_shift_id: @shift_two.id,
reservation_time: "Wed, 11 Jul 2012 10:15:00 GMT",
}
}
put :update, params: params
expect(Reservation.find(@reservation.id).reservation_time).to eq("Wed, 11 Jul 2012 9:10:00 GMT".to_time)
end

end

end

end

Expand Down
4 changes: 4 additions & 0 deletions spec/mailers/previews/reservation_mailer_preview.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Preview all emails at http://localhost:3000/rails/mailers/reservation_mailer
class ReservationMailerPreview < ActionMailer::Preview

end
Loading

0 comments on commit bcd1972

Please sign in to comment.