summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDaniel Beauchamp <daniel.beauchamp@shopify.com>2014-01-12 23:17:39 -0800
committerDaniel Beauchamp <daniel.beauchamp@shopify.com>2014-01-12 23:17:39 -0800
commit9e8dfe7d4290f0150fdef10230cd0ca7a75c9755 (patch)
treeccd82c459d988ac2846db6178710b47113b377a4 /test
parent5b045724acd44e691552c0fb8f86b61aa2e0cd06 (diff)
parentc49b9bc5d47fe02d26836dee5034fe28490f0ebd (diff)
Merge pull request #296 from Shopify/updating_gems_and_refactoring
Updating gems and refactoring
Diffstat (limited to 'test')
-rw-r--r--test/app_test.rb126
-rw-r--r--test/cli_test.rb176
-rw-r--r--test/downloader_test.rb26
-rw-r--r--test/test_helper.rb35
4 files changed, 275 insertions, 88 deletions
diff --git a/test/app_test.rb b/test/app_test.rb
index 0032165..4101e91 100644
--- a/test/app_test.rb
+++ b/test/app_test.rb
@@ -1,13 +1,48 @@
require 'test_helper'
-require File.expand_path('../../lib/dashing', __FILE__)
-Sinatra::Application.settings.history_file = File.join(Dir.tmpdir, 'history.yml')
+require 'haml'
class AppTest < Dashing::Test
def setup
@connection = []
- Sinatra::Application.settings.connections = [@connection]
- Sinatra::Application.settings.auth_token = nil
- Sinatra::Application.settings.default_dashboard = nil
+ app.settings.connections = [@connection]
+ app.settings.auth_token = nil
+ app.settings.default_dashboard = nil
+ app.settings.history_file = File.join(Dir.tmpdir, 'history.yml')
+ end
+
+ def test_redirect_to_first_dashboard
+ with_generated_project do
+ get '/'
+ assert_equal 302, last_response.status
+ assert_equal 'http://example.org/sample', last_response.location
+ end
+ end
+
+ def test_redirect_to_first_dashboard_without_erb
+ with_generated_project do |dir|
+ FileUtils.touch(File.join(dir, "dashboards/htmltest.html"))
+ get '/'
+ assert_equal 302, last_response.status
+ assert_equal 'http://example.org/htmltest', last_response.location
+ end
+ end
+
+ def test_redirect_to_default_dashboard
+ with_generated_project do
+ app.settings.default_dashboard = 'test1'
+ get '/'
+ assert_equal 302, last_response.status
+ assert_equal 'http://example.org/test1', last_response.location
+ end
+ end
+
+ def test_errors_out_when_no_dashboards_available
+ with_generated_project do
+ app.settings.views = File.join(app.settings.root, 'lib')
+
+ get '/'
+ assert_equal 500, last_response.status
+ end
end
def test_post_widgets_without_auth_token
@@ -22,13 +57,13 @@ class AppTest < Dashing::Test
end
def test_post_widgets_with_invalid_auth_token
- Sinatra::Application.settings.auth_token = 'sekrit'
+ app.settings.auth_token = 'sekrit'
post '/widgets/some_widget', JSON.generate({value: 9})
assert_equal 401, last_response.status
end
def test_post_widgets_with_valid_auth_token
- Sinatra::Application.settings.auth_token = 'sekrit'
+ app.settings.auth_token = 'sekrit'
post '/widgets/some_widget', JSON.generate({value: 9, auth_token: 'sekrit'})
assert_equal 204, last_response.status
end
@@ -52,71 +87,39 @@ class AppTest < Dashing::Test
assert_equal 'reload', parse_data(@connection[0])['event']
end
- def test_redirect_to_default_dashboard
- with_generated_project do
- Sinatra::Application.settings.default_dashboard = 'test1'
- get '/'
- assert_equal 302, last_response.status
- assert_equal 'http://example.org/test1', last_response.location
- end
- end
-
- def test_redirect_to_first_dashboard
- with_generated_project do
- get '/'
- assert_equal 302, last_response.status
- assert_equal 'http://example.org/sample', last_response.location
- end
- end
-
- def test_redirect_to_first_dashboard_without_erb
- with_generated_project do |dir|
- FileUtils.touch(File.join(dir, "dashboards/htmltest.html"))
- get '/'
- assert_equal 302, last_response.status
- assert_equal 'http://example.org/htmltest', last_response.location
- end
- end
-
def test_get_dashboard
with_generated_project do
get '/sampletv'
assert_equal 200, last_response.status
- assert_include last_response.body, 'class="gridster"'
- assert_include last_response.body, "DOCTYPE"
+ assert_includes last_response.body, 'class="gridster"'
+ assert_includes last_response.body, "DOCTYPE"
end
end
def test_page_title_set_correctly
with_generated_project do
get '/sampletv'
- assert_include last_response.body, '<title>1080p dashboard</title>'
+ assert_includes last_response.body, '<title>1080p dashboard</title>'
end
end
- begin
- require 'haml'
-
- def test_get_haml_dashboard
- with_generated_project do |dir|
- File.write(File.join(dir, 'dashboards/hamltest.haml'), '.gridster')
- get '/hamltest'
- assert_equal 200, last_response.status
- assert_include last_response.body, "class='gridster'"
- end
+ def test_get_haml_dashboard
+ with_generated_project do |dir|
+ File.write(File.join(dir, 'dashboards/hamltest.haml'), '.gridster')
+ get '/hamltest'
+ assert_equal 200, last_response.status
+ assert_includes last_response.body, "class='gridster'"
end
+ end
- def test_get_haml_widget
- with_generated_project do |dir|
- File.write(File.join(dir, 'widgets/clock/clock.haml'), '%h1 haml')
- File.unlink(File.join(dir, 'widgets/clock/clock.html'))
- get '/views/clock.html'
- assert_equal 200, last_response.status
- assert_include last_response.body, '<h1>haml</h1>'
- end
+ def test_get_haml_widget
+ with_generated_project do |dir|
+ File.write(File.join(dir, 'widgets/clock/clock.haml'), '%h1 haml')
+ File.unlink(File.join(dir, 'widgets/clock/clock.html'))
+ get '/views/clock.html'
+ assert_equal 200, last_response.status
+ assert_includes last_response.body, '<h1>haml</h1>'
end
- rescue LoadError
- puts "[skipping haml tests because haml isn't installed]"
end
def test_get_nonexistent_dashboard
@@ -130,18 +133,21 @@ class AppTest < Dashing::Test
with_generated_project do
get '/views/meter.html'
assert_equal 200, last_response.status
- assert_include last_response.body, 'class="meter"'
+ assert_includes last_response.body, 'class="meter"'
end
end
def with_generated_project
+ source_path = File.expand_path('../../templates', __FILE__)
+
temp do |dir|
cli = Dashing::CLI.new
+ cli.stubs(:source_paths).returns([source_path])
silent { cli.new 'new_project' }
- Sinatra::Application.settings.views = File.join(dir, 'new_project/dashboards')
- Sinatra::Application.settings.root = File.join(dir, 'new_project')
- yield Sinatra::Application.settings.root
+ app.settings.views = File.join(dir, 'new_project/dashboards')
+ app.settings.root = File.join(dir, 'new_project')
+ yield app.settings.root
end
end
diff --git a/test/cli_test.rb b/test/cli_test.rb
index 6c43e2c..567827e 100644
--- a/test/cli_test.rb
+++ b/test/cli_test.rb
@@ -1,28 +1,168 @@
require 'test_helper'
-silent{ load 'bin/dashing' }
-module Thor::Actions
- def source_paths
- [File.join(File.expand_path(File.dirname(__FILE__)), '../templates')]
+class CLITest < Dashing::Test
+ def setup
+ @cli = Dashing::CLI.new
+ end
+
+ def test_new_task_creates_project_directory
+ app_name = 'custom_dashboard'
+ @cli.stubs(:directory).with(:project, app_name).once
+ @cli.new(app_name)
end
-end
-class CliTest < Dashing::Test
+ def test_generate_task_delegates_to_type
+ types = %w(widget dashboard job)
- def test_project_directory_created
- temp do |dir|
- cli = Dashing::CLI.new
- silent{ cli.new 'Dashboard' }
- assert Dir.exist?(File.join(dir,'dashboard')), 'Dashing directory was not created.'
+ types.each do |type|
+ @cli.stubs(:public_send).with("generate_#{type}".to_sym, 'name').once
+ @cli.generate(type, 'name')
end
end
- def test_hyphenate
- assert_equal 'power', Dashing::CLI.hyphenate('Power')
- assert_equal 'power', Dashing::CLI.hyphenate('POWER')
- assert_equal 'power-rangers', Dashing::CLI.hyphenate('PowerRangers')
- assert_equal 'power-ranger', Dashing::CLI.hyphenate('Power_ranger')
- assert_equal 'super-power-rangers', Dashing::CLI.hyphenate('SuperPowerRangers')
+ def test_generate_task_warns_when_generator_is_not_defined
+ output, _ = capture_io do
+ @cli.generate('wtf', 'name')
+ end
+
+ assert_includes output, 'Invalid generator'
+ end
+
+ def test_generate_widget_creates_a_new_widget
+ @cli.stubs(:directory).with(:widget, 'widgets').once
+ @cli.generate_widget('WidgetName')
+ assert_equal 'widget_name', @cli.name
+ end
+
+ def test_generate_dashboard_creates_a_new_dashboard
+ @cli.stubs(:directory).with(:dashboard, 'dashboards').once
+ @cli.generate_dashboard('DashBoardName')
+ assert_equal 'dash_board_name', @cli.name
+ end
+
+ def test_generate_job_creates_a_new_job
+ @cli.stubs(:directory).with(:job, 'jobs').once
+ @cli.generate_job('MyCustomJob')
+ assert_equal 'my_custom_job', @cli.name
+ end
+
+ def test_install_task_requests_gist_from_downloader
+ return_value = { 'files' => [] }
+ Dashing::Downloader.stubs(:get_gist).with(123).returns(return_value).once
+
+ capture_io { @cli.install(123) }
+ end
+
+ def test_install_task_calls_create_file_for_each_valid_file_in_gist
+ json_response = <<-JSON
+ {
+ "files": {
+ "ruby_job.rb": { "content": "some job content" },
+ "num.html": { "content": "some html content" },
+ "num.scss": { "content": "some sass content" },
+ "num.coffee": { "content": "some coffee content" }
+ }
+ }
+ JSON
+
+ Dir.stubs(:pwd).returns('')
+
+ Dashing::Downloader.stubs(:get_gist).returns(JSON.parse(json_response))
+ @cli.stubs(:create_file).with('/jobs/ruby_job.rb', 'some job content').once
+ @cli.stubs(:create_file).with('/widgets/num/num.html', 'some html content').once
+ @cli.stubs(:create_file).with('/widgets/num/num.scss', 'some sass content').once
+ @cli.stubs(:create_file).with('/widgets/num/num.coffee', 'some coffee content').once
+
+ capture_io { @cli.install(123) }
+ end
+
+ def test_install_task_ignores_invalid_files
+ json_response = <<-JSON
+ {
+ "files": {
+ "ruby_job.js": { "content": "some job content" },
+ "num.css": { "content": "some sass content" }
+ }
+ }
+ JSON
+
+ Dashing::Downloader.stubs(:get_gist).returns(JSON.parse(json_response))
+ @cli.stubs(:create_file).never
+
+ capture_io { @cli.install(123) }
+ end
+
+ def test_install_task_warns_when_gist_not_found
+ error = OpenURI::HTTPError.new('error', mock())
+ Dashing::Downloader.stubs(:get_gist).raises(error)
+
+ output, _ = capture_io { @cli.install(123) }
+
+ assert_includes output, 'Could not find gist at '
+ end
+
+ def test_start_task_starts_thin_with_default_port
+ command = 'bundle exec thin -R config.ru start -p 3030 '
+ @cli.stubs(:run_command).with(command).once
+ @cli.start
end
-end \ No newline at end of file
+ def test_start_task_starts_thin_with_specified_port
+ command = 'bundle exec thin -R config.ru start -p 2020'
+ @cli.stubs(:run_command).with(command).once
+ @cli.start('-p', '2020')
+ end
+
+ def test_start_task_supports_job_path_option
+ commands = [
+ 'export JOB_PATH=other_spot; ',
+ 'bundle exec thin -R config.ru start -p 3030 '
+ ]
+
+ @cli.stubs(:options).returns(job_path: 'other_spot')
+ @cli.stubs(:run_command).with(commands.join('')).once
+ @cli.start
+ end
+
+ def test_stop_task_stops_thin_server
+ @cli.stubs(:run_command).with('bundle exec thin stop')
+ @cli.stop
+ end
+
+ def test_job_task_requires_job_file
+ Dir.stubs(:pwd).returns('')
+ @cli.stubs(:require_file).with('/jobs/special_job.rb').once
+
+ @cli.job('special_job')
+ end
+
+ def test_job_task_requires_every_ruby_file_in_lib
+ Dir.stubs(:pwd).returns('')
+ Dir.stubs(:[]).returns(['lib/dashing/cli.rb', 'lib/dashing.rb'])
+ @cli.stubs(:require_file).times(3)
+
+ @cli.job('special_job')
+ end
+
+ def test_job_sets_auth_token
+ @cli.class.stubs(:auth_token=).with('my_token').once
+ @cli.stubs(:require_file)
+
+ @cli.job('my_job', 'my_token')
+ end
+
+ def test_hyphenate_lowers_and_hyphenates_inputs
+ assertion_map = {
+ 'Power' => 'power',
+ 'POWER' => 'power',
+ 'PowerRangers' => 'power-rangers',
+ 'Power_ranger' => 'power-ranger',
+ 'SuperPowerRangers' => 'super-power-rangers'
+ }
+
+ assertion_map.each do |input, expected|
+ assert_equal expected, Dashing::CLI.hyphenate(input)
+ end
+ end
+
+end
diff --git a/test/downloader_test.rb b/test/downloader_test.rb
new file mode 100644
index 0000000..930ad56
--- /dev/null
+++ b/test/downloader_test.rb
@@ -0,0 +1,26 @@
+require 'test_helper'
+
+class DownloaderTest < Minitest::Test
+
+ def test_get_json_requests_and_parses_content
+ endpoint = 'http://somehost.com/file.json'
+ response = '{ "name": "value" }'
+ FakeWeb.register_uri(:get, endpoint, body: response)
+ JSON.stubs(:parse).with(response).once
+
+ Dashing::Downloader.get_json(endpoint)
+ end
+
+ def test_get_json_raises_on_bad_request
+ FakeWeb.register_uri(:get, 'http://dead-host.com/', status: '404')
+
+ assert_raises(OpenURI::HTTPError) do
+ Dashing::Downloader.get_json('http://dead-host.com/')
+ end
+ end
+
+ def test_load_gist_attempts_to_get_the_gist
+ Dashing::Downloader.stubs(:get_json).once
+ Dashing::Downloader.get_gist(123)
+ end
+end
diff --git a/test/test_helper.rb b/test/test_helper.rb
index d2337c5..0b719f5 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -1,19 +1,28 @@
+require 'simplecov'
+SimpleCov.start do
+ add_filter "/vendor/"
+ add_filter "/test/"
+end
+
require 'rack/test'
require 'stringio'
-require 'test/unit'
require 'tmpdir'
+require 'fakeweb'
+require 'minitest/autorun'
+require 'minitest/pride'
+require 'mocha/setup'
+
+require_relative '../lib/dashing'
+
+FakeWeb.allow_net_connect = false
ENV['RACK_ENV'] = 'test'
WORKING_DIRECTORY = Dir.pwd.freeze
ARGV.clear
-def silent
- _stdout = $stdout
- $stdout = mock = StringIO.new
- begin
- yield
- ensure
- $stdout = _stdout
+def load_quietly(file)
+ Minitest::Test.new(nil).capture_io do
+ load file
end
end
@@ -28,7 +37,13 @@ ensure
end
module Dashing
- class Test < Test::Unit::TestCase
+ class Test < Minitest::Test
include Rack::Test::Methods
+
+ alias_method :silent, :capture_io
+
+ def teardown
+ FileUtils.rm_f('history.yml')
+ end
end
-end \ No newline at end of file
+end