moto 0.0.24 → 0.0.25

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ae9e65a6ed5be9e5dcab4f274fb56543e43ce7a8
4
- data.tar.gz: 5bcddba5dd2dd8b16e5108219488579eea8827df
3
+ metadata.gz: d2eb8efa5d64b6f20b2ce57c06b47105d16a8a0d
4
+ data.tar.gz: 6c0024378bf4157fcd64a7b8c256f93eb57aef6c
5
5
  SHA512:
6
- metadata.gz: 8b7a58130b054529d9de03e161077931c772beefd3e8c6ae803dab00507ffd9e2caaf6c8dc79f7f106b05fb1115e5ef8de581f8bf72452c6935b91561d76b8e2
7
- data.tar.gz: aebd387ed9021158a73b7daa28badaeaea4416a246e0c68b77cf5b5d9032f1e49583cb824b39604d254d83698f5feee584bd642fe48c9defe395276551a37e5b
6
+ metadata.gz: 9ae78b549ab8f886092296e5556b041888c6ea60bbf5516e9666dd3f3eaab4f2fda5fd5a4a0f1e096edd1a73f9e8baef7f5eb2b96b3cacb856355f0064833492
7
+ data.tar.gz: 5b1d85e5737de49867d88f4ae5f7b1c45bb8d469558a6cef965a5b949ebfce65771633fea20913915cb6f02033d5392abb0227fa4d9f919790ab8fcc5ca92d89
data/bin/moto CHANGED
@@ -1,5 +1,5 @@
1
- #!/usr/bin/env ruby
2
-
3
- require_relative '../lib/parser'
4
-
5
- Moto::Parser.run ARGV
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/parser'
4
+
5
+ Moto::Parser.run ARGV
@@ -1,9 +1,80 @@
1
+ require 'fileutils'
2
+
1
3
  module Moto
2
4
  class AppGenerator
3
-
4
- def self.run(argv)
5
-
5
+
6
+ # Creates directories and file with class template for a test.
7
+ # @param options [Hash] Informations required perfrom the task.
8
+ # options[:app_name] Name of the application that uses Moto Framework.
9
+ # options[:dir] Subdirectories of MotoApp/tests/ where test should be placed.
10
+ # options[:base_class] Path and filename of class from which the test will derive.
11
+ # options[:force] Whether generator should forcibly overwrite previously existing file.
12
+ def self.run(options)
13
+
14
+ # Build list of modules basing on the name of the application and subdirectory provided by the user.
15
+ # Second module is always 'tests' since it's where they should be kept.
16
+ modules = [options[:app_name], 'tests'] + options[:dir].split('/')
17
+ modules.map!(&:camelize)
18
+
19
+ # Name of the class in the template
20
+ class_name = modules.last
21
+
22
+ # Evaluate fully qulified name of the class to derive from or, if not specified
23
+ # use Moto's default one
24
+ if options[:base_class].nil?
25
+ base_class_qualified_name = 'Moto::Test'
26
+ else
27
+ base_class_qualified_name = "#{options[:app_name]}::Lib::Test::#{options[:base_class].split('/').join('::').camelize}"
28
+ end
29
+
30
+ # Where to put finished template
31
+ test_file = File.basename(options[:dir]) + '.rb'
32
+ test_dir = MotoApp::DIR + '/tests/' + options[:dir]
33
+ test_path = "#{test_dir}/#{test_file}"
34
+
35
+ # Create directory
36
+ FileUtils.mkdir_p(test_dir)
37
+
38
+ if !File.exist?(test_path) || options[:force]
39
+ # Create new file in specified location and add class' template to it
40
+ File.open(test_path, 'w+') do |file|
41
+
42
+ indent = 0
43
+
44
+ file << "# FULL_CODE\n"
45
+
46
+ if options[:base_class].nil?
47
+ file << "\n"
48
+ else
49
+ file << "require './lib/test/#{options[:base_class]}.rb'\n\n"
50
+ end
51
+
52
+ modules.each do |m|
53
+ file << (' ' * indent) + "module #{m}\n"
54
+ indent += 2
55
+ end
56
+
57
+ file << (' ' * indent) + "# Class template genereated by 'moto generate'\n"
58
+ file << (' ' * indent) + "class #{class_name} < #{base_class_qualified_name}\n\n"
59
+ indent += 2
60
+ file << (' ' * indent) + "def run\n"
61
+ file << (' ' * indent) + "end\n\n"
62
+ indent -= 2
63
+ file << (' ' * indent) + "end\n"
64
+
65
+ modules.each do
66
+ indent -= 2
67
+ file << (' ' * indent) + "end\n"
68
+ end
69
+
70
+ end
71
+
72
+ puts 'Result:'
73
+ puts " File: #{test_path}"
74
+ puts " Class: #{class_name} < #{base_class_qualified_name}"
75
+ else
76
+ raise 'File already exists. Use -f or --force to overwrite existing contents.'
77
+ end
6
78
  end
7
-
8
79
  end
9
- end
80
+ end
@@ -1,17 +1,17 @@
1
- module Moto
2
- module EmptyListener
3
-
4
- def start_run
5
- end
6
-
7
- def end_run
8
- end
9
-
10
- def start_test(test)
11
- end
12
-
13
- def end_test(test)
14
- end
15
-
16
- end
1
+ module Moto
2
+ module EmptyListener
3
+
4
+ def start_run
5
+ end
6
+
7
+ def end_run
8
+ end
9
+
10
+ def start_test(test)
11
+ end
12
+
13
+ def end_test(test)
14
+ end
15
+
16
+ end
17
17
  end
@@ -1,7 +1,7 @@
1
- module Moto
2
- module Exceptions
3
- class MotoException < RuntimeError
4
-
5
- end
6
- end
1
+ module Moto
2
+ module Exceptions
3
+ class MotoException < RuntimeError
4
+
5
+ end
6
+ end
7
7
  end
@@ -1,7 +1,7 @@
1
- module Moto
2
- module Exceptions
3
- class TestForcedFailure < MotoException
4
-
5
- end
6
- end
1
+ module Moto
2
+ module Exceptions
3
+ class TestForcedFailure < MotoException
4
+
5
+ end
6
+ end
7
7
  end
@@ -1,7 +1,7 @@
1
- module Moto
2
- module Exceptions
3
- class TestForcedPassed < MotoException
4
-
5
- end
6
- end
1
+ module Moto
2
+ module Exceptions
3
+ class TestForcedPassed < MotoException
4
+
5
+ end
6
+ end
7
7
  end
@@ -1,7 +1,7 @@
1
- module Moto
2
- module Exceptions
3
- class TestSkipped < MotoException
4
-
5
- end
6
- end
1
+ module Moto
2
+ module Exceptions
3
+ class TestSkipped < MotoException
4
+
5
+ end
6
+ end
7
7
  end
@@ -1,21 +1,21 @@
1
- module Moto
2
- module ForwardContextMethods
3
-
4
- def client(name)
5
- @context.client(name)
6
- end
7
-
8
- def logger
9
- @context.logger
10
- end
11
-
12
- def const(key)
13
- @context.const(key)
14
- end
15
-
16
- def current_test
17
- @context.current_test
18
- end
19
-
20
- end
1
+ module Moto
2
+ module ForwardContextMethods
3
+
4
+ def client(name)
5
+ @context.client(name)
6
+ end
7
+
8
+ def logger
9
+ @context.logger
10
+ end
11
+
12
+ def const(key)
13
+ @context.const(key)
14
+ end
15
+
16
+ def current_test
17
+ @context.current_test
18
+ end
19
+
20
+ end
21
21
  end
@@ -1,7 +1,7 @@
1
- module Moto
2
- class Initializer
3
- def initialize(runner)
4
- @runner = runner
5
- end
6
- end
1
+ module Moto
2
+ class Initializer
3
+ def initialize(runner)
4
+ @runner = runner
5
+ end
6
+ end
7
7
  end
@@ -1,26 +1,26 @@
1
- module Moto
2
- module Listeners
3
- class Base
4
-
5
- def initialize(runner)
6
- @runner=runner
7
- end
8
-
9
- def start_run
10
- # abstract
11
- end
12
-
13
- def end_run
14
- # abstract
15
- end
16
-
17
- def start_test(test)
18
- # abstract
19
- end
20
-
21
- def end_test(test)
22
- # abstract
23
- end
24
- end
25
- end
1
+ module Moto
2
+ module Listeners
3
+ class Base
4
+
5
+ def initialize(runner)
6
+ @runner=runner
7
+ end
8
+
9
+ def start_run
10
+ # abstract
11
+ end
12
+
13
+ def end_run
14
+ # abstract
15
+ end
16
+
17
+ def start_test(test)
18
+ # abstract
19
+ end
20
+
21
+ def end_test(test)
22
+ # abstract
23
+ end
24
+ end
25
+ end
26
26
  end
@@ -1,29 +1,29 @@
1
- module Moto
2
- module Listeners
3
- class Console < Base
4
-
5
- def start_run
6
- puts "START"
7
- end
8
-
9
- def end_run
10
- puts ""
11
- puts "FINISHED: #{@runner.result.summary[:result]}, duration: #{Time.at(@runner.result.summary[:duration]).utc.strftime("%H:%M:%S")}"
12
- puts "Tests executed: #{@runner.result.summary[:cnt_all]}"
13
- puts " Passed: #{@runner.result.summary[:cnt_passed]}"
14
- puts " Failure: #{@runner.result.summary[:cnt_failure]}"
15
- puts " Error: #{@runner.result.summary[:cnt_error]}"
16
- puts " Skipped: #{@runner.result.summary[:cnt_skipped]}"
17
- end
18
-
19
- def start_test(test)
20
- print test.name
21
- end
22
-
23
- def end_test(test)
24
- puts "\t#{@runner.result[test.name][:result]}"
25
- end
26
-
27
- end
28
- end
1
+ module Moto
2
+ module Listeners
3
+ class Console < Base
4
+
5
+ def start_run
6
+ puts "START"
7
+ end
8
+
9
+ def end_run
10
+ puts ""
11
+ puts "FINISHED: #{@runner.result.summary[:result]}, duration: #{Time.at(@runner.result.summary[:duration]).utc.strftime("%H:%M:%S")}"
12
+ puts "Tests executed: #{@runner.result.summary[:cnt_all]}"
13
+ puts " Passed: #{@runner.result.summary[:cnt_passed]}"
14
+ puts " Failure: #{@runner.result.summary[:cnt_failure]}"
15
+ puts " Error: #{@runner.result.summary[:cnt_error]}"
16
+ puts " Skipped: #{@runner.result.summary[:cnt_skipped]}"
17
+ end
18
+
19
+ def start_test(test)
20
+ print test.name
21
+ end
22
+
23
+ def end_test(test)
24
+ puts "\t#{@runner.result[test.name][:result]}"
25
+ end
26
+
27
+ end
28
+ end
29
29
  end
@@ -1,63 +1,63 @@
1
- module Moto
2
- module Listeners
3
- class ConsoleDots < Base
4
-
5
- def start_run
6
- end
7
-
8
- def end_run
9
- puts ""
10
- puts ""
11
- puts "FINISHED: #{@runner.result.summary[:result]}, duration: #{Time.at(@runner.result.summary[:duration]).utc.strftime("%H:%M:%S")}"
12
- puts "Tests executed: #{@runner.result.summary[:cnt_all]}"
13
- puts " Passed: #{@runner.result.summary[:cnt_passed]}"
14
- puts " Failure: #{@runner.result.summary[:cnt_failure]}"
15
- puts " Error: #{@runner.result.summary[:cnt_error]}"
16
- puts " Skipped: #{@runner.result.summary[:cnt_skipped]}"
17
-
18
- if @runner.result.summary[:cnt_failure] > 0
19
- puts ""
20
- puts "FAILURES: "
21
- @runner.result.summary[:tests_failure].each do |test_name, data|
22
- puts test_name
23
- puts "\t#{data[:failures].join("\n\t")}"
24
- puts ""
25
- end
26
- end
27
-
28
- if @runner.result.summary[:cnt_error] > 0
29
- puts ""
30
- puts "ERRORS: "
31
- @runner.result.summary[:tests_error].each do |test_name, data|
32
- puts test_name
33
- puts "\t#{data[:error]}"
34
- puts ""
35
- end
36
- end
37
-
38
- if @runner.result.summary[:cnt_skipped] > 0
39
- puts ""
40
- puts "SKIPPED: "
41
- @runner.result.summary[:tests_skipped].each do |test_name, data|
42
- puts test_name
43
- puts "\t#{data[:error]}"
44
- puts ""
45
- end
46
- end
47
- end
48
-
49
- def start_test(test)
50
- end
51
-
52
- def end_test(test)
53
- print case @runner.result[test.name][:result]
54
- when :passed then "."
55
- when :failure then "F"
56
- when :error then "E"
57
- when :skipped then "S"
58
- end
59
- end
60
-
61
- end
62
- end
1
+ module Moto
2
+ module Listeners
3
+ class ConsoleDots < Base
4
+
5
+ def start_run
6
+ end
7
+
8
+ def end_run
9
+ puts ""
10
+ puts ""
11
+ puts "FINISHED: #{@runner.result.summary[:result]}, duration: #{Time.at(@runner.result.summary[:duration]).utc.strftime("%H:%M:%S")}"
12
+ puts "Tests executed: #{@runner.result.summary[:cnt_all]}"
13
+ puts " Passed: #{@runner.result.summary[:cnt_passed]}"
14
+ puts " Failure: #{@runner.result.summary[:cnt_failure]}"
15
+ puts " Error: #{@runner.result.summary[:cnt_error]}"
16
+ puts " Skipped: #{@runner.result.summary[:cnt_skipped]}"
17
+
18
+ if @runner.result.summary[:cnt_failure] > 0
19
+ puts ""
20
+ puts "FAILURES: "
21
+ @runner.result.summary[:tests_failure].each do |test_name, data|
22
+ puts test_name
23
+ puts "\t#{data[:failures].join("\n\t")}"
24
+ puts ""
25
+ end
26
+ end
27
+
28
+ if @runner.result.summary[:cnt_error] > 0
29
+ puts ""
30
+ puts "ERRORS: "
31
+ @runner.result.summary[:tests_error].each do |test_name, data|
32
+ puts test_name
33
+ puts "\t#{data[:error]}"
34
+ puts ""
35
+ end
36
+ end
37
+
38
+ if @runner.result.summary[:cnt_skipped] > 0
39
+ puts ""
40
+ puts "SKIPPED: "
41
+ @runner.result.summary[:tests_skipped].each do |test_name, data|
42
+ puts test_name
43
+ puts "\t#{data[:error]}"
44
+ puts ""
45
+ end
46
+ end
47
+ end
48
+
49
+ def start_test(test)
50
+ end
51
+
52
+ def end_test(test)
53
+ print case @runner.result[test.name][:result]
54
+ when :passed then "."
55
+ when :failure then "F"
56
+ when :error then "E"
57
+ when :skipped then "S"
58
+ end
59
+ end
60
+
61
+ end
62
+ end
63
63
  end
@@ -1,37 +1,37 @@
1
- require 'nokogiri'
2
-
3
- module Moto
4
- module Listeners
5
- class JunitXml < Base
6
-
7
- def end_run
8
- path = @runner.my_config[:output_file]
9
-
10
- builder = Nokogiri::XML::Builder.new { |xml|
11
- xml.testsuite(
12
- errors: @runner.result.summary[:cnt_error],
13
- failures: @runner.result.summary[:cnt_failure],
14
- name: "Moto run",
15
- tests: @runner.result.summary[:cnt_all],
16
- time: @runner.result.summary[:duration],
17
- timestamp: Time.at(@runner.result.summary[:started_at])) do
18
- @runner.result.all.each do |test_name, data|
19
- xml.testcase(name: test_name, time: data[:duration], classname: data[:class].name, moto_result: data[:result]) do
20
- if !data[:error].nil?
21
- xml.error(message: data[:error].message)
22
- elsif data[:failures].count > 0
23
- data[:failures].each do |f|
24
- xml.failure(message: f)
25
- end
26
- end
27
- end
28
- end
29
- end
30
- }
31
-
32
- File.open(path, 'w') {|f| f.write(builder.to_xml) }
33
- end
34
-
35
- end
36
- end
1
+ require 'nokogiri'
2
+
3
+ module Moto
4
+ module Listeners
5
+ class JunitXml < Base
6
+
7
+ def end_run
8
+ path = @runner.my_config[:output_file]
9
+
10
+ builder = Nokogiri::XML::Builder.new { |xml|
11
+ xml.testsuite(
12
+ errors: @runner.result.summary[:cnt_error],
13
+ failures: @runner.result.summary[:cnt_failure],
14
+ name: "Moto run",
15
+ tests: @runner.result.summary[:cnt_all],
16
+ time: @runner.result.summary[:duration],
17
+ timestamp: Time.at(@runner.result.summary[:started_at])) do
18
+ @runner.result.all.each do |test_name, data|
19
+ xml.testcase(name: test_name, time: data[:duration], classname: data[:class].name, moto_result: data[:result]) do
20
+ if !data[:error].nil?
21
+ xml.error(message: data[:error].message)
22
+ elsif data[:failures].count > 0
23
+ data[:failures].each do |f|
24
+ xml.failure(message: f)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ }
31
+
32
+ File.open(path, 'w') {|f| f.write(builder.to_xml) }
33
+ end
34
+
35
+ end
36
+ end
37
37
  end
@@ -13,9 +13,9 @@ module Moto
13
13
  # TODO Generate app / Change the way parsing options goes so it doesnt generate them if they`re not needed
14
14
  case argv[0]
15
15
  when '--version' then puts Moto::VERSION
16
- when 'run' then Moto::Cli.run run_parse(argv)
16
+ when 'run' then Moto::Cli.run(run_parse(argv))
17
17
  when 'help' then show_help
18
- when 'generate' then Moto::AppGenerator.run generate_parse(argv)
18
+ when 'generate' then Moto::AppGenerator.run(generate_parse(argv))
19
19
  else puts "Command '#{argv[0]}' not recognized. Type help for list of supported commands."
20
20
  end
21
21
  rescue Exception => e
@@ -26,7 +26,7 @@ module Moto
26
26
  def self.run_parse(argv)
27
27
 
28
28
  # TODO: fix this dumb verification of current working directory.
29
- unless File.exists? "#{MotoApp::DIR}/config/moto.rb"
29
+ if !File.exists? "#{MotoApp::DIR}/config/moto.rb"
30
30
  msg = "Config file (config/moto.rb) not present.\n"
31
31
  msg << 'Does current working directory contain Moto application?'
32
32
  raise msg
@@ -41,13 +41,13 @@ module Moto
41
41
  # TODO Mandatory env var in app config
42
42
  options[:config] = eval(File.read("#{MotoApp::DIR}/config/moto.rb"))
43
43
  options[:environments] = []
44
- options[:name] = ""
44
+ options[:name] = ''
45
45
 
46
46
  # Parse arguments
47
47
  # TODO eval ?
48
48
  # TODO const
49
49
  # TODO reporters should be consts - not strings
50
- OptionParser.new do |opts|
50
+ OptionParser.new do |opts|
51
51
  opts.on('-t', '--tests Tests', Array) { |v| options[:tests ] = v }
52
52
  opts.on('-g', '--tags Tags', Array) { |v| options[:tags ] = v }
53
53
  opts.on('-r', '--reporters Reporters', Array) { |v| options[:reporters] = v }
@@ -70,8 +70,8 @@ module Moto
70
70
  end
71
71
 
72
72
  def self.evaluate_name(tags, tests)
73
- tags ||= ""
74
- tests ||= ""
73
+ tags ||= ''
74
+ tests ||= ''
75
75
  if !tags.empty? && !tests.empty?
76
76
  return "#{tags.count} tags + #{tests.count} tests"
77
77
  elsif tags.empty?
@@ -80,22 +80,53 @@ module Moto
80
80
  return tags.count == 1 ? "Tag: #{tags.first}" : "#{tags.count} tags"
81
81
  end
82
82
  end
83
-
83
+
84
+ # Parses attributes passed to the application when run by 'moto generate'
84
85
  def self.generate_parse(argv)
85
86
  options = {}
86
- options[:dir]
87
+
88
+ OptionParser.new do |opts|
89
+ opts.on('-t', '--test Test') { |v| options[:dir ] = v }
90
+ opts.on('-a', '--appname AppName') { |v| options[:app_name ] = v }
91
+ opts.on('-b', '--baseclass BaseClass') { |v| options[:base_class] = v }
92
+ opts.on('-f', '--force') { options[:force ] = true }
93
+ end.parse!
94
+
95
+ options[:dir] = options[:dir].underscore
96
+
97
+ if options[:app_name].nil?
98
+ options[:app_name] = 'MotoApp'
99
+ end
100
+
101
+ return options
87
102
  end
88
103
 
89
104
  def self.show_help
90
105
  puts """
91
106
  Moto (#{Moto::VERSION}) CLI Help:
92
107
  moto --version Display current version
108
+
93
109
  moto run:
94
- -t, --tests = Tests to be executed. For e.x Tests\Failure\Failure.rb should be passed as Tests::Failure
95
- -r, --reporter = Reporters to be used. Defaults are Moto::Listeners::ConsoleDots, Moto::Listeners::JunitXml
110
+ -t, --tests = Tests to be executed.
111
+ For eg. Tests\Failure\Failure.rb should be passed as Tests::Failure
112
+ -r, --reporter = Reporters to be used.
113
+ Defaults are Moto::Listeners::ConsoleDots, Moto::Listeners::JunitXml
96
114
  -e, --environment etc etc
115
+
97
116
  moto generate:
98
- moto generate app_name -d, --dir = directory. Default is current dir.
117
+ -t, --test = Path and name of the test to be created.
118
+ Examples:
119
+ -ttest_name will create MotoApp/tests/test_name/test_name.rb
120
+ -tdir/test_name will create MotoApp/tests/dir/test_name/test_name.rb
121
+ -a, --appname = Name of the application. Will be also used as topmost module in test file.
122
+ Default: MotoApp
123
+ -b, --baseclass = File (WITHOUT EXTENSION) with base class from which test will derive. Assumes one class per file.
124
+ Examples:
125
+ -btest_base will use the file in MotoApp/lib/test/test_base.rb
126
+ -bsubdir/test_base will use the file in MotoApp/lib/test/subdir/test_base.rb
127
+ By default class will derive from Moto::Test
128
+ -f, --force = Forces generator to overwrite previously existing class file in specified location.
129
+ You have been warned.
99
130
  """
100
131
  end
101
132
 
@@ -1,84 +1,84 @@
1
- module Moto
2
- class Result
3
-
4
- PENDING = :pending # -2
5
- RUNNING = :running # -1
6
- PASSED = :passed # 0
7
- FAILURE = :failure # 1
8
- ERROR = :error # 2
9
- SKIPPED = :skipped # 3
10
-
11
- attr_reader :summary
12
-
13
- def [](key)
14
- @results[key]
15
- end
16
-
17
- def all
18
- @results
19
- end
20
-
21
- def initialize(runner)
22
- @runner = runner
23
- @results = {}
24
- @summary = {}
25
- end
26
-
27
- def start_run
28
- # start timer
29
- @summary[:started_at] = Time.now.to_f
30
- end
31
-
32
- def end_run
33
- # info about duration and overall execution result
34
- @summary[:finished_at] = Time.now.to_f
35
- @summary[:duration] = @summary[:finished_at] - @summary[:started_at]
36
- @summary[:result] = PASSED
37
- @summary[:result] = FAILURE unless @results.values.select{ |v| v[:failures].count > 0 }.empty?
38
- @summary[:result] = ERROR unless @results.values.select{ |v| v[:result] == ERROR }.empty?
39
- @summary[:cnt_all] = @results.count
40
- @summary[:tests_passed] = @results.select{ |k,v| v[:result] == PASSED }
41
- @summary[:tests_failure] = @results.select{ |k,v| v[:result] == FAILURE }
42
- @summary[:tests_error] = @results.select{ |k,v| v[:result] == ERROR }
43
- @summary[:tests_skipped] = @results.select{ |k,v| v[:result] == SKIPPED }
44
- @summary[:cnt_passed] = @summary[:tests_passed].count
45
- @summary[:cnt_failure] = @summary[:tests_failure].count
46
- @summary[:cnt_error] = @summary[:tests_error].count
47
- @summary[:cnt_skipped] = @summary[:tests_skipped].count
48
- end
49
-
50
- def start_test(test)
51
- @results[test.name] = { class: test.class, result: RUNNING, env: test.env, params: test.params, name: test.name, error: nil, failures: [], started_at: Time.now.to_f }
52
- end
53
-
54
- def end_test(test)
55
- # calculate result basing on errors/failures
56
- @results[test.name][:finished_at] = Time.now.to_f
57
- test.result = PASSED
58
- test.result = FAILURE unless @results[test.name][:failures].empty?
59
- unless @results[test.name][:error].nil?
60
- if @results[test.name][:error].is_a? Moto::Exceptions::TestSkipped
61
- test.result = SKIPPED
62
- elsif @results[test.name][:error].is_a? Moto::Exceptions::TestForcedPassed
63
- test.result = PASSED
64
- elsif @results[test.name][:error].is_a? Moto::Exceptions::TestForcedFailure
65
- add_failure(test, @results[test.name][:error].message)
66
- test.result = FAILURE
67
- else
68
- test.result = ERROR
69
- end
70
- end
71
- @results[test.name][:duration] = @results[test.name][:finished_at] - @results[test.name][:started_at]
72
- @results[test.name][:result] = test.result
73
- end
74
-
75
- def add_failure(test, msg)
76
- @results[test.name][:failures] << msg
77
- end
78
-
79
- def add_error(test, e)
80
- @results[test.name][:error] = e
81
- end
82
-
83
- end
1
+ module Moto
2
+ class Result
3
+
4
+ PENDING = :pending # -2
5
+ RUNNING = :running # -1
6
+ PASSED = :passed # 0
7
+ FAILURE = :failure # 1
8
+ ERROR = :error # 2
9
+ SKIPPED = :skipped # 3
10
+
11
+ attr_reader :summary
12
+
13
+ def [](key)
14
+ @results[key]
15
+ end
16
+
17
+ def all
18
+ @results
19
+ end
20
+
21
+ def initialize(runner)
22
+ @runner = runner
23
+ @results = {}
24
+ @summary = {}
25
+ end
26
+
27
+ def start_run
28
+ # start timer
29
+ @summary[:started_at] = Time.now.to_f
30
+ end
31
+
32
+ def end_run
33
+ # info about duration and overall execution result
34
+ @summary[:finished_at] = Time.now.to_f
35
+ @summary[:duration] = @summary[:finished_at] - @summary[:started_at]
36
+ @summary[:result] = PASSED
37
+ @summary[:result] = FAILURE unless @results.values.select{ |v| v[:failures].count > 0 }.empty?
38
+ @summary[:result] = ERROR unless @results.values.select{ |v| v[:result] == ERROR }.empty?
39
+ @summary[:cnt_all] = @results.count
40
+ @summary[:tests_passed] = @results.select{ |k,v| v[:result] == PASSED }
41
+ @summary[:tests_failure] = @results.select{ |k,v| v[:result] == FAILURE }
42
+ @summary[:tests_error] = @results.select{ |k,v| v[:result] == ERROR }
43
+ @summary[:tests_skipped] = @results.select{ |k,v| v[:result] == SKIPPED }
44
+ @summary[:cnt_passed] = @summary[:tests_passed].count
45
+ @summary[:cnt_failure] = @summary[:tests_failure].count
46
+ @summary[:cnt_error] = @summary[:tests_error].count
47
+ @summary[:cnt_skipped] = @summary[:tests_skipped].count
48
+ end
49
+
50
+ def start_test(test)
51
+ @results[test.name] = { class: test.class, result: RUNNING, env: test.env, params: test.params, name: test.name, error: nil, failures: [], started_at: Time.now.to_f }
52
+ end
53
+
54
+ def end_test(test)
55
+ # calculate result basing on errors/failures
56
+ @results[test.name][:finished_at] = Time.now.to_f
57
+ test.result = PASSED
58
+ test.result = FAILURE unless @results[test.name][:failures].empty?
59
+ unless @results[test.name][:error].nil?
60
+ if @results[test.name][:error].is_a? Moto::Exceptions::TestSkipped
61
+ test.result = SKIPPED
62
+ elsif @results[test.name][:error].is_a? Moto::Exceptions::TestForcedPassed
63
+ test.result = PASSED
64
+ elsif @results[test.name][:error].is_a? Moto::Exceptions::TestForcedFailure
65
+ add_failure(test, @results[test.name][:error].message)
66
+ test.result = FAILURE
67
+ else
68
+ test.result = ERROR
69
+ end
70
+ end
71
+ @results[test.name][:duration] = @results[test.name][:finished_at] - @results[test.name][:started_at]
72
+ @results[test.name][:result] = test.result
73
+ end
74
+
75
+ def add_failure(test, msg)
76
+ @results[test.name][:failures] << msg
77
+ end
78
+
79
+ def add_error(test, e)
80
+ @results[test.name][:error] = e
81
+ end
82
+
83
+ end
84
84
  end
@@ -1,27 +1,27 @@
1
- module Moto
2
- module RunnerLogging
3
-
4
-
5
- # TODO: merge it somehow with TestLogging. Parametrize logger object?
6
- def self.included(cls)
7
- def cls.method_added(name)
8
- excluded_methods = Moto::EmptyListener.instance_methods(false)
9
- excluded_methods << :new
10
- excluded_methods << :initialize
11
- # TODO: configure more excluded classes/methods
12
- return if @added
13
- @added = true # protect from recursion
14
- original_method = "original_#{name}"
15
- alias_method original_method, name
16
- define_method(name) do |*args|
17
- @context.runner.logger.debug("#{self.class.name}::#{__callee__} ENTER >>> #{args}") unless excluded_methods.include? name
18
- result = send original_method, *args
19
- @context.runner.logger.debug("#{self.class.name}::#{__callee__} LEAVE <<< #{result} ") unless excluded_methods.include? name
20
- result
21
- end
22
- @added = false
23
- end
24
-
25
- end
26
- end
1
+ module Moto
2
+ module RunnerLogging
3
+
4
+
5
+ # TODO: merge it somehow with TestLogging. Parametrize logger object?
6
+ def self.included(cls)
7
+ def cls.method_added(name)
8
+ excluded_methods = Moto::EmptyListener.instance_methods(false)
9
+ excluded_methods << :new
10
+ excluded_methods << :initialize
11
+ # TODO: configure more excluded classes/methods
12
+ return if @added
13
+ @added = true # protect from recursion
14
+ original_method = "original_#{name}"
15
+ alias_method original_method, name
16
+ define_method(name) do |*args|
17
+ @context.runner.logger.debug("#{self.class.name}::#{__callee__} ENTER >>> #{args}") unless excluded_methods.include? name
18
+ result = send original_method, *args
19
+ @context.runner.logger.debug("#{self.class.name}::#{__callee__} LEAVE <<< #{result} ") unless excluded_methods.include? name
20
+ result
21
+ end
22
+ @added = false
23
+ end
24
+
25
+ end
26
+ end
27
27
  end
@@ -1,49 +1,49 @@
1
- module Moto
2
- module TestLogging
3
-
4
- @@ignore_logging = []
5
-
6
- def self.included(cls)
7
-
8
- def cls.ignore_logging(method)
9
- full_name = "#{self.name}::#{method}"
10
- @@ignore_logging << full_name
11
- end
12
-
13
- def cls.method_added(name)
14
-
15
- Moto::EmptyListener.instance_methods(false).each do |m|
16
- full_name = "#{self.name}::#{m}"
17
- @@ignore_logging << full_name unless @@ignore_logging.include? full_name
18
- end
19
- @@ignore_logging << "#{self.name}::new"
20
- @@ignore_logging << "#{self.name}::initialize"
21
-
22
- return if @added
23
- @added = true # protect from recursion
24
- original_method = "original_#{name}"
25
- alias_method original_method, name
26
- define_method(name) do |*args|
27
- full_name = "#{self.class.name}::#{__callee__}"
28
- # TODO: use self.class.ancestors to figure out if ancestor::__callee__ is not in @@ignore_logging
29
- skip_logging = @@ignore_logging.include? full_name
30
- unless skip_logging
31
- self.class.ancestors.each do |a|
32
- ancestor_name = "#{a.name}::#{__callee__}"
33
- if @@ignore_logging.include? ancestor_name
34
- skip_logging = true
35
- break
36
- end
37
- end
38
- end
39
- @context.current_test.logger.debug("ENTER >>> #{self.class.name}::#{__callee__}(#{args})") unless skip_logging
40
- result = send original_method, *args
41
- @context.current_test.logger.debug("LEAVE <<< #{self.class.name}::#{__callee__} => #{result} ") unless skip_logging
42
- result
43
- end
44
- @added = false
45
- end
46
- end
47
-
48
- end
1
+ module Moto
2
+ module TestLogging
3
+
4
+ @@ignore_logging = []
5
+
6
+ def self.included(cls)
7
+
8
+ def cls.ignore_logging(method)
9
+ full_name = "#{self.name}::#{method}"
10
+ @@ignore_logging << full_name
11
+ end
12
+
13
+ def cls.method_added(name)
14
+
15
+ Moto::EmptyListener.instance_methods(false).each do |m|
16
+ full_name = "#{self.name}::#{m}"
17
+ @@ignore_logging << full_name unless @@ignore_logging.include? full_name
18
+ end
19
+ @@ignore_logging << "#{self.name}::new"
20
+ @@ignore_logging << "#{self.name}::initialize"
21
+
22
+ return if @added
23
+ @added = true # protect from recursion
24
+ original_method = "original_#{name}"
25
+ alias_method original_method, name
26
+ define_method(name) do |*args|
27
+ full_name = "#{self.class.name}::#{__callee__}"
28
+ # TODO: use self.class.ancestors to figure out if ancestor::__callee__ is not in @@ignore_logging
29
+ skip_logging = @@ignore_logging.include? full_name
30
+ unless skip_logging
31
+ self.class.ancestors.each do |a|
32
+ ancestor_name = "#{a.name}::#{__callee__}"
33
+ if @@ignore_logging.include? ancestor_name
34
+ skip_logging = true
35
+ break
36
+ end
37
+ end
38
+ end
39
+ @context.current_test.logger.debug("ENTER >>> #{self.class.name}::#{__callee__}(#{args})") unless skip_logging
40
+ result = send original_method, *args
41
+ @context.current_test.logger.debug("LEAVE <<< #{self.class.name}::#{__callee__} => #{result} ") unless skip_logging
42
+ result
43
+ end
44
+ @added = false
45
+ end
46
+ end
47
+
48
+ end
49
49
  end
@@ -1,3 +1,3 @@
1
1
  module Moto
2
- VERSION = '0.0.24'
2
+ VERSION = '0.0.25'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moto
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.24
4
+ version: 0.0.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bartek Wilczek
@@ -10,62 +10,62 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-02-10 00:00:00.000000000 Z
13
+ date: 2016-02-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - ">="
19
+ - - '>='
20
20
  - !ruby/object:Gem::Version
21
21
  version: '3.2'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - ">="
26
+ - - '>='
27
27
  - !ruby/object:Gem::Version
28
28
  version: '3.2'
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: nokogiri
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - ">="
33
+ - - '>='
34
34
  - !ruby/object:Gem::Version
35
35
  version: '0'
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - ">="
40
+ - - '>='
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0'
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: rest-client
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - ">="
47
+ - - '>='
48
48
  - !ruby/object:Gem::Version
49
49
  version: '0'
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - ">="
54
+ - - '>='
55
55
  - !ruby/object:Gem::Version
56
56
  version: '0'
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: sys-uname
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - ">="
61
+ - - '>='
62
62
  - !ruby/object:Gem::Version
63
63
  version: '0'
64
64
  type: :runtime
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
- - - ">="
68
+ - - '>='
69
69
  - !ruby/object:Gem::Version
70
70
  version: '0'
71
71
  description: This is a development version of a rails philosophy inspired framework
@@ -81,24 +81,12 @@ executables:
81
81
  extensions: []
82
82
  extra_rdoc_files: []
83
83
  files:
84
- - bin/moto
85
84
  - lib/app_generator.rb
86
85
  - lib/assert.rb
87
86
  - lib/cli.rb
88
- - lib/clients/base.rb
89
- - lib/clients/website.rb
90
87
  - lib/empty_listener.rb
91
- - lib/exceptions/moto.rb
92
- - lib/exceptions/test_forced_failure.rb
93
- - lib/exceptions/test_forced_passed.rb
94
- - lib/exceptions/test_skipped.rb
95
88
  - lib/forward_context_methods.rb
96
89
  - lib/initializer.rb
97
- - lib/listeners/base.rb
98
- - lib/listeners/console.rb
99
- - lib/listeners/console_dots.rb
100
- - lib/listeners/junit_xml.rb
101
- - lib/listeners/webui.rb
102
90
  - lib/page.rb
103
91
  - lib/parser.rb
104
92
  - lib/result.rb
@@ -110,6 +98,18 @@ files:
110
98
  - lib/thread_context.rb
111
99
  - lib/thread_pool.rb
112
100
  - lib/version.rb
101
+ - lib/clients/base.rb
102
+ - lib/clients/website.rb
103
+ - lib/exceptions/moto.rb
104
+ - lib/exceptions/test_forced_failure.rb
105
+ - lib/exceptions/test_forced_passed.rb
106
+ - lib/exceptions/test_skipped.rb
107
+ - lib/listeners/base.rb
108
+ - lib/listeners/console.rb
109
+ - lib/listeners/console_dots.rb
110
+ - lib/listeners/junit_xml.rb
111
+ - lib/listeners/webui.rb
112
+ - bin/moto
113
113
  homepage: https://github.com/bwilczek/moto
114
114
  licenses:
115
115
  - MIT
@@ -120,17 +120,17 @@ require_paths:
120
120
  - lib
121
121
  required_ruby_version: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - "~>"
123
+ - - ~>
124
124
  - !ruby/object:Gem::Version
125
125
  version: '2.0'
126
126
  required_rubygems_version: !ruby/object:Gem::Requirement
127
127
  requirements:
128
- - - ">="
128
+ - - '>='
129
129
  - !ruby/object:Gem::Version
130
130
  version: '0'
131
131
  requirements: []
132
132
  rubyforge_project:
133
- rubygems_version: 2.2.5
133
+ rubygems_version: 2.0.14.1
134
134
  signing_key:
135
135
  specification_version: 4
136
136
  summary: Moto - yet another web testing framework