From 559360977cff7eb7ab951463cc466744793b2b8c Mon Sep 17 00:00:00 2001 From: Sebastian Ludwig Date: Fri, 27 Nov 2015 19:28:59 +0100 Subject: [PATCH 1/2] Cleaned up CommandTestCase. The strings file used by Runner is now injectable which eliminates the need to mock StringsFile.new (which could lead to an infinite loop). --- lib/twine/runner.rb | 13 ++++--------- test/command_test_case.rb | 17 ++++++----------- test/test_consume_string_file.rb | 7 +++++-- test/test_generate_string_file.rb | 7 +++++-- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/lib/twine/runner.rb b/lib/twine/runner.rb index 31dc010..bdc44eb 100644 --- a/lib/twine/runner.rb +++ b/lib/twine/runner.rb @@ -7,10 +7,10 @@ module Twine VALID_COMMANDS = ['generate-string-file', 'generate-all-string-files', 'consume-string-file', 'consume-all-string-files', 'generate-loc-drop', 'consume-loc-drop', 'validate-strings-file'] class Runner - def initialize(args, options = nil) - @options = options || {} + def initialize(args, options = {}, strings = StringsFile.new) @args = args - @strings = StringsFile.new + @options = options + @strings = strings end def self.run(args) @@ -20,13 +20,8 @@ module Twine def run # Parse all CLI arguments. CLI::parse_args(@args, @options) - read_strings_data - execute_command - end - - def read_strings_data - @strings = StringsFile.new @strings.read @options[:strings_file] + execute_command end def write_strings_data(path) diff --git a/test/command_test_case.rb b/test/command_test_case.rb index fb1f5ec..acdf414 100644 --- a/test/command_test_case.rb +++ b/test/command_test_case.rb @@ -1,19 +1,14 @@ require 'twine_test_case' class CommandTestCase < TwineTestCase + KNOWN_LANGUAGES = %w(en fr de es) + def prepare_mock_formatter(formatter_class) - formatter = formatter_class.new(@mock_strings, {}) + strings = Twine::StringsFile.new + strings.language_codes.concat KNOWN_LANGUAGES + + formatter = formatter_class.new(strings, {}) formatter_class.stubs(:new).returns(formatter) formatter end - - def setup - super - - @known_languages = %w(en fr de es) - - @mock_strings = Twine::StringsFile.new - @mock_strings.language_codes.concat @known_languages - Twine::StringsFile.stubs(:new).returns(@mock_strings) - end end diff --git a/test/test_consume_string_file.rb b/test/test_consume_string_file.rb index 0c70a23..b192ff3 100644 --- a/test/test_consume_string_file.rb +++ b/test/test_consume_string_file.rb @@ -8,7 +8,10 @@ class TestConsumeStringFile < CommandTestCase FileUtils.touch options[:input_path] options[:languages] = language if language - Twine::Runner.new(nil, options) + @strings = Twine::StringsFile.new + @strings.language_codes.concat KNOWN_LANGUAGES + + Twine::Runner.new(nil, options, @strings) end def prepare_mock_read_file_formatter(formatter_class) @@ -41,7 +44,7 @@ class TestConsumeStringFile < CommandTestCase end def test_deducts_language_from_input_path - random_language = @known_languages.sample + random_language = KNOWN_LANGUAGES.sample formatter = prepare_mock_formatter Twine::Formatters::Android formatter.expects(:read_file).with(anything, random_language) diff --git a/test/test_generate_string_file.rb b/test/test_generate_string_file.rb index 466869e..7e678a6 100644 --- a/test/test_generate_string_file.rb +++ b/test/test_generate_string_file.rb @@ -6,7 +6,10 @@ class TestGenerateStringFile < CommandTestCase options[:output_path] = File.join(@output_dir, file) if file options[:languages] = language if language - Twine::Runner.new(nil, options) + @strings = Twine::StringsFile.new + @strings.language_codes.concat KNOWN_LANGUAGES + + Twine::Runner.new(nil, options, @strings) end def prepare_mock_write_file_formatter(formatter_class) @@ -39,7 +42,7 @@ class TestGenerateStringFile < CommandTestCase end def test_deducts_language_from_output_path - random_language = @known_languages.sample + random_language = KNOWN_LANGUAGES.sample formatter = prepare_mock_formatter Twine::Formatters::Android formatter.expects(:write_file).with(anything, random_language) From 17d206f7ce7beef5ad01eb520bd4e50d9e2c0ae5 Mon Sep 17 00:00:00 2001 From: Sebastian Ludwig Date: Sat, 28 Nov 2015 01:18:39 +0100 Subject: [PATCH 2/2] Changed TestCrateFolders to be a CommandTestCase and renamed it to TestGenerateAllStringFiles. --- test/fixtures/twine_key1_en_es.txt | 4 --- test/test_create_folders.rb | 26 --------------- test/test_generate_all_string_files.rb | 44 ++++++++++++++++++++++++++ test/twine_test_case.rb | 2 +- 4 files changed, 45 insertions(+), 31 deletions(-) delete mode 100644 test/fixtures/twine_key1_en_es.txt delete mode 100644 test/test_create_folders.rb create mode 100644 test/test_generate_all_string_files.rb diff --git a/test/fixtures/twine_key1_en_es.txt b/test/fixtures/twine_key1_en_es.txt deleted file mode 100644 index 5c3cbbb..0000000 --- a/test/fixtures/twine_key1_en_es.txt +++ /dev/null @@ -1,4 +0,0 @@ -[[My Strings]] - [key1] - en = key1-english - es = key1-spanish diff --git a/test/test_create_folders.rb b/test/test_create_folders.rb deleted file mode 100644 index e023801..0000000 --- a/test/test_create_folders.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'twine_test_case' - -class TestCreateFolders < TwineTestCase - def test_generate_all_fails_if_output_folder_does_not_exist - assert_raises Twine::Error do - execute "generate-all-string-files #{f 'twine_key1_en_es.txt'} #{@output_dir} -f apple" - end - end - - def test_generate_all_creates_output_folder - # implicitly assert nothing raised - execute "generate-all-string-files #{f 'twine_key1_en_es.txt'} #{@output_dir} -f apple --create-folders" - end - - def test_generate_all_does_not_create_folders - Dir.mkdir File.join @output_dir, 'en.lproj' - execute "generate-all-string-files #{f 'twine_key1_en_es.txt'} #{@output_dir} -f apple" - assert !File.exists?(File.join(@output_dir, 'es.lproj')), "language folder should not be created" - end - - def test_generate_all_creates_folders - execute "generate-all-string-files #{f 'twine_key1_en_es.txt'} #{@output_dir} -f apple --create-folders" - assert File.exists?(File.join(@output_dir, 'en.lproj')), "language folder 'en.lproj' should be created" - assert File.exists?(File.join(@output_dir, 'es.lproj')), "language folder 'es.lproj' should be created" - end -end diff --git a/test/test_generate_all_string_files.rb b/test/test_generate_all_string_files.rb new file mode 100644 index 0000000..f35fcfd --- /dev/null +++ b/test/test_generate_all_string_files.rb @@ -0,0 +1,44 @@ +require 'command_test_case' + +class TestGenerateAllStringFiles < CommandTestCase + class TestCreateFolders < CommandTestCase + def new_runner(create_folders) + options = {} + options[:output_path] = @output_dir + options[:format] = 'apple' + options[:create_folders] = create_folders + + @twine_file = build_twine_file 'en', 'es' do + add_section 'Section' do + add_row key: 'value' + end + end + + Twine::Runner.new(nil, options, @twine_file) + end + + def test_fails_if_output_folder_does_not_exist + assert_raises Twine::Error do + new_runner(false).generate_all_string_files + end + end + + def test_creates_output_folder + FileUtils.remove_entry_secure @output_dir + new_runner(true).generate_all_string_files + assert File.exists? @output_dir + end + + def test_does_not_create_language_folders_by_default + Dir.mkdir File.join @output_dir, 'en.lproj' + new_runner(false).generate_all_string_files + refute File.exists?(File.join(@output_dir, 'es.lproj')), "language folder should not be created" + end + + def test_creates_language_folders + new_runner(true).generate_all_string_files + assert File.exists?(File.join(@output_dir, 'en.lproj')), "language folder 'en.lproj' should be created" + assert File.exists?(File.join(@output_dir, 'es.lproj')), "language folder 'es.lproj' should be created" + end + end +end diff --git a/test/twine_test_case.rb b/test/twine_test_case.rb index 3bace86..4f9e977 100644 --- a/test/twine_test_case.rb +++ b/test/twine_test_case.rb @@ -15,7 +15,7 @@ class TwineTestCase < Minitest::Test end def teardown - FileUtils.remove_entry_secure @output_dir + FileUtils.remove_entry_secure @output_dir if File.exists? @output_dir super end