diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/app_test.rb | 166 | ||||
| -rw-r--r-- | test/cli_test.rb | 168 | ||||
| -rw-r--r-- | test/downloader_test.rb | 26 | ||||
| -rw-r--r-- | test/test_helper.rb | 49 |
4 files changed, 409 insertions, 0 deletions
diff --git a/test/app_test.rb b/test/app_test.rb new file mode 100644 index 0000000..36cd310 --- /dev/null +++ b/test/app_test.rb @@ -0,0 +1,166 @@ +require 'test_helper' +require 'haml' + +class AppTest < Dashing::Test + def setup + @connection = [] + 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 + post '/widgets/some_widget', JSON.generate({value: 6}) + assert_equal 204, last_response.status + + assert_equal 1, @connection.length + data = parse_data @connection[0] + assert_equal 6, data['value'] + assert_equal 'some_widget', data['id'] + assert data['updatedAt'] + end + + def test_post_widgets_with_invalid_auth_token + 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 + app.settings.auth_token = 'sekrit' + post '/widgets/some_widget', JSON.generate({value: 9, auth_token: 'sekrit'}) + assert_equal 204, last_response.status + end + + def test_get_events + post '/widgets/some_widget', JSON.generate({value: 8}) + assert_equal 204, last_response.status + + get '/events' + assert_equal 200, last_response.status + assert_equal 8, parse_data(@connection[0])['value'] + end + + def test_dashboard_events + post '/dashboards/my_super_sweet_dashboard', JSON.generate({event: 'reload'}) + assert_equal 204, last_response.status + + get '/events' + assert_equal 200, last_response.status + assert_equal 'dashboards', parse_event(@connection[0]) + assert_equal 'reload', parse_data(@connection[0])['event'] + end + + def test_get_dashboard + with_generated_project do + get '/sampletv' + assert_equal 200, last_response.status + 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_includes last_response.body, '<title>1080p dashboard</title>' + end + 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_includes last_response.body, '<h1>haml</h1>' + end + end + + def test_get_nonexistent_dashboard + with_generated_project do + get '/nodashboard' + assert_equal 404, last_response.status + end + end + + def test_get_widget + with_generated_project do + get '/views/meter.html' + assert_equal 200, last_response.status + 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' } + + app.settings.public_folder = File.join(dir, 'new_project/public') + app.settings.views = File.join(dir, 'new_project/dashboards') + app.settings.root = File.join(dir, 'new_project') + yield app.settings.root + end + end + + def app + Sinatra::Application + end + + def parse_data(string) + JSON.parse string[/data: (.+)/, 1] + end + + def parse_event(string) + string[/event: (.+)/, 1] + end +end diff --git a/test/cli_test.rb b/test/cli_test.rb new file mode 100644 index 0000000..4d82296 --- /dev/null +++ b/test/cli_test.rb @@ -0,0 +1,168 @@ +require 'test_helper' + +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 + + def test_generate_task_delegates_to_type + types = %w(widget dashboard job) + + types.each do |type| + @cli.stubs(:public_send).with("generate_#{type}".to_sym, 'name').once + @cli.generate(type, 'name') + end + end + + 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', {:skip => false}).once + @cli.stubs(:create_file).with('/widgets/num/num.html', 'some html content', {:skip => false}).once + @cli.stubs(:create_file).with('/widgets/num/num.scss', 'some sass content', {:skip => false}).once + @cli.stubs(:create_file).with('/widgets/num/num.coffee', 'some coffee content', {:skip => false}).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 + + 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 new file mode 100644 index 0000000..0b719f5 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,49 @@ +require 'simplecov' +SimpleCov.start do + add_filter "/vendor/" + add_filter "/test/" +end + +require 'rack/test' +require 'stringio' +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 load_quietly(file) + Minitest::Test.new(nil).capture_io do + load file + end +end + +def temp + path = File.expand_path "#{Dir.tmpdir}/#{Time.now.to_i}#{rand(1000)}/" + FileUtils.mkdir_p path + Dir.chdir path + yield path +ensure + Dir.chdir WORKING_DIRECTORY + FileUtils.rm_rf(path) if File.exists?(path) +end + +module Dashing + class Test < Minitest::Test + include Rack::Test::Methods + + alias_method :silent, :capture_io + + def teardown + FileUtils.rm_f('history.yml') + end + end +end |
