449a4a7d75791d222f9a28214d119e0cc8f344ad
I won't be lying, Claude Code was extremely helpful to write those tests, although it had a lot of issues with properly using in-memory SQLite (db and integration tests) and with parsing responses (integration test).
Yohoho - A take-home assignment for HolidayPirates
This is my take on the take-home assignment I was given for the Backend Engineer position at HolidayPirates.
The goal is to implement a very small REST API in Clojure. That API provides two endpoints :
POST /items: creates an itemGET /items: returns the list of items
Running and testing
This project uses Leiningen. Assuming you already have Leiningen installed,
running the API should be as easy as cloning the repo and issuing lein run. By
default, the server listens on port 3000. To explore the API using Swagger UI,
you can head to http://localhost:3000/doc.
To run the unit and integration tests: lein test
Structure
The source code lies in /src/yohoho and is structured as follows:
app.clj: ring app and main entrypointconfig.clj: configuration (database and HTTP server)db.clj: functions that directly interact with the databasehandlers.clj: route handlershelpers.clj: the infamous file that holds function that are useful but couldn't fit anywhere elseroutes.clj: API routesschemas.cls: Malli schemas used for validation
Library choices
reitit: for handling routesjetty: web servermuuntaja: JSON handlingnext.jdbc: database interface (SQLite)malli: validation
Documentation links
The following links proved more than useful when working on this assignment:
- https://practical.li/clojure-web-services/building-api/
- https://github.com/metosin/reitit/blob/master/doc/ring/content_negotiation.md
- https://ostash.dev/posts/2021-08-22-data-validation-in-clojure/
- https://clojurecivitas.github.io/malli/elements_of_malli.html
- https://github.com/metosin/reitit/blob/master/doc/coercion/malli_coercion.md
- https://cljdoc.org/d/com.github.seancorfield/next.jdbc/1.3.1086/doc/getting-started
- https://cljdoc.org/d/metosin/reitit/0.10.0/doc/ring/swagger-support
- https://www.baeldung.com/clojure-ring
- https://practical.li/clojure/testing/unit-testing/
Languages
Clojure
100%