moto 0.0.10 → 0.0.11

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: d13c936e69cf45887f9b71a57ed70ff927278746
4
- data.tar.gz: 3caa5e91cff3fff305b46f5e42b07b7798ae7b4b
3
+ metadata.gz: 4e0d2bc8cf0fdd04c80ef51518748b2f3091f4be
4
+ data.tar.gz: cffe21eadaa97d2469aca4754f7e23ef5c1e1ac2
5
5
  SHA512:
6
- metadata.gz: e35a1532511468cd22cc6a1510162e7e422206603c8ac0c771bf9eaac7e51122a1293ea4473744dade418d1a11efae8adde0d94f9c3e9ae0ede7eb320380d54e
7
- data.tar.gz: f17872321fced47b4af3772c548c55f9db95d5e0d88d875473a0ab384cd692a8a90f11751f812dd463163ddddf30c358a800d1fc2369a2d9d3dd0cfbb8b0ff85
6
+ metadata.gz: 8f25fd63074145f9a8a30377e29b556d9da74f7181b685649e578365fda45ac0944da13b20fd074dd5eeb14e204c055a13e670a42d67b9565b9301ab1da6d973
7
+ data.tar.gz: 11be7c4eedb48b8b8d8afdbabb1b56122e570db463c35f7f130ad7814f2de30df133fa61fa41be1d72edd93d8138c1cd1036616b30a2699b558d3af07d345e4b
data/lib/cli.rb CHANGED
@@ -37,6 +37,7 @@ require_relative './listeners/base'
37
37
  require_relative './listeners/console'
38
38
  require_relative './listeners/console_dots'
39
39
  require_relative './listeners/junit_xml'
40
+ require_relative './listeners/webui'
40
41
  require_relative './test_generator'
41
42
  require_relative './exceptions/moto'
42
43
  require_relative './exceptions/test_skipped'
@@ -63,11 +64,11 @@ module Moto
63
64
  tests_total = Dir.glob("#{MotoApp::DIR}/tests/**/*.rb")
64
65
  argv[ :tags ].each do |tag_name|
65
66
  tests_total.each do |test_dir|
66
- test_body = File.read (test_dir)
67
+ test_body = File.read(test_dir)
67
68
  test_body.each_line do |line|
68
69
  line = line.delete(' ')
69
70
  if line.include?( '#MOTO_TAGS')
70
- if line.include? (tag_name + ',')
71
+ if line.include?(tag_name + ',')
71
72
  test_paths_absolute.include?(test_dir) || test_paths_absolute << test_dir
72
73
  break
73
74
  else
@@ -95,7 +96,7 @@ module Moto
95
96
  listeners << r.constantize
96
97
  end
97
98
 
98
- runner = Moto::Runner.new(test_classes, listeners, argv[ :environments ], argv[ :config ])
99
+ runner = Moto::Runner.new(test_classes, listeners, argv[:environments], argv[:config], argv[:name])
99
100
  runner.run
100
101
  end
101
102
 
@@ -0,0 +1,69 @@
1
+ require 'rest-client'
2
+ require 'sys/uname'
3
+
4
+ module Moto
5
+ module Listeners
6
+ class Webui < Base
7
+
8
+ def start_run
9
+ # POST http://sandbox.dev:3000/api/runs/create
10
+ @url = @runner.my_config[:url]
11
+ data = {
12
+ name: @runner.name,
13
+ result: Moto::Result::RUNNING,
14
+ cnt_all: nil,
15
+ cnt_passed: nil,
16
+ cnt_failure: nil,
17
+ cnt_error: nil,
18
+ cnt_skipped: nil,
19
+ user: Sys::Uname.sysname.downcase.include?('windows') ? ENV['USERNAME'] : ENV['LOGNAME'],
20
+ host: Sys::Uname.nodename,
21
+ pid: Process.pid
22
+ }
23
+ @run = JSON.parse( RestClient.post( "#{@url}/api/runs", data.to_json, :content_type => :json, :accept => :json ) )
24
+ end
25
+
26
+ def end_run
27
+ # PUT http://sandbox.dev:3000/api/runs/1
28
+ data = {
29
+ result: @runner.result.summary[:result],
30
+ cnt_all: @runner.result.summary[:cnt_all],
31
+ cnt_passed: @runner.result.summary[:cnt_passed],
32
+ cnt_failure: @runner.result.summary[:cnt_failure],
33
+ cnt_error: @runner.result.summary[:cnt_error],
34
+ cnt_skipped: @runner.result.summary[:cnt_skipped],
35
+ duration: @runner.result.summary[:duration]
36
+ }
37
+ @run = JSON.parse( RestClient.put( "#{@url}/api/runs/#{@run['id']}", data.to_json, :content_type => :json, :accept => :json ) )
38
+ end
39
+
40
+ def start_test(test)
41
+ # POST http://sandbox.dev:3000/api/tests/create
42
+ data = {
43
+ name: test.name,
44
+ class_name: test.class.name,
45
+ log: nil,
46
+ env: test.env,
47
+ parameters: test.params.to_s,
48
+ result: Moto::Result::RUNNING,
49
+ error: nil,
50
+ failures: nil,
51
+ }
52
+ @test = JSON.parse( RestClient.post( "#{@url}/api/tests", data.to_json, :content_type => :json, :accept => :json ) )
53
+ end
54
+
55
+ def end_test(test)
56
+ log = File.read(test.log_path)
57
+ data = {
58
+ log: log,
59
+ result: @runner.result[test.name][:result],
60
+ error: @runner.result[test.name][:error].nil? ? nil : @runner.result[test.name][:error].message,
61
+ failures: @runner.result[test.name][:failures].join("\n\t"),
62
+ duration: @runner.result[test.name][:duration]
63
+ }
64
+ @test = JSON.parse( RestClient.put( "#{@url}/api/tests/#{@test['id']}", data.to_json, :content_type => :json, :accept => :json ) )
65
+ end
66
+
67
+ end
68
+ end
69
+ end
@@ -26,6 +26,7 @@ module Moto
26
26
  # TODO Mandatory env var in app config
27
27
  options[:config] = eval(File.read("#{MotoApp::DIR}/config/moto.rb"))
28
28
  options[:environments] = []
29
+ options[:name] = ""
29
30
 
30
31
  # Parse arguments
31
32
  # TODO eval ?
@@ -37,9 +38,14 @@ module Moto
37
38
  opts.on('-r', '--reporters Reporters', Array) { |v| options[:reporters] = v }
38
39
  opts.on('-e', '--environments Environment', Array) { |v| options[:environments] = v }
39
40
  opts.on('-c', '--const Const') { |v| options[:const] = v }
40
- opts.on('-cfg', '--config Config') { |v| options[:config] = options[:config].merge( eval( v ) ) }
41
+ opts.on('-n', '--name Name') { |v| options[:name] = v }
42
+ opts.on('-f', '--config Config') { |v| options[:config] = options[:config].merge( eval( v ) ) }
41
43
  end.parse!
42
44
 
45
+ if options[:name].empty?
46
+ options[:name] = evaluate_name(options[:tags], options[:tests])
47
+ end
48
+
43
49
  if options[ :config ][ :moto ][ :runner ][ :mandatory_environment ] && options[ :environments ].empty?
44
50
  puts 'Environment is mandatory for this project.'
45
51
  exit 1
@@ -48,6 +54,18 @@ module Moto
48
54
  return options
49
55
  end
50
56
 
57
+ def self.evaluate_name(tags, tests)
58
+ tags ||= ""
59
+ tests ||= ""
60
+ if !tags.empty? && !tests.empty?
61
+ return "#{tags.count} tags + #{tests.count} tests"
62
+ elsif tags.empty?
63
+ return tests.count == 1 ? "Test: #{tests.first}" : "#{tests.count} tests"
64
+ elsif tests.empty?
65
+ return tags.count == 1 ? "Tag: #{tags.first}" : "#{tags.count} tags"
66
+ end
67
+ end
68
+
51
69
  def self.generate_parse(argv)
52
70
  options = {}
53
71
  options[:dir]
@@ -7,11 +7,13 @@ module Moto
7
7
  attr_reader :environments
8
8
  attr_reader :assert
9
9
  attr_reader :config
10
+ attr_reader :name
10
11
 
11
- def initialize(tests, listeners, environments, config)
12
+ def initialize(tests, listeners, environments, config, name)
12
13
  @tests = tests
13
14
  @config = config
14
15
  @threads = []
16
+ @name = name
15
17
 
16
18
  # TODO: initialize logger from config (yml or just ruby code)
17
19
  # @logger = Logger.new(STDOUT)
@@ -10,6 +10,7 @@ module Moto
10
10
  attr_reader :env
11
11
  attr_reader :params
12
12
  attr_writer :static_path
13
+ attr_accessor :log_path
13
14
 
14
15
  class << self
15
16
  attr_accessor :_path
@@ -4,7 +4,7 @@ module Moto
4
4
  # all resources specific for single thread will be initialized here. E.g. browser session
5
5
  attr_reader :runner
6
6
  attr_reader :logger
7
- attr_reader :log_path
7
+ # attr_reader :log_path
8
8
  attr_reader :current_test
9
9
 
10
10
  def initialize(runner, tests)
@@ -91,8 +91,8 @@ module Moto
91
91
  (1..max_attempts).each do |attempt|
92
92
  test.init(env, params)
93
93
  # TODO: log path might be specified (to some extent) by the configuration
94
- @log_path = "#{test.dir}/#{test.name.gsub(/\s+/, '_').gsub('::', '_').gsub('/', '_')}.log"
95
- @logger = Logger.new(File.open(@log_path, File::WRONLY | File::TRUNC | File::CREAT))
94
+ test.log_path = "#{test.dir}/#{test.name.gsub(/\s+/, '_').gsub('::', '_').gsub('/', '_')}.log"
95
+ @logger = Logger.new(File.open(test.log_path, File::WRONLY | File::TRUNC | File::CREAT))
96
96
  # TODO: make logger level configurable
97
97
  @logger.level = @runner.my_config[:log_level]
98
98
  @current_test = test
@@ -112,9 +112,11 @@ module Moto
112
112
  end
113
113
  test.after
114
114
  @clients.each_value { |c| c.end_test(test) }
115
- @runner.listeners.each { |l| l.end_test(test) }
115
+ # HAX: running end_test on results now, on other listeners after logger is closed
116
+ @runner.listeners.first.end_test(test)
116
117
  @logger.info("Result: #{test.result}")
117
118
  @logger.close
119
+ @runner.listeners[1..-1].each { |l| l.end_test(test) }
118
120
  break unless [Result::FAILURE, Result::ERROR].include? test.result
119
121
  end # RETRY
120
122
  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.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bartek Wilczek
@@ -39,6 +39,34 @@ dependencies:
39
39
  - - '>='
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rest-client
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: sys-uname
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
42
70
  description: This is a development version of a rails philosophy inspired framework
43
71
  for web applications functional testing. It supports (or will support) threading,
44
72
  scenario parametrization, different test environments and much more. Stay tuned
@@ -75,6 +103,7 @@ files:
75
103
  - lib/listeners/console.rb
76
104
  - lib/listeners/console_dots.rb
77
105
  - lib/listeners/junit_xml.rb
106
+ - lib/listeners/webui.rb
78
107
  - bin/moto
79
108
  homepage: https://github.com/bwilczek/moto
80
109
  licenses: