leoniv/ass_launcher

View on GitHub
examples/arguments_builder_example.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'example_helper'

module Examples
  module ArgumentsBuilder

    # 1C:Enterprise doesn't check CLI parameters and their arguments
    # it may be cause of some problems when automation script writing
    #
    # AssLauncher provides feature for check CLI parameters.
    # Feature consists of two parts:
    # 1) CLI specifications which describe 1C:Enterprise CLI interface
    # 2) Arguments builder which uses CLI specifications for checking CLI
    #    parameters when we building command or location for running 1C clients

    describe '1C:Enterprise CLI specifications' do
      it 'AssLauncher defines specifications for 1C:Enterprise CLI interface' do
        AssLauncher::Enterprise::Cli::CliSpec.cli_def.must_equal\
          AssLauncher::Enterprise::CliDef
      end

      it 'Defined CLI specifications have CLI parameters collection' do
        AssLauncher::Enterprise::Cli::CliSpec.cli_def.parameters\
          .must_be_instance_of\
           AssLauncher::Enterprise::Cli::Parameters::AllParameters
      end

      it 'CLI parameter defined for client type, version and run mode' do
        parameter = AssLauncher::Enterprise::Cli::CliSpec.cli_def\
          .parameters.find('/F', nil)[0]

        # Parameter define for thick client in :enterprise mode
        parameter.match?(CLIENTS::THICK, :enterprise).must_equal true

        # Parameter doesn't defined for webclient
        parameter.match?(CLIENTS::WEB, :webclient).must_equal false
      end

      it "All client's wrappers know self CLI specifications" do
        CLIENTS::THICK.cli_spec.must_be_instance_of\
          AssLauncher::Enterprise::Cli::CliSpec

        CLIENTS::THIN.cli_spec.must_be_instance_of\
          AssLauncher::Enterprise::Cli::CliSpec

        CLIENTS::WEB.cli_spec.must_be_instance_of\
          AssLauncher::Enterprise::Cli::CliSpec
      end

      it 'CliSpec have collection of CLI parameters which depended of run mode' do
        CLIENTS::THICK.cli_spec.parameters(:designer).find('/CheckModules', nil)\
          .must_be_instance_of\
            AssLauncher::Enterprise::Cli::Parameters::Flag

        CLIENTS::THICK.cli_spec.parameters(:enterprise).find('/CheckModules', nil)\
          .must_be_nil
      end
    end

    describe AssLauncher::Enterprise::Cli::ArgumentsBuilder do
      # ArgumentsBuilder generate DSL for defined CLI cpecs
      it 'When we build command or location we can use ArgumentsBuilder' do

        command = CLIENTS::THICK.command(:designer) do
          connection_string TMP::EMPTY_IB_CS
          checkModules do
            _Server
            _ThinClient
          end
        end

        command.args.join(', ').must_match\
          %r{DESIGNER, /F, (.+), /CheckModules, , -Server, , -ThinClient}
      end

      # ArgumentsBuilder generates DSL which accepts case insensetive methods
      # and methods with underscore prefix for separate uppercased method
      # from the Ruby constant
      it 'ArgumentsBuilder accepts DSL methods called as parameters name' do

        proc {
          CLIENTS::THIN.command do
            DebuggerURL
          end
        }.must_raise NameError

        args_1 = CLIENTS::THIN.command do
          _DebuggerUrl 'http://example.org'
        end.args.join(', ')

        args_2 = CLIENTS::THIN.command do
          debuggerUrl 'http://example.org'
        end.args.join(', ')

        # This example with () looks ugly
        args_3 = CLIENTS::THIN.command do
          DebuggerUrl('http://example.org')
        end.args.join(', ')

        # In all three cases arguments is equal
        args_1.must_match %r{ENTERPRISE, /DebuggerURL, http://example\.org}
        args_2.must_match %r{ENTERPRISE, /DebuggerURL, http://example\.org}
        args_3.must_match %r{ENTERPRISE, /DebuggerURL, http://example\.org}
      end

      it 'ArgumentsBuilder have static DSL method #connection_string' do
        args = CLIENTS::THIN.command do
          connection_string TMP::EMPTY_IB_CS
        end.args.join(', ')

        args.must_match %r{ENTERPRISE, /F, (.+)}
      end

      it 'ArgumentsBuilder fail if parameter not defined' do
        e = proc {
          CLIENTS::WEB.location do
            _BadParameter
          end
        }.must_raise AssLauncher::Enterprise::Cli::ArgumentsBuilder::BuildError

        e.message.must_match %r{CLI parameter `/BadParameter' not definded .+}

        e = proc {
          CLIENTS::THICK.command(:designer) do
            checkModules do
              _BadSubParameter
            end
          end
        }.must_raise AssLauncher::Enterprise::Cli::ArgumentsBuilder::BuildError

        e.message.must_match %r{CLI parameter `-BadSubParameter' not definded .+}
      end

      it 'ArgumentsBuilder check CLI parameter arguments' do
        e = proc {
          CLIENTS::THIN.command do
            _O 'Bad value'
          end
        }.must_raise ArgumentError

        e.message.must_equal 'Wrong value `Bad value\' for /O parameter'

        args = CLIENTS::THIN.command do
          _O :Low
        end.args.join(', ')

        args.must_match %r{ENTERPRISE, /O, Low}
      end
    end
  end
end