--- title: "Testing $HOME with Cucumber and Aruba" created_at: 2014-04-15 21:42:43 +0200 kind: article published: true tags: - programming - cucumber - aruba summary: | Cucumber and Aruba make it awesome to write acceptance tests for your command line programs. But how do you test your program interacting with files from a user's $HOME directory? --- [Cucumber][1] and [Aruba][2] are awesome tools to write acceptance tests for your command line application. The allow you to do things like this: ``` :::gherkin Scenario: Exit with 0 when no examples are run Given a file named "a_no_examples_spec.rb" with: """ruby """ When I run `rspec a_no_examples_spec.rb` Then the exit status should be 0 And the output should contain "0 examples" ``` _This example was taken rspec-core._ Aruba basically does three things for you: * Create and inspect files and directories * Run commands * Inspect output and exit status ## The problem Now, if you are writing a CLI that interacts with a configuration file in the user's home directory, you'd write a cucumber like this: ``` :::gherkin Scenario: use .my-app configuration Given a file named "~/.my-app" with: """ awesome_enabled: true """ When I run `my-app` Then the output should contain "AWESOME" ``` But how does your app and Aruba differentiate between this generated test file and your actual configration file in your home directory? It doens't. ## The answer The solution is quite easy and elegant, in your `Before` set the `$HOME` environment variable to a custom location inside the `tmp/aruba` directory. In `features/support/env.rb`: ``` :::ruby Before do set_env 'HOME', File.expand_path(File.join(current_dir, 'home')) FileUtils.mkdir_p ENV['HOME'] end ``` This will set `$HOME` to `tmp/aruba/home` in the context of your cucumbers (and execute binary). `current_dir` automatically points to the right location for the aruba temporary directory. [1]: https://github.com/cucumber/cucumber [2]: https://github.com/cucumber/aruba