Technical Test @ Doctolib

The goal is to write an algorithm that finds availabilities in an agenda depending on the events attached to it. The main method has a start date for input and is looking for the availabilities over the next 7 days.

There are two kinds of events:

  • 'opening', are the openings for a specific day and they can be reccuring week by week.
  • 'appointment', times when the doctor is already booked.

To init the project:

rails new doctolib-test
rails g model event starts_at:datetime ends_at:datetime kind:string weekly_recurring:boolean

Your Mission:

  • coded for rails 5.1
  • contained in two files named event.rb and event_test.rb
  • must pass the unit tests below
  • add tests for edge cases
  • be pragmatic about performance
# test/models/event_test.rb

require 'test_helper'

class EventTest < ActiveSupport::TestCase
  
  test "one simple test example" do
    
    Event.create kind: 'opening', starts_at: DateTime.parse("2014-08-04 09:30"), ends_at: DateTime.parse("2014-08-04 12:30"), weekly_recurring: true
    Event.create kind: 'appointment', starts_at: DateTime.parse("2014-08-11 10:30"), ends_at: DateTime.parse("2014-08-11 11:30")

    availabilities = Event.availabilities DateTime.parse("2014-08-10")
    assert_equal Date.new(2014, 8, 10), availabilities[0][:date]
    assert_equal [], availabilities[0][:slots]
    assert_equal Date.new(2014, 8, 11), availabilities[1][:date]
    assert_equal ["9:30", "10:00", "11:30", "12:00"], availabilities[1][:slots]
    assert_equal [], availabilities[2][:slots]
    assert_equal Date.new(2014, 8, 16), availabilities[6][:date]
    assert_equal 7, availabilities.length
  end
  
end