harvest-overtime
Version:
Track the overtime!
240 lines (226 loc) • 7.34 kB
text/typescript
import { expect } from "chai";
import { Employee, Report, Timesheet } from "../../src/models";
import { getOvertime, getTimesheet } from "../../src/report/calculator";
const REGULAR_DAY_HOURS = 8;
describe("Reporter.Calculator", () => {
describe(".getTimesheet", () => {
context("when there is a date", () => {
context("and is a weekday", () => {
it("returns the timesheet", () => {
const date = "2018-08-06";
const employees: Employee[] = [
{
date,
employee: true,
hours: 5,
name: "Jane Austen",
},
];
const result: Timesheet = getTimesheet(date, employees);
expect(result).to.have.property("date", date);
expect(result).to.have.property("hours", 5);
expect(result).to.have.property("isWeekend", false);
});
});
context("and is a weekend", () => {
it("returns the timesheet", () => {
const date = "2018-08-11";
const employees: Employee[] = [
{
date,
employee: false,
hours: 5,
name: "Jane Austen",
},
];
const result: Timesheet = getTimesheet(date, employees);
expect(result).to.have.property("date", date);
expect(result).to.have.property("hours", 5);
expect(result).to.have.property("isWeekend", true);
});
});
});
});
describe(".getOvertime", () => {
context("when all dates are weedays", () => {
context("and there is overtime", () => {
it("returns the overtime", () => {
const timesheet: Timesheet[] = [
{
date: "2018-08-06",
hours: 9,
isWeekend: false,
},
{
date: "2018-08-09",
hours: 10.5,
isWeekend: false,
},
];
const result: Report = getOvertime(timesheet, REGULAR_DAY_HOURS);
expect(result).to.have.property("weekdays", 3.5);
expect(result).to.have.property("weekends", 0);
});
});
context("and there is no overtime", () => {
it("returns zero", () => {
const timesheet: Timesheet[] = [
{
date: "2018-08-06",
hours: 8,
isWeekend: false,
},
{
date: "2018-08-08",
hours: 8,
isWeekend: false,
},
];
const result: Report = getOvertime(timesheet, REGULAR_DAY_HOURS);
expect(result).to.have.property("weekdays", 0);
expect(result).to.have.property("weekends", 0);
});
});
context("and there are less hours", () => {
it("returns a negative overtime", () => {
const timesheet: Timesheet[] = [
{
date: "2018-08-06",
hours: 6,
isWeekend: false,
},
{
date: "2018-08-07",
hours: 5.5,
isWeekend: false,
},
];
const result: Report = getOvertime(timesheet, REGULAR_DAY_HOURS);
expect(result).to.have.property("weekdays", -4.5);
expect(result).to.have.property("weekends", 0);
});
});
});
context("when all dates are weekends", () => {
context("and there is overtime", () => {
it("returns the overtime", () => {
const timesheet: Timesheet[] = [
{
date: "2018-08-11",
hours: 9,
isWeekend: true,
},
{
date: "2018-08-12",
hours: 9,
isWeekend: true,
},
];
const result: Report = getOvertime(timesheet, REGULAR_DAY_HOURS);
expect(result).to.have.property("weekdays", 0);
expect(result).to.have.property("weekends", 18);
});
});
context("and there is no overtime", () => {
it("returns zero", () => {
const timesheet: Timesheet[] = [
{
date: "2018-08-11",
hours: 0,
isWeekend: true,
},
{
date: "2018-08-12",
hours: 0,
isWeekend: true,
},
];
const result: Report = getOvertime(timesheet, REGULAR_DAY_HOURS);
expect(result).to.have.property("weekdays", 0);
expect(result).to.have.property("weekends", 0);
});
});
});
context("when dates are weedays and weekends", () => {
describe("and there is overtime", () => {
describe("and uses the standard regular hours", () => {
it("returns the overtime", () => {
const timesheet: Timesheet[] = [
{
date: "2018-08-11",
hours: 9,
isWeekend: false,
},
{
date: "2018-08-09",
hours: 10.5,
isWeekend: true,
},
];
const result: Report = getOvertime(timesheet, REGULAR_DAY_HOURS);
expect(result).to.have.property("weekdays", 1);
expect(result).to.have.property("weekends", 10.5);
});
});
describe("and uses another value of regular hours", () => {
it("returns the overtime", () => {
const regularDayHours = 4;
const timesheet: Timesheet[] = [
{
date: "2018-08-11",
hours: 9,
isWeekend: false,
},
{
date: "2018-08-09",
hours: 10.5,
isWeekend: true,
},
];
const result: Report = getOvertime(timesheet, regularDayHours);
expect(result).to.have.property("weekdays", 5);
expect(result).to.have.property("weekends", 10.5);
});
});
});
context("and there is no overtime", () => {
it("returns zero", () => {
const timesheet: Timesheet[] = [
{
date: "2018-08-06",
hours: 8,
isWeekend: false,
},
{
date: "2018-08-11",
hours: 0,
isWeekend: true,
},
];
const result: Report = getOvertime(timesheet, REGULAR_DAY_HOURS);
expect(result).to.have.property("weekdays", 0);
expect(result).to.have.property("weekends", 0);
});
});
context("and there are less hours", () => {
it("returns a negative overtime", () => {
const timesheet: Timesheet[] = [
{
date: "2018-08-06",
hours: 6,
isWeekend: false,
},
{
date: "2018-08-11",
hours: 0,
isWeekend: true,
},
];
const result: Report = getOvertime(timesheet, REGULAR_DAY_HOURS);
expect(result).to.have.property("weekdays", -2);
expect(result).to.have.property("weekends", 0);
});
});
});
});
});