# Availability Tests
Source gist: https://gist.github.com/n8io/8b2b8f3cd30c95e6aa64ba1b1881b63b
```typescript=
import { DayOfWeek, WorkingHours } from '@microsoft/microsoft-graph-types'
import { AvailabilityViewToAvailabilityViewSansWorkingHoursParameters, availabilityViewToAvailabilityViewSansWorkingHours } from '.'
import { ScheduleItemAvailability } from '../../models'
const { BUSY, FREE } = ScheduleItemAvailability
describe('availabilityViewToAvailabilityViewSansWorkingHours', () => {
const baseInput: AvailabilityViewToAvailabilityViewSansWorkingHoursParameters = {
durationInMinutes: 60,
startDate: new Date('2022-01-02T05:01Z'), // Sunday Jan 1st, 12:01am EST (The '01' is used verify we're rounding to the nearest duration)
view: undefined,
workingHours: {
timeZone: { name: 'Eastern Standard Time' },
},
}
const freeAllWeek = FREE.repeat(24 * 7)
const mondayThruFriday: DayOfWeek[] = ['monday', 'tuesday', 'tuesday', 'wednesday', 'thursday', 'friday']
describe('when given no work hours', () => {
const workingHours: WorkingHours | undefined = undefined
test('returns unmodified blocks', () => {
const view = 'VIEW_UNCHANGED'
const actual = availabilityViewToAvailabilityViewSansWorkingHours({
...baseInput,
view,
// @ts-expect-error we're passing undefined on purpose
workingHours,
})
expect(actual).toEqual(view)
})
})
describe('when given empty work hours', () => {
const workingHours: WorkingHours = {}
test('returns unmodified blocks', () => {
const view = 'VIEW_UNCHANGED'
const actual = availabilityViewToAvailabilityViewSansWorkingHours({
...baseInput,
view,
workingHours,
})
expect(actual).toEqual(view)
})
})
describe('when given valid working hours', () => {
describe('and work days and hours are restricted', () => {
test('return only the restricted work days and work hours', () => {
const actual = availabilityViewToAvailabilityViewSansWorkingHours({
...baseInput,
view: freeAllWeek,
workingHours: {
...baseInput.workingHours,
daysOfWeek: mondayThruFriday,
startTime: '09:00:00',
endTime: '17:00:00',
},
})
const weekend = BUSY.repeat(24)
const weekday = [BUSY.repeat(9), FREE.repeat(8), BUSY.repeat(7)].join('')
const dollyPartonHoursView = [
// Only working weekdays, 9a-5p
weekend,
weekday.repeat(5),
weekend,
].join('')
expect(actual).toEqual(dollyPartonHoursView)
})
})
describe('and work days are NOT restricted', () => {
const daysOfWeek: DayOfWeek[] = []
test('returns every day restricted by working hours', () => {
const actual = availabilityViewToAvailabilityViewSansWorkingHours({
...baseInput,
view: freeAllWeek,
workingHours: {
...baseInput.workingHours,
daysOfWeek,
startTime: '09:00:00',
endTime: '17:00:00',
},
})
const workday = [BUSY.repeat(9), FREE.repeat(8), BUSY.repeat(7)].join('')
// Every day 9a-5p
const expected = workday.repeat(7)
expect(actual).toEqual(expected)
})
})
describe('and only work start hour is restricted', () => {
test('returns only the work hours after the start time', () => {
const actual = availabilityViewToAvailabilityViewSansWorkingHours({
...baseInput,
view: freeAllWeek,
workingHours: {
...baseInput.workingHours,
startTime: '09:00:00',
endTime: undefined,
},
})
const workday = [BUSY.repeat(9), FREE.repeat(15)].join('')
// Every day after 9a
const expected = workday.repeat(7)
expect(actual).toEqual(expected)
})
})
describe('and only work end hour is restricted', () => {
test('returns only the hours before the end time', () => {
const actual = availabilityViewToAvailabilityViewSansWorkingHours({
...baseInput,
view: freeAllWeek,
workingHours: {
...baseInput.workingHours,
startTime: undefined,
endTime: '17:00:00',
},
})
const workday = [FREE.repeat(17), BUSY.repeat(7)].join('')
// Every day before 5p
const expected = workday.repeat(7)
expect(actual).toEqual(expected)
})
})
describe('and work hours are not restricted', () => {
test('returns only the time blocks on work days', () => {
const actual = availabilityViewToAvailabilityViewSansWorkingHours({
...baseInput,
view: freeAllWeek,
workingHours: {
...baseInput.workingHours,
daysOfWeek: mondayThruFriday,
startTime: undefined,
endTime: undefined,
},
})
const weekend = BUSY.repeat(24) // Busy all day
const weekday = FREE.repeat(24) // Free all day
const expected = [
// Every weekday day, all day
weekend,
weekday.repeat(5),
weekend,
].join('')
expect(actual).toEqual(expected)
})
})
})
describe('when the view has non-availabilities', () => {
const busyFrom9aTo5p = [FREE.repeat(9), BUSY.repeat(8), FREE.repeat(7)].join('')
const workingHours: WorkingHours = {
...baseInput.workingHours,
daysOfWeek: ['sunday'],
startTime: '09:00:00',
endTime: '17:00:00',
}
test('view non-availabilities supersede working hour availabilities', () => {
const actual = availabilityViewToAvailabilityViewSansWorkingHours({
...baseInput,
view: busyFrom9aTo5p,
workingHours,
})
const expected = BUSY.repeat(busyFrom9aTo5p.length)
expect(actual).toEqual(expected)
})
})
describe('when the start date is not the beginning of the day or week', () => {
const startDate = new Date('2022-01-05T10:00Z')
const workingHours: WorkingHours = {
...baseInput.workingHours,
daysOfWeek: [],
startTime: '11:00:00',
endTime: '13:00:00',
}
test('view non-availabilities supersede working hour availabilities', () => {
const actual = availabilityViewToAvailabilityViewSansWorkingHours({
...baseInput,
startDate,
view: '0220',
workingHours,
})
expect(actual).toEqual('2222')
})
})
describe.only('when the duration is 15 minutes', () => {
const durationInMinutes = 15
test('view non-availabilities supersede working hour availabilities', () => {
const freeAllWeek15MinBlocks = FREE.repeat(7 * 24 * (60 / durationInMinutes))
const actual = availabilityViewToAvailabilityViewSansWorkingHours({
...baseInput,
durationInMinutes,
view: freeAllWeek15MinBlocks,
workingHours: {
...baseInput.workingHours,
daysOfWeek: mondayThruFriday,
startTime: '09:00:00',
endTime: '17:00:00',
},
})
const weekend = BUSY.repeat(96) // Busy all day
const workday = [BUSY.repeat(36), FREE.repeat(32), BUSY.repeat(28)].join('') // Free all day
const expected = [
// Every weekday day, all day
weekend,
workday.repeat(5),
weekend,
].join('')
expect(actual).toEqual(expected)
})
})
})
```