{"id":18917083,"url":"https://github.com/fundingcircle/jukebox","last_synced_at":"2025-10-17T03:06:23.002Z","repository":{"id":37883778,"uuid":"164164147","full_name":"FundingCircle/jukebox","owner":"FundingCircle","description":"All the best songs. Discuss in #jukebox on Clojurians Slack.","archived":false,"fork":false,"pushed_at":"2025-07-09T08:48:24.000Z","size":203,"stargazers_count":18,"open_issues_count":4,"forks_count":3,"subscribers_count":60,"default_branch":"master","last_synced_at":"2025-07-16T09:58:10.825Z","etag":null,"topics":["acceptance-tests","bdd-framework","clojure-library","gherkin"],"latest_commit_sha":null,"homepage":"","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FundingCircle.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-01-04T23:19:36.000Z","updated_at":"2024-04-30T16:21:47.000Z","dependencies_parsed_at":"2024-11-08T10:38:30.449Z","dependency_job_id":null,"html_url":"https://github.com/FundingCircle/jukebox","commit_stats":{"total_commits":28,"total_committers":6,"mean_commits":4.666666666666667,"dds":0.4642857142857143,"last_synced_commit":"c774bc34fbd4385635f3ae18e238152915cca719"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/FundingCircle/jukebox","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FundingCircle%2Fjukebox","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FundingCircle%2Fjukebox/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FundingCircle%2Fjukebox/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FundingCircle%2Fjukebox/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FundingCircle","download_url":"https://codeload.github.com/FundingCircle/jukebox/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FundingCircle%2Fjukebox/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279275286,"owners_count":26138567,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-17T02:00:07.504Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["acceptance-tests","bdd-framework","clojure-library","gherkin"],"created_at":"2024-11-08T10:23:53.188Z","updated_at":"2025-10-17T03:06:22.994Z","avatar_url":"https://github.com/FundingCircle.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Jukebox - A Clojure BDD Testing Library\n\n[![Clojars Project](https://img.shields.io/clojars/v/fundingcircle/jukebox.svg)](https://clojars.org/fundingcircle/jukebox)\n\n\u003e [!WARNING]\n\u003e This project is no longer actively maintained. We recommend migrating to an alternative library for future development.\n\nThis is a simple library that hooks clojure into BDD frameworks such\nas cucumber.\n\nHere's an example feature.\n```\nFeature: Belly\n\n  Scenario: a few cukes\n    Given I have 42 cukes in my belly\n    When I wait 2 hours\n    Then my belly should growl\n```\n\nClojure functions can be mapped to each step by tagging it with `:scene/step`:\n```clojure\n(defn i-have-cukes-in-my-belly\n  \"Returns an updated `board`.\"\n  {:scene/step \"I have {int} cukes in my belly\"}\n  [board cukes]\n  ;; Write code here that turns the phrase above into concrete actions\n  (throw (cucumber.api.PendingException.)))\n\n(defn i-wait-hours\n  \"Returns an updated `board`.\"\n  {:scene/step \"I wait {int} hours\"}\n  [board hours]\n  ;; Write code here that turns the phrase above into concrete actions\n  (throw (cucumber.api.PendingException.)))\n\n(defn my-belly-should-growl\n  \"Returns an updated `board`.\"\n  {:scene/step \"my belly should growl\"}\n  [board]\n  ;; Write code here that turns the phrase above into concrete actions\n  (throw (cucumber.api.PendingException.)))\n```\n\nFunctions with multiple arities can also be tagged. (Clojure allows metadata to be placed after the function body. This example uses that style.)\n```clojure\n(defn i-wait-hours\n  \"Returns an updated `board`.\"\n  ([board]\n   ;; Write code here that turns the phrase above into concrete actions\n   (throw (cucumber.api.PendingException.)))\n  ([board hours]\n   ;; Write code here that turns the phrase above into concrete actions\n   (throw (cucumber.api.PendingException.)))\n\n  {:scene/steps [\"It felt like forever\"\n                 \"I wait {int} hours\"]})\n```\n\nFunctions can be registered to run before or after a scenario by\ntagging them with `:scene/before` or `:scene/after` (or both).\nA list of tags can also be provided.\n```clojure\n(defn ^:scene/before setup\n  \"Initializes systems under test.\"\n  {:scene/tags [\"tag-a\" \"tag-b\"]}\n  [board scenario])\n\n(defn ^:scene/after teardown\n  \"Tears down the test system.\"\n  [board scenario])\n```\n\nA function can be registered to be run before or after each step by\ntagging it with `:scene/before-step` or `:scene/after-step`:\n```clojure\n(defn ^:scene/before-step before-step\n  \"Runs before each scenario step.\"\n  [board])\n\n(defn ^:scene/after-step after-step\n  \"Runs after each scenario step.\"\n  [board])\n```\n\n## Usage\n\n[Tap](https://github.com/matthias-margush/aka) the jukebox aliases:\n\n``` shell\n჻ aka tap -o deps.edn :jukebox https://raw.githubusercontent.com/FundingCircle/jukebox/master/aliases.edn\nTapped :jukebox/cucumber\nTapped :jukebox/snippets\n\n჻ aka describe :jukebox/\n:jukebox/cucumber - Execute scenarios with the cucumber runner.\n:jukebox/snippets - Generate code snippets for scenarios.\n\n჻ aka describe :jukebox/cucumber\nExecute scenarios with the cucumber runner.\n\nUsage: clj -A:jukebox/cucumber [options] \u003cfeatures dir\u003e\n\nOptions:\n  -h, --help        Additional cucumber help.\n  -t, --tags \u003ctags\u003e Only run scenarios with matching tags.\n\n჻ aka describe :jukebox/snippets\nGenerate code snippets for scenarios.\n\nUsage: clj -A:jukebox/snippets \u003cfeatures dir\u003e\n```\n\n## License\n\nCopyright © 2019 Funding Circle\n\nDistributed under the BSD 3-Clause License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffundingcircle%2Fjukebox","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffundingcircle%2Fjukebox","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffundingcircle%2Fjukebox/lists"}