Home

Awesome

Canada Holidays

This is a fun little express app for Canada's statutory holidays. There's a frontend you can look at and an API you can use.

Using the API

Please get in touch if you are using the API and you need something, because I can probably make it work better if I have enough real-life use-cases.

Read the API docs.

There's an OpenAPI spec at Canada-Holidays-API.v1.yaml and a <a href="https://app.swaggerhub.com/apis/pcraig3/canada-holidays/" target="_blank">SwaggerHub</a> page where you can test the endpoints.

Getting started

Install npm

npm is a javascript package manager. It downloads project dependencies and runs node applications.

You'll need node version v14 or higher to run the app. (If you have an M1 Mac, you'll need v15 or higher.)

Install docker

A docker container allows a developer to package up an application and all of its parts. This means we can build an app in any language, in any stack, and then run it anywhere — whether locally or on a server.

Build and run with npm

Install the dependencies and run it. "npm run dev" runs the JS contact + minify step, and reruns it if anything changes.

Pretty slick. 😎

# install dependencies
npm install

# run application in 'dev' mode
# (ie, the server restarts when you save a file)
npm run dev

# manually run build to create /js/min/bundle.min.js file
npm run build

# run application in 'prod' mode (requires build step)
npm start

The app should be running at http://localhost:3000/.

On a Mac, press Control + C to quit the running application.

Run tests with npm

# run unit tests
npm test

# run linting
npm run lint

unit tests

Since we are still using components as interface, this makes testing really easily. On the server, we render out our components as strings that we send to the browser, but when we run tests, we want to do a bit more than that. Looking for values in big strings is pretty ugly.

Instead, using cheerio, we can load in a string like "<main><p>hello</p></main>" and then traverse it using jQuery selector syntax. So we can write assertions against stuff like $('main > p').text(), which is far better than string testing.

Build and run as a Docker container

# build an image locally
docker build -t pcraig3/hols:tag --build-arg GITHUB_SHA_ARG=<tag> .

# run the container
docker run -it -p 3000:3000 pcraig3/hols:tag

The container should be running at http://localhost:3000/.

On a Mac, press Control + C to quit the running docker container.

Push to Cloud Run

The main.yaml file contains instructions to deploy the service to Cloud Run, or you can use the CLI command below to do it manually.

gcloud builds submit --tag gcr.io/{PROJECT}/{SERVICE}:{TAG} --build-arg GITHUB_SHA_ARG={TAG}

Citations

Region#Readable sourceLegislation
Federal12Statutory holiday pay - Canada.ca-
AB9General holidays in AlbertaEmployment Standards Code
BC10Statutory Holidays in British ColumbiaEntitlement to Statutory Holiday - Act Part 5, Section 44
MB9What are the general holidays in Manitoba?The Employment Standards Code
NB8What are the 10 prescribed days of rest?Employment Standards Act
NL12Clarification on public holidays in NewfoundlandLabour Standards Act
NS6Holiday and Retail Closing Day ChartsLabour Standards Code
NT10Employment Standards: Frequently Asked QuestionsEmployment Standards Act
NU10-Labour Standards Act
ON9Public holidaysEmployment Standards Act
PE8Paid HolidaysEmployment Standards Act
QC8Jours fériés, chômés et payésLabour Standards Act
SK10List of Saskatchewan Public HolidaysThe Saskatchewan Employment Act
YK10Find a Yukon statutory holidayEmployment Standards Act