Skip to content

Commit

Permalink
fix(bookings): [PPT-1835] booked desks showing up as available (#340)
Browse files Browse the repository at this point in the history
  • Loading branch information
chillfox authored Feb 6, 2025
1 parent bc59a99 commit 8d190ff
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 29 deletions.
114 changes: 86 additions & 28 deletions spec/controllers/bookings_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -39,34 +39,6 @@ describe Bookings do
body.size.should eq(1)
end

it "should return a list of asset ids" do
tenant = get_tenant

booking1 = BookingsHelper.create_booking(tenant.id.not_nil!)
sleep 1
booking2 = BookingsHelper.create_booking(tenant.id.not_nil!)

starting = 5.minutes.from_now.to_unix
ending = 90.minutes.from_now.to_unix
route = "#{BOOKINGS_BASE}/booked?period_start=#{starting}&period_end=#{ending}&user=#{booking1.user_email}&type=desk"
body = JSON.parse(client.get(route, headers: headers).body).as_a

body.first.should eq(booking1.asset_ids.first)

# filter by zones
zones1 = booking1.zones.not_nil!
zones_string = "#{zones1.first},#{booking2.zones.not_nil!.last}"
route = "#{BOOKINGS_BASE}/booked?period_start=#{starting}&period_end=#{ending}&type=desk&zones=#{zones_string}"

body = JSON.parse(client.get(route, headers: headers).body).as_a
body.map(&.as_s).should eq booking1.asset_ids.concat(booking2.asset_ids).uniq!

# More filters by zones
route = "#{BOOKINGS_BASE}/booked?period_start=#{starting}&period_end=#{ending}&type=desk&zones=#{zones1.first}"
body = JSON.parse(client.get(route, headers: headers).body).as_a
body.first.in?(booking1.asset_ids.concat(booking2.asset_ids).uniq!).should be_true
end

it "should supports pagination on list of bookings request" do
tenant = get_tenant

Expand Down Expand Up @@ -542,6 +514,92 @@ describe Bookings do
end
end

describe "#booked" do
it "should return a list of asset ids" do
tenant = get_tenant

booking1 = BookingsHelper.create_booking(tenant.id.not_nil!)
sleep 1
booking2 = BookingsHelper.create_booking(tenant.id.not_nil!)

starting = 5.minutes.from_now.to_unix
ending = 90.minutes.from_now.to_unix
route = "#{BOOKINGS_BASE}/booked?period_start=#{starting}&period_end=#{ending}&user=#{booking1.user_email}&type=desk"
body = JSON.parse(client.get(route, headers: headers).body).as_a

body.first.should eq(booking1.asset_ids.first)

# filter by zones
zones1 = booking1.zones.not_nil!
zones_string = "#{zones1.first},#{booking2.zones.not_nil!.last}"
route = "#{BOOKINGS_BASE}/booked?period_start=#{starting}&period_end=#{ending}&type=desk&zones=#{zones_string}"

body = JSON.parse(client.get(route, headers: headers).body).as_a
body.map(&.as_s).should eq booking1.asset_ids.concat(booking2.asset_ids).uniq!

# More filters by zones
route = "#{BOOKINGS_BASE}/booked?period_start=#{starting}&period_end=#{ending}&type=desk&zones=#{zones1.first}"
body = JSON.parse(client.get(route, headers: headers).body).as_a
body.first.in?(booking1.asset_ids.concat(booking2.asset_ids).uniq!).should be_true
end

it "should return a list of asset ids (including checked in)" do
tenant_id = get_tenant.id.not_nil!

starting = Time.utc.to_unix
ending = 90.minutes.from_now.to_unix

booking1 = BookingsHelper.create_booking(
tenant_id: tenant_id,
booking_start: 1.minutes.from_now.to_unix,
booking_end: 30.minutes.from_now.to_unix, asset_id: "desk-1")

client.post("#{BOOKINGS_BASE}/#{booking1.id}/check_in", headers: headers)

booking2 = BookingsHelper.create_booking(
tenant_id: tenant_id,
booking_start: 5.minutes.from_now.to_unix,
booking_end: 35.minutes.from_now.to_unix, asset_id: "desk-2")

sleep 1

zones_string = "#{booking1.zones.not_nil!.first},#{booking2.zones.not_nil!.first}"
route = "#{BOOKINGS_BASE}/booked?period_start=#{starting}&period_end=#{ending}&type=desk&zones=#{zones_string}"
asset_ids = Array(String).from_json client.get(route, headers: headers).body
asset_ids.should contain("desk-1")
asset_ids.should contain("desk-2")
end

it "should return a list of asset ids (excluding checked out and deleted)", focus: true do
tenant_id = get_tenant.id.not_nil!

starting = Time.utc.to_unix
ending = 90.minutes.from_now.to_unix

booking1 = BookingsHelper.create_booking(
tenant_id: tenant_id,
booking_start: 1.minutes.from_now.to_unix,
booking_end: 30.minutes.from_now.to_unix, asset_id: "desk-1")

client.post("#{BOOKINGS_BASE}/#{booking1.id}/check_in", headers: headers)
client.post("#{BOOKINGS_BASE}/#{booking1.id}/check_in?state=false", headers: headers)

booking2 = BookingsHelper.create_booking(
tenant_id: tenant_id,
booking_start: 5.minutes.from_now.to_unix,
booking_end: 35.minutes.from_now.to_unix, asset_id: "desk-2")
client.delete("#{BOOKINGS_BASE}/#{booking2.id}", headers: headers)

sleep 1

zones_string = "#{booking1.zones.not_nil!.first},#{booking2.zones.not_nil!.first}"
route = "#{BOOKINGS_BASE}/booked?period_start=#{starting}&period_end=#{ending}&type=desk&zones=#{zones_string}"
asset_ids = Array(String).from_json client.get(route, headers: headers).body
asset_ids.should_not contain("desk-1")
asset_ids.should_not contain("desk-2")
end
end

it "should include bookins made on behalf of other users when include_booked_by=true" do
tenant = get_tenant
booking1 = BookingsHelper.create_booking(tenant_id: tenant.id.not_nil!, user_email: "[email protected]")
Expand Down
2 changes: 1 addition & 1 deletion src/controllers/bookings.cr
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ class Bookings < Application
created_before: created_before, created_after: created_after, approved: approved, rejected: false, extension_data: extension_data, state: state,
department: department, event_id: event_id, ical_uid: ical_uid, limit: limit, offset: offset, permission: permission, link_ext: "booked")
asset_ids = [] of String
result.each { |b| asset_ids.concat(b.asset_ids) unless b.checked_in_at || b.deleted }
result.each { |b| asset_ids.concat(b.asset_ids) unless b.checked_out_at || b.deleted }
asset_ids.uniq!
end

Expand Down

0 comments on commit 8d190ff

Please sign in to comment.