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

2.0 KiB

title created_at kind published tags summary
Testing $HOME with Cucumber and Aruba 2014-04-15 21:42:43 +0200 article true
programming
cucumber
aruba
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 and Aruba 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.