Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
956b753
Added coverage directory to .gitignore file
denisseai Mar 3, 2020
917ef81
Initial commit- Added Room class & it's test
denisseai Mar 3, 2020
d8d71ea
Added more tests for Room regarding cost and id
denisseai Mar 3, 2020
1a883d1
Added Room.all with self and it's tests
denisseai Mar 4, 2020
7713aa0
Add Reservation class & tests Updated test_helper
denisseai Mar 4, 2020
b23bd42
Add StayRange class & tests. Updated test_helper.
denisseai Mar 4, 2020
258a8d1
Added StayRange info to Reservation with tests
denisseai Mar 4, 2020
afab58f
Add ReservationManager class & tests
denisseai Mar 4, 2020
09a94ff
Removed keywords in Reservation and it's test file
denisseai Mar 4, 2020
4896f72
Add find_reservation for ReservationManager & test
denisseai Mar 4, 2020
209da60
Add test ReservationManager to include all dates
denisseai Mar 4, 2020
abc7ff8
Add total_cost for Reservation
denisseai Mar 4, 2020
582fa10
Fix test to find reservation for specific date
denisseai Mar 5, 2020
ce1a38b
Add available rooms method & test
denisseai Mar 5, 2020
ff8c2c4
Removed date range class
denisseai Mar 6, 2020
6f3d2d1
Added comments to reservation_manager_test
denisseai Mar 6, 2020
69ee1f6
Practicing single responsability
denisseai Mar 8, 2020
22e774c
Added a few comments
denisseai Mar 8, 2020
e16149d
Added room_block, tests wave 3 discount
denisseai Mar 9, 2020
a9be9c6
Add block_id and tests with "lazy" let
denisseai Mar 9, 2020
6a8aea3
Added reservations, list_rooms as arrays and tests
denisseai Mar 9, 2020
084d6d5
reservation now has default status and passes test
denisseai Mar 9, 2020
ad7c815
Changed error type
denisseai Mar 9, 2020
2a26426
reservation_test arguments changed
denisseai Mar 9, 2020
1dd09e2
Next steps for next time
denisseai Mar 9, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,4 @@ build-iPhoneSimulator/

# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
.rvmrc
coverage
Binary file added lib/.DS_Store
Binary file not shown.
24 changes: 24 additions & 0 deletions lib/reservation.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@

module Hotel
class Reservation
attr_reader :id, :room, :start_date, :end_date, :discount, :status

def initialize(id, room, start_date, end_date, discount = nil, status = :CONFIRMED)
@id = id
@room = room
@start_date = Date.parse(start_date)
@end_date = Date.parse(end_date)
@discount = discount
@status = status

# Check for requirementsand raise error if not met
raise StandardError.new("The end date cannot be before the start date") if @start_date >= @end_date
end

# Calculate total reservation cost based on nightly rate with discount if applied
def total_cost
nights_cost = ((end_date - start_date) * room.nightly_rate)
discount ? nights_cost - (nights_cost * discount) : nights_cost
end
end
end
52 changes: 52 additions & 0 deletions lib/reservation_manager.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
module Hotel
class ReservationManager
attr_reader :all_rooms, :all_reservations

def initialize
@all_rooms = Hotel::Room.all
@all_reservations = Array.new
end

# Check and find available room by date
def available?(start_date, end_date, room)
room.reservations.each do |reservation|

first_day = Date.parse(start_date)
last_day = Date.parse(end_date)

# Check that there is no overlap in date
while first_day != last_day
return false if (reservation.start_date...reservation.end_date).include?(first_day)
first_day += 1
end
end
return true
end

# List available rooms that meet requirement
def available_rooms(start_date, end_date)
all_rooms.select { |room| available?(start_date, end_date, room) }
end

# Make a new reservation or raise error if room is unavailable
def make_reservation(start_date, end_date)
id = all_reservations.length + 1
room = available_rooms(start_date, end_date)[0]
raise StandardError if !room

reservation = Hotel::Reservation.new(id, room, start_date, end_date)
all_reservations << reservation
room.reservations << reservation
return reservation
end

# Look-up a reservation that meet requirement
def find_reservation(date)
all_reservations.select do |reservation|
first_day = reservation.start_date
last_day = reservation.end_date
(first_day...last_day).include? Date.parse(date)
end
end
end
end
25 changes: 25 additions & 0 deletions lib/room.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module Hotel
class Room
ROOMS = 20
attr_reader :id, :nightly_rate

def initialize(id)
# (Guard clause) raise error if requirement not met
raise StandardError.new("Not a real room") if id <= 0 || id > 20

@id = id
@nightly_rate = 200
end

# Set as empty array if no instance variable was instantiated
def reservations
@reservations ||= []
end

def self.all
all_rooms = Array.new
ROOMS.times { |room| all_rooms << self.new(room + 1) }
return all_rooms
end
end
end
26 changes: 26 additions & 0 deletions lib/room_block.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
module Hotel
class RoomBlock
attr_reader :name, :start_date, :end_date, :discount, :how_many_rooms, :list_rooms

def initialize(name, start_date, end_date, discount, how_many_rooms, list_rooms)
@name = name
@start_date = Date.parse(start_date)
@end_date = Date.parse(end_date)
@discount = discount / 100.0
@how_many_rooms = how_many_rooms
@list_rooms = list_rooms

# Check for requirements and raise error if not met for dates
raise StandardError.new("The end date cannot be before the start date") if @start_date >= @end_date
# Check for requirements and raise error if block of rooms does not pass
raise StandardError.new("Invalid amount of rooms for block") if how_many_rooms <= 0 || how_many_rooms > 5
# Check that requested rooms match block
raise StandardError.new("Room amount is invalid") if list_rooms.length != how_many_rooms
end

# Set as empty array if no instance variable was instantiated
def reservations
@reservations ||= []
end
end
end
23 changes: 23 additions & 0 deletions refactors.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Current thoughts

- review variable names
- use more S in all waves
- make more classes and method
- read/ask update error types
- let on test files
- keyword arguments vs positional
- make long rows more readable
- Code:
+ reservation_manager.rb:
- add status & discount to defaults
- make method to make a block & it's tests
+ room_block.rb
- remove list_rooms once method above is created
- update the test file for above
+ booking_manager.rb
- update for blocks
- make method to find reservations
+ booking_manager_test.rb
- clean w/let
- add tests for blocks

Binary file added test/.DS_Store
Binary file not shown.
85 changes: 85 additions & 0 deletions test/reservation_manager_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
require_relative "test_helper"

describe "ReservationManager" do
let (:manager) { Hotel::ReservationManager.new }

describe "Initialize" do
it "Create an instance of ReservationManager" do
# Assert
expect(manager).must_be_kind_of Hotel::ReservationManager
end

it "Respond to all_rooms" do
# Assert
expect(manager).must_respond_to :all_rooms
expect(manager.all_rooms).must_be_kind_of Array
expect(manager.all_rooms.length).must_equal 20
end

it "Respond to reservations" do
# Assert
expect(manager).must_respond_to :all_reservations
expect(manager.all_reservations).must_be_kind_of Array
expect(manager.all_reservations).must_equal []
end
end

describe "available_rooms" do
it "When no rooms have been booked return 20 available rooms" do
rooms = manager.available_rooms("March 3, 2020", "March 5, 2020")
# Assert
expect(rooms.length).must_equal 20
end

it "When one room has been booked return 19 available rooms" do
manager.make_reservation("March 3, 2020", "March 5, 2020")
rooms = manager.available_rooms("March 3, 2020", "March 5, 2020")
# Assert
expect(rooms.length).must_equal 19
end

it "Returns the available room" do
manager.available_rooms("March 3, 2020", "March 5, 2020")
rooms = manager.available_rooms("March 13, 2020", "March 15, 2020")
# Assert
expect(rooms.length).must_equal 20
end
end

describe "make_reservation" do
it "Creates a new reservation" do
reservation = manager.make_reservation("March 3, 2020", "March 5, 2020")
# Assert
expect(reservation).must_be_kind_of Hotel::Reservation
expect(manager.all_reservations.include?(reservation)).must_equal true
expect(reservation.room.reservations.include?(reservation)).must_equal true
end

it "Raises an error if there are no rooms available" do
20.times do
manager.make_reservation("March 3, 2020", "March 5, 2020")
end
# Assert
expect { manager.make_reservation("March 3, 2020", "March 5, 2020") }.must_raise StandardError
end
end

describe "find_reservation" do
it "Finds reservations for a specific date" do
manager.make_reservation("March 1, 2020", "March 3, 2020")
manager.make_reservation("March 1, 2020", "March 8, 2020")
manager.make_reservation("March 3, 2020", "March 6, 2020")
manager.make_reservation("March 3, 2020", "March 5, 2020")
manager.make_reservation("March 15, 2020", "March 18, 2020")
date = "March 3, 2020"
specific_reservation = manager.find_reservation(date)
# Assert
expect(specific_reservation).must_be_kind_of Array
expect(specific_reservation.length).must_equal 3

specific_reservation.each do |reservation|
_(reservation).must_be_kind_of Hotel::Reservation
end
end
end
end
84 changes: 84 additions & 0 deletions test/reservation_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
require_relative "test_helper"

describe "Reservation" do
let (:room) { Hotel::Room.new(3) }
let (:reservation) { Hotel::Reservation.new(1, room, "March 3, 2020", "March 5, 2020")}
# Arrange
describe "initialize" do
#Act
it "Create an instance of Reservation" do
# Assert
expect(reservation).must_be_kind_of Hotel::Reservation
end
#Act
it "Room id tracker" do
# Assert
expect(reservation).must_respond_to :id
expect(reservation.id).must_equal 1
end
# Act
it "Keeps track of room" do
# Assert
expect(reservation).must_respond_to :room
expect(reservation.room).must_equal room
end
# Act
it "Keeps track of the first day" do
# Assert
expect(reservation).must_respond_to :start_date
expect(reservation.start_date).must_equal Date.parse("March 3, 2020")
end
# Act
it "Keeps track of the last day" do
# Assert
expect(reservation).must_respond_to :end_date
expect(reservation.end_date).must_equal Date.parse("March 5, 2020")
end
# Act
it "Throws error if end date is before start date" do
start_date = "March 5, 2020"
end_date = "March 3, 2020"
# Assert
expect{ Hotel::Reservation.new(1, room, start_date, end_date) }.must_raise StandardError
end
# Act
it "Discount tracker" do
reservation = Hotel::Reservation.new(1, room, "March 3, 2020", "March 5, 2020", 0.50, :CONFIRMED)
# Assert
expect(reservation).must_respond_to :discount
expect(reservation.discount).must_equal 0.50
end
# Act
it "Set discount to a default of nil" do
# Assert
assert_nil(reservation.discount)
end
# Act
it "Status tracker" do
# Assert
expect(reservation).must_respond_to :status
end
# Act
it "Status default set to 'confirmed' " do
# Assert
expect(reservation.status).must_equal :CONFIRMED
end
end

# Arrange
describe "total_cost" do
# Act
it "Returns total cost for reservation" do
room = Hotel::Room.new(3)
# Assert
expect(reservation.total_cost).must_equal 400
end
# Act
it "Returns total_cost with discount if processed" do
room = Hotel::Room.new(3)
reservation = Hotel::Reservation.new(1, room, "March 3, 2020", "March 5, 2020", 0.50, :CONFIRMED)
# Assert
expect(reservation.total_cost).must_equal 200
end
end
end
Loading