summaryrefslogtreecommitdiff
path: root/test/cli_test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/cli_test.rb')
-rw-r--r--test/cli_test.rb168
1 files changed, 168 insertions, 0 deletions
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