oncall 0.1.4 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/oncall/cli.rb +3 -0
- data/lib/oncall/commands/run_command.rb +3 -3
- data/lib/oncall/commands/shell_command.rb +8 -0
- data/lib/oncall/core/assertion.rb +15 -0
- data/lib/oncall/core/config.rb +23 -0
- data/lib/oncall/core/group.rb +18 -0
- data/lib/oncall/core/reporter.rb +49 -0
- data/lib/oncall/core/request.rb +13 -0
- data/lib/oncall/core/runner.rb +39 -0
- data/lib/oncall/core/scenario.rb +14 -0
- data/lib/oncall/core/world.rb +19 -0
- data/lib/oncall/core/wrapper.rb +13 -0
- data/lib/oncall/core.rb +31 -0
- data/lib/oncall/dsl/response.rb +17 -0
- data/lib/oncall/dsl.rb +29 -1
- data/lib/oncall/http.rb +4 -0
- data/lib/oncall/version.rb +1 -1
- data/lib/oncall.rb +0 -5
- metadata +15 -8
- data/lib/oncall/body_test.rb +0 -20
- data/lib/oncall/configuration.rb +0 -5
- data/lib/oncall/request.rb +0 -52
- data/lib/oncall/runner.rb +0 -49
- data/lib/oncall/test_case.rb +0 -24
- data/lib/oncall/test_wrapper.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21e2e79f1d7b3f98525a89c1cb973f23f5f8f4f3962d5be9a7ed5f9585db5296
|
4
|
+
data.tar.gz: 074252b3271d4a441257b5fa171208ce33ac3f827f898cef75a9e93b6d81dc37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 37fbc99650d45997051797f65df88e3db15c32275f4db054bf46a689182a5b1580fde0e8a80eb67658f48fe84e7f848d26b145308bfa9afa0d2eeb42aa65a764
|
7
|
+
data.tar.gz: e9df5052851e20e227d61b4a51f8e9d6fbae36438233662f5b1fe1679a57940f803bf9af11f04c2f7baf08521067b33570d2fc0511538a20a4a0d6db7ef6377b
|
data/lib/oncall/cli.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require_relative 'commands/base_command'
|
4
4
|
require_relative 'commands/init_command'
|
5
5
|
require_relative 'commands/run_command'
|
6
|
+
require_relative 'commands/shell_command'
|
6
7
|
|
7
8
|
module Oncall
|
8
9
|
module CLI
|
@@ -14,6 +15,8 @@ module Oncall
|
|
14
15
|
Oncall::Commands::InitCommand.invoke(ARGV.shift)
|
15
16
|
when 'run'
|
16
17
|
Oncall::Commands::RunCommand.invoke(ARGV.shift)
|
18
|
+
when 'shell'
|
19
|
+
Oncall::Commands::ShellCommand.invoke(ARGV.shift)
|
17
20
|
else
|
18
21
|
Oncall::Commands::BaseCommand.invoke(ARGV)
|
19
22
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Oncall
|
2
|
+
module Core
|
3
|
+
class Assertion
|
4
|
+
def initialize(response)
|
5
|
+
@reporter = Oncall::Core.reporter
|
6
|
+
@response = response
|
7
|
+
end
|
8
|
+
|
9
|
+
def status(expected)
|
10
|
+
result = @response.code == expected.to_s
|
11
|
+
@reporter.report_status(result)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Oncall
|
2
|
+
module Core
|
3
|
+
class Config
|
4
|
+
DEFAULT_PATTERN = '**{,/*/**}/*_oncall.rb'.freeze
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@files = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def pattern
|
11
|
+
DEFAULT_PATTERN
|
12
|
+
end
|
13
|
+
|
14
|
+
def failure_exit_code
|
15
|
+
1
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_files
|
19
|
+
Dir.glob(pattern)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Oncall
|
2
|
+
module Core
|
3
|
+
class Group
|
4
|
+
def initialize
|
5
|
+
@reporter = Oncall::Core.reporter
|
6
|
+
end
|
7
|
+
|
8
|
+
def describe(&block)
|
9
|
+
if block_given?
|
10
|
+
scenario = Oncall::Core::Scenario.new
|
11
|
+
scenario.instance_exec &block
|
12
|
+
else
|
13
|
+
@reporter.report_empty_group
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Oncall
|
2
|
+
module Core
|
3
|
+
class Reporter
|
4
|
+
def initialize
|
5
|
+
@results = {
|
6
|
+
failure: 0,
|
7
|
+
success: 0,
|
8
|
+
empty: 0
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
def report(tests)
|
13
|
+
start
|
14
|
+
begin
|
15
|
+
yield self
|
16
|
+
ensure
|
17
|
+
finish
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def start
|
22
|
+
end
|
23
|
+
|
24
|
+
def finish
|
25
|
+
puts "\n"
|
26
|
+
puts "#{@results[:success]} passed, #{@results[:failure]} failed."
|
27
|
+
end
|
28
|
+
|
29
|
+
def success?
|
30
|
+
@results[:failure].zero? && @results[:empty].zero?
|
31
|
+
end
|
32
|
+
|
33
|
+
def report_empty_group
|
34
|
+
print 'E'
|
35
|
+
@results[:empty] = @results[:empty] + 1
|
36
|
+
end
|
37
|
+
|
38
|
+
def report_status(result)
|
39
|
+
if result
|
40
|
+
print '.'
|
41
|
+
@results[:success] = @results[:success] + 1
|
42
|
+
else
|
43
|
+
print 'F'
|
44
|
+
@results[:failure] = @results[:failure] + 1
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Oncall
|
2
|
+
module Core
|
3
|
+
class Runner
|
4
|
+
def initialize(reporter=Oncall::Core.reporter, config=Oncall::Core.config, world=Oncall::Core.world)
|
5
|
+
@config = config
|
6
|
+
@world = world
|
7
|
+
@reporter = reporter
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.invoke(args)
|
11
|
+
status = run(args, $stderr, $stdout).to_i
|
12
|
+
exit(status) if status != 0
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.run(args, err=$stderr, out=$stdout)
|
16
|
+
# TODO: init options class
|
17
|
+
new.run(err, out)
|
18
|
+
end
|
19
|
+
|
20
|
+
def run(err, out)
|
21
|
+
setup(err, out)
|
22
|
+
run_tests(@world.suite)
|
23
|
+
end
|
24
|
+
|
25
|
+
def setup(err, out)
|
26
|
+
files = @config.test_files
|
27
|
+
@world.register_suite(files)
|
28
|
+
end
|
29
|
+
|
30
|
+
def run_tests(suite)
|
31
|
+
@reporter.report(suite) do |reporter|
|
32
|
+
suite.map { |g| g.run(reporter) }
|
33
|
+
end
|
34
|
+
|
35
|
+
@reporter.success? ? 0 : @config.failure_exit_code
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Oncall
|
2
|
+
module Core
|
3
|
+
class Scenario
|
4
|
+
def get(path, &block)
|
5
|
+
http = Net::HTTP.new('localhost', 4567)
|
6
|
+
request = Net::HTTP::Get.new(path)
|
7
|
+
response = http.request(request)
|
8
|
+
|
9
|
+
assertion = Oncall::Core::Assertion.new(response)
|
10
|
+
assertion.instance_exec(&block)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Oncall
|
2
|
+
module Core
|
3
|
+
class World
|
4
|
+
|
5
|
+
attr_reader :suite
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@suite = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def register_suite(files)
|
12
|
+
files.each do |file|
|
13
|
+
wrapper = Oncall::Core::Wrapper.new(file)
|
14
|
+
@suite << wrapper
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/oncall/core.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Oncall
|
2
|
+
module Core
|
3
|
+
require_relative 'core/assertion'
|
4
|
+
require_relative 'core/config'
|
5
|
+
require_relative 'core/group'
|
6
|
+
require_relative 'core/reporter'
|
7
|
+
require_relative 'core/request'
|
8
|
+
require_relative 'core/runner'
|
9
|
+
require_relative 'core/scenario'
|
10
|
+
require_relative 'core/world'
|
11
|
+
require_relative 'core/wrapper'
|
12
|
+
|
13
|
+
STATUS_EMPTY = :empty
|
14
|
+
|
15
|
+
class << self
|
16
|
+
attr_writer :config, :world
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.config
|
20
|
+
@config ||= Oncall::Core::Config.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.world
|
24
|
+
@world ||= Oncall::Core::World.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.reporter
|
28
|
+
@reporter ||= Oncall::Core::Reporter.new
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/oncall/dsl.rb
CHANGED
@@ -1,4 +1,32 @@
|
|
1
|
+
require_relative 'dsl/response'
|
2
|
+
|
1
3
|
module Oncall
|
2
|
-
|
4
|
+
class DSL
|
5
|
+
private
|
6
|
+
|
7
|
+
def describe(group, &block)
|
8
|
+
if block_given?
|
9
|
+
begin
|
10
|
+
yield
|
11
|
+
end
|
12
|
+
else
|
13
|
+
# Return status empty
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def get(path, &block)
|
18
|
+
if block_given?
|
19
|
+
http = Net::HTTP.new('localhost', 4567)
|
20
|
+
request = Net::HTTP::Get.new(path)
|
21
|
+
response = Oncall::Response.new(http.request(request))
|
22
|
+
|
23
|
+
begin
|
24
|
+
resuls = response.instance_eval &block
|
25
|
+
resuls
|
26
|
+
end
|
27
|
+
else
|
28
|
+
# Return status empty
|
29
|
+
end
|
30
|
+
end
|
3
31
|
end
|
4
32
|
end
|
data/lib/oncall/http.rb
ADDED
data/lib/oncall/version.rb
CHANGED
data/lib/oncall.rb
CHANGED
@@ -7,10 +7,5 @@ require 'json-schema'
|
|
7
7
|
|
8
8
|
# Oncall
|
9
9
|
module Oncall
|
10
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'oncall', 'body_test'))
|
11
10
|
require File.expand_path(File.join(File.dirname(__FILE__), 'oncall', 'cli'))
|
12
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'oncall', 'request'))
|
13
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'oncall', 'test_case'))
|
14
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'oncall', 'test_wrapper'))
|
15
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'oncall', 'runner'))
|
16
11
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oncall
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koen Woortman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json-schema
|
@@ -76,18 +76,25 @@ files:
|
|
76
76
|
- README.md
|
77
77
|
- bin/oncall
|
78
78
|
- lib/oncall.rb
|
79
|
-
- lib/oncall/body_test.rb
|
80
79
|
- lib/oncall/cli.rb
|
81
80
|
- lib/oncall/commands/base_command.rb
|
82
81
|
- lib/oncall/commands/init_command.rb
|
83
82
|
- lib/oncall/commands/run_command.rb
|
84
|
-
- lib/oncall/
|
83
|
+
- lib/oncall/commands/shell_command.rb
|
84
|
+
- lib/oncall/core.rb
|
85
|
+
- lib/oncall/core/assertion.rb
|
86
|
+
- lib/oncall/core/config.rb
|
87
|
+
- lib/oncall/core/group.rb
|
88
|
+
- lib/oncall/core/reporter.rb
|
89
|
+
- lib/oncall/core/request.rb
|
90
|
+
- lib/oncall/core/runner.rb
|
91
|
+
- lib/oncall/core/scenario.rb
|
92
|
+
- lib/oncall/core/world.rb
|
93
|
+
- lib/oncall/core/wrapper.rb
|
85
94
|
- lib/oncall/dsl.rb
|
86
|
-
- lib/oncall/
|
87
|
-
- lib/oncall/
|
95
|
+
- lib/oncall/dsl/response.rb
|
96
|
+
- lib/oncall/http.rb
|
88
97
|
- lib/oncall/templates/oncall.yml.template
|
89
|
-
- lib/oncall/test_case.rb
|
90
|
-
- lib/oncall/test_wrapper.rb
|
91
98
|
- lib/oncall/version.rb
|
92
99
|
homepage:
|
93
100
|
licenses:
|
data/lib/oncall/body_test.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module Oncall
|
2
|
-
class BodyTest
|
3
|
-
def initialize(body, description)
|
4
|
-
@body = body
|
5
|
-
@description = description
|
6
|
-
@result = false
|
7
|
-
end
|
8
|
-
|
9
|
-
def run(&block)
|
10
|
-
instance_eval(&block)
|
11
|
-
@result
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def matches(schema)
|
17
|
-
@result = JSON::Validator.validate(schema, @body)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/lib/oncall/configuration.rb
DELETED
data/lib/oncall/request.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
module Oncall
|
2
|
-
class Request
|
3
|
-
def initialize(config, endpoint)
|
4
|
-
@config = config
|
5
|
-
@endpoint = endpoint
|
6
|
-
@headers = {}
|
7
|
-
@expectations = []
|
8
|
-
@http = nil
|
9
|
-
@response = nil
|
10
|
-
@request = nil
|
11
|
-
end
|
12
|
-
|
13
|
-
def bootstrap
|
14
|
-
@http = Net::HTTP.new(@config['domain'], @config['port'])
|
15
|
-
|
16
|
-
@request = Net::HTTP::Get.new(@endpoint)
|
17
|
-
|
18
|
-
@request['User-Agent'] = 'Oncall'
|
19
|
-
|
20
|
-
@headers.each do |key, value|
|
21
|
-
request[key] = value
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
def run(&block)
|
27
|
-
@response = @http.request(@request)
|
28
|
-
|
29
|
-
instance_eval(&block)
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def header(header)
|
35
|
-
@headers.merge!(header)
|
36
|
-
end
|
37
|
-
|
38
|
-
def body(description, &block)
|
39
|
-
result = Oncall::BodyTest.new(@response.body, description).run(&block)
|
40
|
-
puts "Endpoint: #{@endpoint} -----"
|
41
|
-
puts " Body: #{description}: #{result}"
|
42
|
-
end
|
43
|
-
|
44
|
-
def status(description, &block)
|
45
|
-
@expectations.push(description)
|
46
|
-
end
|
47
|
-
|
48
|
-
def profiler(description, &block)
|
49
|
-
@expectations.push(description)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
data/lib/oncall/runner.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Oncall
|
4
|
-
class Runner
|
5
|
-
DEFAULT_PATTERN = '**{,/*/**}/*_oncall.rb'
|
6
|
-
|
7
|
-
def initialize(env)
|
8
|
-
@config = {}
|
9
|
-
@pattern = DEFAULT_PATTERN
|
10
|
-
@test_wrapper = Oncall::TestWrapper.new
|
11
|
-
@env = env
|
12
|
-
end
|
13
|
-
|
14
|
-
def run
|
15
|
-
begin
|
16
|
-
config = YAML.load_file('oncall.yml')
|
17
|
-
merge_config(config)
|
18
|
-
rescue StandardError
|
19
|
-
puts 'Cannot load oncall.yml'
|
20
|
-
exit 1
|
21
|
-
end
|
22
|
-
|
23
|
-
files = Dir.glob(@pattern)
|
24
|
-
|
25
|
-
process_files(files)
|
26
|
-
0
|
27
|
-
end
|
28
|
-
|
29
|
-
def process_files(files)
|
30
|
-
@test_wrapper.set_config(@config)
|
31
|
-
|
32
|
-
files.each do |file|
|
33
|
-
@test_wrapper.evaluate(file)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def merge_config(config)
|
40
|
-
if config.key?(@env)
|
41
|
-
@config = config[@env]
|
42
|
-
elsif config.key?('default')
|
43
|
-
@config = config[config['default']]
|
44
|
-
else
|
45
|
-
raise 'Config error'
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
data/lib/oncall/test_case.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
module Oncall
|
2
|
-
class TestCase
|
3
|
-
|
4
|
-
def initialize(config)
|
5
|
-
@config = config
|
6
|
-
end
|
7
|
-
|
8
|
-
def run(file)
|
9
|
-
instance_eval File.read(file)
|
10
|
-
end
|
11
|
-
|
12
|
-
def get(endpoint, &block)
|
13
|
-
test = Oncall::Request.new(@config, endpoint)
|
14
|
-
test.bootstrap
|
15
|
-
test.run(&block)
|
16
|
-
end
|
17
|
-
|
18
|
-
def post(endpoint, &block)
|
19
|
-
test = Oncall::Request.new(@config, endpoint)
|
20
|
-
test.bootstrap(&block)
|
21
|
-
test.run
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/lib/oncall/test_wrapper.rb
DELETED