moto 0.0.22 → 0.0.23

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
data/lib/page.rb CHANGED
@@ -1,32 +1,28 @@
1
- module Moto
2
-
3
- class Page
4
-
5
- include Moto::TestLogging
6
- include Moto::ForwardContextMethods
7
-
8
- ignore_logging :const
9
- ignore_logging :session
10
-
11
- attr_reader :website
12
- attr_reader :context
13
-
14
- def initialize(website)
15
- @website = website
16
- @context = @website.context
17
- end
18
-
19
- def session
20
- @website.session
21
- end
22
-
23
- def page(p)
24
- @context.client(@website.class.name.split('::').pop).page(p)
25
- end
26
-
27
- def raise_unless_loaded
28
- raise "Invalid state: page #{self.class.name} is not loaded." unless loaded?
29
- end
30
-
31
- end
1
+ module Moto
2
+
3
+ class Page
4
+
5
+ include Moto::TestLogging
6
+ include Moto::ForwardContextMethods
7
+
8
+ ignore_logging :const
9
+ ignore_logging :session
10
+
11
+ attr_reader :website
12
+ attr_reader :context
13
+
14
+ def initialize(website)
15
+ @website = website
16
+ @context = @website.context
17
+ end
18
+
19
+ def page(p)
20
+ @context.client(@website.class.name.split('::').pop).page(p)
21
+ end
22
+
23
+ def raise_unless_loaded
24
+ raise "Invalid state: page #{self.class.name} is not loaded." unless loaded?
25
+ end
26
+
27
+ end
32
28
  end
data/lib/parser.rb CHANGED
@@ -1,103 +1,103 @@
1
- require 'optparse'
2
- require 'yaml'
3
-
4
- require_relative '../lib/cli'
5
- require_relative '../lib/app_generator'
6
-
7
- module Moto
8
-
9
- class Parser
10
-
11
- def self.run(argv)
12
- begin
13
- # TODO Generate app / Change the way parsing options goes so it doesnt generate them if they`re not needed
14
- case argv[0]
15
- when '--version' then puts Moto::VERSION
16
- when 'run' then Moto::Cli.run run_parse(argv)
17
- when 'help' then show_help
18
- when 'generate' then Moto::AppGenerator.run generate_parse(argv)
19
- else puts "Command '#{argv[0]}' not recognized. Type help for list of supported commands."
20
- end
21
- rescue Exception => e
22
- puts e.message
23
- end
24
- end
25
-
26
- def self.run_parse(argv)
27
-
28
- # TODO: fix this dumb verification of current working directory.
29
- unless File.exists? "#{MotoApp::DIR}/config/moto.rb"
30
- msg = "Config file (config/moto.rb) not present.\n"
31
- msg << 'Does current working directory contain Moto application?'
32
- raise msg
33
- end
34
-
35
- require 'bundler/setup'
36
- Bundler.require
37
-
38
- # Default options
39
- options = {}
40
- options[:reporters] = []
41
- # TODO Mandatory env var in app config
42
- options[:config] = eval(File.read("#{MotoApp::DIR}/config/moto.rb"))
43
- options[:environments] = []
44
- options[:name] = ""
45
-
46
- # Parse arguments
47
- # TODO eval ?
48
- # TODO const
49
- # TODO reporters should be consts - not strings
50
- OptionParser.new do |opts|
51
- opts.on('-t', '--tests Tests', Array) { |v| options[:tests ] = v }
52
- opts.on('-g', '--tags Tags', Array) { |v| options[:tags ] = v }
53
- opts.on('-r', '--reporters Reporters', Array) { |v| options[:reporters] = v }
54
- opts.on('-e', '--environments Environment', Array) { |v| options[:environments] = v }
55
- opts.on('-c', '--const Const') { |v| options[:const] = v }
56
- opts.on('-n', '--name Name') { |v| options[:name] = v }
57
- opts.on('-f', '--config Config') { |v| options[:config] = options[:config].merge( eval( v ) ) }
58
- end.parse!
59
-
60
- if options[:name].empty?
61
- options[:name] = evaluate_name(options[:tags], options[:tests])
62
- end
63
-
64
- if options[ :config ][ :moto ][ :runner ][ :mandatory_environment ] && options[ :environments ].empty?
65
- puts 'Environment is mandatory for this project.'
66
- exit 1
67
- end
68
-
69
- return options
70
- end
71
-
72
- def self.evaluate_name(tags, tests)
73
- tags ||= ""
74
- tests ||= ""
75
- if !tags.empty? && !tests.empty?
76
- return "#{tags.count} tags + #{tests.count} tests"
77
- elsif tags.empty?
78
- return tests.count == 1 ? "Test: #{tests.first}" : "#{tests.count} tests"
79
- elsif tests.empty?
80
- return tags.count == 1 ? "Tag: #{tags.first}" : "#{tags.count} tags"
81
- end
82
- end
83
-
84
- def self.generate_parse(argv)
85
- options = {}
86
- options[:dir]
87
- end
88
-
89
- def self.show_help
90
- puts """
91
- Moto (#{Moto::VERSION}) CLI Help:
92
- moto --version Display current version
93
- 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
96
- -e, --environment etc etc
97
- moto generate:
98
- moto generate app_name -d, --dir = directory. Default is current dir.
99
- """
100
- end
101
-
102
- end
103
- end
1
+ require 'optparse'
2
+ require 'yaml'
3
+
4
+ require_relative '../lib/cli'
5
+ require_relative '../lib/app_generator'
6
+
7
+ module Moto
8
+
9
+ class Parser
10
+
11
+ def self.run(argv)
12
+ begin
13
+ # TODO Generate app / Change the way parsing options goes so it doesnt generate them if they`re not needed
14
+ case argv[0]
15
+ when '--version' then puts Moto::VERSION
16
+ when 'run' then Moto::Cli.run run_parse(argv)
17
+ when 'help' then show_help
18
+ when 'generate' then Moto::AppGenerator.run generate_parse(argv)
19
+ else puts "Command '#{argv[0]}' not recognized. Type help for list of supported commands."
20
+ end
21
+ rescue Exception => e
22
+ puts e.message
23
+ end
24
+ end
25
+
26
+ def self.run_parse(argv)
27
+
28
+ # TODO: fix this dumb verification of current working directory.
29
+ unless File.exists? "#{MotoApp::DIR}/config/moto.rb"
30
+ msg = "Config file (config/moto.rb) not present.\n"
31
+ msg << 'Does current working directory contain Moto application?'
32
+ raise msg
33
+ end
34
+
35
+ require 'bundler/setup'
36
+ Bundler.require
37
+
38
+ # Default options
39
+ options = {}
40
+ options[:reporters] = []
41
+ # TODO Mandatory env var in app config
42
+ options[:config] = eval(File.read("#{MotoApp::DIR}/config/moto.rb"))
43
+ options[:environments] = []
44
+ options[:name] = ""
45
+
46
+ # Parse arguments
47
+ # TODO eval ?
48
+ # TODO const
49
+ # TODO reporters should be consts - not strings
50
+ OptionParser.new do |opts|
51
+ opts.on('-t', '--tests Tests', Array) { |v| options[:tests ] = v }
52
+ opts.on('-g', '--tags Tags', Array) { |v| options[:tags ] = v }
53
+ opts.on('-r', '--reporters Reporters', Array) { |v| options[:reporters] = v }
54
+ opts.on('-e', '--environments Environment', Array) { |v| options[:environments] = v }
55
+ opts.on('-c', '--const Const') { |v| options[:const] = v }
56
+ opts.on('-n', '--name Name') { |v| options[:name] = v }
57
+ opts.on('-f', '--config Config') { |v| options[:config].deep_merge!( eval( File.read(v) ) ) }
58
+ end.parse!
59
+
60
+ if options[:name].empty?
61
+ options[:name] = evaluate_name(options[:tags], options[:tests])
62
+ end
63
+
64
+ if options[ :config ][ :moto ][ :runner ][ :mandatory_environment ] && options[ :environments ].empty?
65
+ puts 'Environment is mandatory for this project.'
66
+ exit 1
67
+ end
68
+
69
+ return options
70
+ end
71
+
72
+ def self.evaluate_name(tags, tests)
73
+ tags ||= ""
74
+ tests ||= ""
75
+ if !tags.empty? && !tests.empty?
76
+ return "#{tags.count} tags + #{tests.count} tests"
77
+ elsif tags.empty?
78
+ return tests.count == 1 ? "Test: #{tests.first}" : "#{tests.count} tests"
79
+ elsif tests.empty?
80
+ return tags.count == 1 ? "Tag: #{tags.first}" : "#{tags.count} tags"
81
+ end
82
+ end
83
+
84
+ def self.generate_parse(argv)
85
+ options = {}
86
+ options[:dir]
87
+ end
88
+
89
+ def self.show_help
90
+ puts """
91
+ Moto (#{Moto::VERSION}) CLI Help:
92
+ moto --version Display current version
93
+ 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
96
+ -e, --environment etc etc
97
+ moto generate:
98
+ moto generate app_name -d, --dir = directory. Default is current dir.
99
+ """
100
+ end
101
+
102
+ end
103
+ end
data/lib/result.rb CHANGED
@@ -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