From 7ded46a7010f50f00a4732965ea61c6645194908 Mon Sep 17 00:00:00 2001 From: Sam Phillips Date: Mon, 1 Feb 2016 15:53:40 -0500 Subject: [PATCH] Add specs to the Screengrab runner --- lib/screengrab/runner.rb | 11 +++-- screengrab.gemspec | 7 +-- spec/runner_spec.rb | 100 +++++++++++++++++++++++++++++++++++++++ spec/spec_helper.rb | 8 +++- 4 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 spec/runner_spec.rb diff --git a/lib/screengrab/runner.rb b/lib/screengrab/runner.rb index 3366478259b..4a726b737c8 100644 --- a/lib/screengrab/runner.rb +++ b/lib/screengrab/runner.rb @@ -9,10 +9,13 @@ class Runner attr_accessor :number_of_retries - def initialize - @executor = FastlaneCore::CommandExecutor - @config = Screengrab.config - @android_env = Screengrab.android_environment + def initialize(executor = FastlaneCore::CommandExecutor, + config = Screengrab.config, + android_env = Screengrab.android_environment) + + @executor = executor + @config = config + @android_env = android_env end def run diff --git a/screengrab.gemspec b/screengrab.gemspec index 1a4d14ca48d..6010c732dd8 100644 --- a/screengrab.gemspec +++ b/screengrab.gemspec @@ -25,12 +25,13 @@ Gem::Specification.new do |spec| # Development only spec.add_development_dependency 'bundler' + spec.add_development_dependency 'coveralls' + spec.add_development_dependency 'fastlane' + spec.add_development_dependency 'activesupport' + spec.add_development_dependency 'pry' spec.add_development_dependency 'rake' spec.add_development_dependency 'rspec', '~> 3.1.0' - spec.add_development_dependency 'pry' spec.add_development_dependency 'yard', '~> 0.8.7.4' - spec.add_development_dependency 'coveralls' - spec.add_development_dependency 'fastlane' spec.add_development_dependency 'rubocop', '~> 0.35.1' spec.add_development_dependency 'webmock', '~> 1.19.0' end diff --git a/spec/runner_spec.rb b/spec/runner_spec.rb new file mode 100644 index 00000000000..3a290f44ec7 --- /dev/null +++ b/spec/runner_spec.rb @@ -0,0 +1,100 @@ +describe Screengrab::Runner do + let(:config) { {} } + let(:ui) { Screengrab::UI } + let(:mock_android_environment) { double(Screengrab.android_environment) } + let(:mock_executor) { class_double('FastlaneCore::CommandExecutor') } + + before do + @runner = Screengrab::Runner.new(mock_executor, config, mock_android_environment) + end + + def set_mock_adb_response(command, mock_response) + expect(mock_executor).to receive(:execute) + .with(hash_including(command: command)) + .and_return(mock_response) + end + + describe :validate_apk do + context 'no aapt' do + it 'prints an error unless aapt can be found' do + expect(mock_android_environment).to receive(:aapt_path).and_return nil + expect(mock_executor).not_to receive(:execute) + expect(ui).to receive(:important).with(/.*aapt.*could not be found/) + + @runner.validate_apk('fake_apk_path') + end + end + + context 'no permissions' do + it 'prints if permissions are missing' do + allow(mock_android_environment).to receive(:aapt_path).and_return 'fake_aapt_path' + set_mock_adb_response('fake_aapt_path dump permissions fake_apk_path', '') + + expect(ui).to receive(:user_error!).with(/permission.* could not be found/).and_call_original + + expect { @runner.validate_apk('fake_apk_path') }.to raise_fastlane_error + end + end + end + + describe :select_device do + let (:adb_list_devices_command) { 'adb devices -l' } + + context 'no devices' do + it 'does not find any active devices' do + adb_response = <<-ADB_OUTPUT.strip_heredoc + List of devices attached + + ADB_OUTPUT + set_mock_adb_response(adb_list_devices_command, adb_response) + + expect(ui).to receive(:user_error!).with(/no connected.* devices/).and_call_original + + expect { @runner.select_device }.to raise_fastlane_error + end + end + + context 'one device' do + it 'finds an active device' do + adb_response = <<-ADB_OUTPUT.strip_heredoc + List of devices attached + T065002LTT device usb:437387264X product:ghost_retail model:XT1053 device:ghost + + + ADB_OUTPUT + set_mock_adb_response(adb_list_devices_command, adb_response) + + expect(@runner.select_device).to eq('T065002LTT') + end + end + + context 'multiple devices' do + it 'finds an active device' do + adb_response = <<-ADB_OUTPUT.strip_heredoc + List of devices attached + emulator-5554 device product:sdk_phone_x86_64 model:Android_SDK_built_for_x86_64 device:generic_x86_64 + T065002LTT device usb:437387264X product:ghost_retail model:XT1053 device:ghost + + ADB_OUTPUT + + set_mock_adb_response(adb_list_devices_command, adb_response) + expect(@runner.select_device).to eq('emulator-5554') + end + end + + context 'one device booting' do + it 'finds an active device' do + adb_response = <<-ADB_OUTPUT.strip_heredoc + List of devices attached + emulator-5554 offline + T065002LTT device + + ADB_OUTPUT + + set_mock_adb_response(adb_list_devices_command, adb_response) + + expect(@runner.select_device).to eq('T065002LTT') + end + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index ef91e86db76..f83705efbce 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,8 +1,10 @@ -require "coveralls" +require 'coveralls' Coveralls.wear! unless ENV["FASTLANE_SKIP_UPDATE_CHECK"] require 'screengrab' require 'webmock' +require 'pry' +require 'active_support/core_ext/string/strip' # This module is only used to check the environment is currently a testing env module SpecHelper @@ -25,3 +27,7 @@ def with_env_values(hash) ENV[k] = old_vals[k] end end + +def raise_fastlane_error + raise_error FastlaneCore::Interface::FastlaneError +end