devroom.io/content/posts/2014-04-15-testing-home-with-cucumber-and-aruba.md
2014-04-16 10:04:50 +02:00

70 lines
2.0 KiB
Markdown

---
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 <code>$HOME</code> 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