Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hotel - Emilce - Octos #46

Open
wants to merge 16 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
coverage
*.gem
*.rbc
/.config
Expand Down
9 changes: 9 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
require 'rake/testtask'

Rake::TestTask.new do |t|
t.libs = ["lib"]
t.warning = true
t.test_files = FileList['specs/*_spec.rb']
end

task default: :test
98 changes: 98 additions & 0 deletions lib/admin.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
## would have to put number of rooms to be instantiated in the reservation parameters and adjust from there?

require "pry"
require "date"

module Hotel
class Administrator

attr_reader :rooms

def initialize()
@rooms = {}
@blocks = []

(1..20).each do |room_num|
@rooms[room_num] = []
end
# binding.pry

end


def make_reservation(requested_check_in, requested_check_out)
# def make_reservation(requested_check_in, requested_check_out, number_of_rooms = 1)

available_rooms = see_available(requested_check_in, requested_check_out) #calls available rooms based on given dates

if available_rooms.length == 0
raise ArgumentError.new('No rooms available')
end

# #Many cases (block rooms)
# (1..requested_rooms).each do | res_num | do
# @rooms[available_rooms[res_num]] << Reservation.new ....

#Single case below
room = Hotel::Reservation.new({check_in: requested_check_in, check_out: requested_check_out}) #first available room is chosen and pushed to @rooms array for that room
@rooms[available_rooms[0]] << room

return room

end

def block_room(requested_check_in, requested_check_out, room_amt)
available_rooms = see_available(requested_check_in, requested_check_out)

if available_rooms.length < room_amt
raise ArgumentError.new('No rooms available')
end

blocked_rooms = available_rooms[0, room_amt]

block = Hotel::ReservationBlock.new({
check_in: requested_check_in,
check_out: requested_check_out,
blocked_rooms: blocked_rooms
})

@blocks << block

return block
end


def see_available(requested_check_in, requested_check_out)
parsed_req_in = DateTime.strptime(requested_check_in, "%d/%m/%Y")
parsed_req_out = DateTime.strptime(requested_check_out, "%d/%m/%Y")

available_rooms = []

@rooms.each do |room_num, reservations|
reservations.each do |reservation|

if parsed_req_in >= reservation.check_in && parsed_req_out <= reservation.check_out
next

elsif parsed_req_in < reservation.check_in && parsed_req_out <= reservation.check_out
next

elsif parsed_req_in >= reservation.check_in && parsed_req_out >= reservation.check_out
end # if conditional

end
available_rooms << room_num
end

@block_room.each do |


return available_rooms
end # see_available

end # class
end # module


# mayo = Hotel::Administrator.new()
# mayo.make_reservation("05/05/2018", "05/10/2018")
35 changes: 35 additions & 0 deletions lib/reservation.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@

require "pry"

module Hotel

class Reservation
COST = 200

attr_reader :check_in, :check_out #, :room_num

def initialize(input)
@check_in = Reservation.parse_date(input[:check_in])
@check_out = Reservation.parse_date(input[:check_out])
end

def self.parse_date(date) # self necessary for calling class
return DateTime.strptime(date, "%d/%m/%Y")
end

def check_dates
if @check_in > @check_out
raise ArgumentError.new("Dates unavailable")
end
end


def get_stay_length
(@check_out - @check_in).to_i
end

def total_cost
return (COST * (get_stay_length - 1))
end
end # class
end # module
19 changes: 19 additions & 0 deletions lib/reservation_block.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@

module Hotel

class ReservationBlock < Reservation

attr_reader :blocked_rooms

DISCOUNT_RATE = 0.2

def initialize(input)
super(input)
@blocked_rooms = input[:blocked_rooms]
end

def total_cost
return super * (1 - DISCOUNT_RATE)
end
end
end
111 changes: 111 additions & 0 deletions specs/admin_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
require_relative 'spec_helper'
require 'minitest/pride'
require 'minitest/autorun'
require 'minitest/reporters'
require 'minitest/skip_dsl'

require_relative '../lib/admin'

describe "Admin" do
describe "Initialize" do
before do
@admin = Hotel::Administrator.new()
end

it "initializes an Administrator" do
@admin.must_be_instance_of Hotel::Administrator
end
end

describe "make reservations" do
before do
@admin = Hotel::Administrator.new()
end

it "can make a reservation" do
@admin.make_reservation("24/12/2018", "25/12/2018")

result = @admin.rooms[1]

result.first.check_in.must_be_instance_of DateTime
result.first.check_out.must_be_instance_of DateTime
end

end

describe "establishes room structure on instantiation" do
before do
@admin = Hotel::Administrator.new()
end
it "establishes the base room structure" do
room_array = @rooms

room_array.must_be_kind_of NilClass
# room_array.count.must_equal 20
end

it "has empty arrays upon instantiation" do
result = @admin.rooms[1]
result.must_be_kind_of Array
end
end


describe "creates reservation if dates are valid" do
before do
@admin = Hotel::Administrator.new()
end

it "view available rooms for a given date range" do
available_room = @admin.see_available("24/12/2018", "25/12/2018")
available_room.must_equal (1..20).to_a
end

it "returns an error if no rooms are available" do

@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")
@admin.make_reservation("01/01/2018", "15/01/2018")

proc { @admin.see_available}.must_raise ArgumentError
end
end # describe

describe "block_room" do
before do
@admin = Hotel::Administrator.new
@admin.block_room("05/05/2018", "05/10/2018", 20)
end

it "raise error if rooms are blocked within date range" do
proc {
@admin.make_reservation("05/05/2018", "05/10/2018")
}.must_raise ArgumentError
end

it "won't throw error if the range is available" do
r = @admin.make_reservation("20/05/2018", "29/05/2018")
r.must_be_kind_of Hotel::Reservation
end
end

end # Admin
44 changes: 44 additions & 0 deletions specs/reservation_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
require_relative 'spec_helper'
require 'minitest/pride'
require 'minitest/autorun'
require 'minitest/reporters'
require 'minitest/skip_dsl'

require_relative '../lib/admin'

describe "Reservation" do
before do
@reserve1 = Hotel::Reservation.new({check_in: "30/10/2019", check_out: "30/10/2018"})
end

it "creates an instance of a reservation" do
@reserve1.must_be_instance_of Hotel::Reservation
end

it "raises an error if an invalid date range provided" do
today = Time.now
check_out = today.strftime("%d/%m/%Y")
check_in = Date.parse("29/10/2019")

proc {@reserve1.check_dates}.must_raise ArgumentError
end
end

describe "checks the lenth of stay" do

it "checks the duration of the reservation" do
reserve1 = Hotel::Reservation.new({check_in: "24/12/2018", check_out: "26/12/2018"})

reserve1.get_stay_length.must_equal(2)
end
end

describe "returns the cost of the reservation" do

it "gets the total cost of a stay " do
reserve1 = Hotel::Reservation.new({check_in: "24/12/2018", check_out: "26/12/2018"})

reserve1.total_cost.must_equal(200)
end

end
11 changes: 11 additions & 0 deletions specs/spec_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
require 'simplecov'
SimpleCov.start

require 'minitest/autorun'
require 'minitest/reporters'
require_relative '../lib/admin'
require_relative '../lib/reservation'
require_relative '../lib/reservation_block'


Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new