oncall 0.2.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 12ddf87f28a57e8af44db88091f20ebbbf50834f5cad4fb0326bc2cbf5276ad7
4
- data.tar.gz: 93ac2e6fe512c9234497fc8b5515e0bf263c8b3ccbaa9a1ea0a44c4260aefedd
3
+ metadata.gz: b32fb0bf81e7eb52f7ed4a716584e5634d2109d00f68e9d99ac687576b7dafe7
4
+ data.tar.gz: 8896c3f2830722e034f7de93c907e5d40ac257114f49179aa875937c0a59687a
5
5
  SHA512:
6
- metadata.gz: 157da28df15a1d98872491d8854790210459dd742b0abc85e7327064f1f8ce8af6a2b364eb17f6500d1a6ce99128866949624d411c453d3d420e2fa265aa2642
7
- data.tar.gz: c0882150b97fc2a325ad26e3458cd8edcb949acc6ab9994babd826c512843fbac0d1bc3f0d467d33a520dd40d2cb7270372f292b05c5ee82803e770420ab8274
6
+ metadata.gz: 121096a38968f48da32314255339cef94e526a6d30a9ff31331e2e1c0f93f2d443169f3e52ec7ab44180f01904bd469d3517f7f7cf0ae532d95c4793dbbbd6bf
7
+ data.tar.gz: 56acd28d76bfd3a65c8a94f89f6b10052efaab80e135d41e35b8e017c0a479aae09ac960ae2c2c4bc450e6370368a6bb769a7f411be6ee623313e9c1fba8827c
data/README.md CHANGED
@@ -6,11 +6,11 @@
6
6
 
7
7
  #### Install
8
8
  ```
9
- gem install oncall
9
+ $ gem install oncall
10
10
  ```
11
11
 
12
12
 
13
- ### Table of content
13
+ #### Table of content
14
14
 
15
15
  * [Get started](#get-started)
16
16
  * [Usage](#usage)
@@ -21,6 +21,37 @@ gem install oncall
21
21
 
22
22
  ## Get started
23
23
 
24
+ Initialize
25
+ ```
26
+ $ oncall --init
27
+ ```
28
+
29
+ Add tests
30
+ ```
31
+ group :user do
32
+ header 'Content-Type' => 'application/json'
33
+
34
+ schema = {
35
+ 'type' => 'object',
36
+ 'required' => ['foo'],
37
+ 'properties' => {
38
+ 'foo' => { 'type' => 'string' }
39
+ }
40
+ }
41
+
42
+ param id: 1
43
+
44
+ get '/users/:id' do
45
+ status 200
46
+ validate schema
47
+ end
48
+ end
49
+ ```
50
+
51
+ Run them
52
+ ```
53
+ $ oncall
54
+ ```
24
55
 
25
56
  ## Usage
26
57
 
@@ -36,3 +67,4 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
36
67
  ## Acknowledgments
37
68
 
38
69
  * Inspired by [rspec](https://github.com/rspec/rspec).
70
+ * And using [Ruby JSON Schema Validator](https://github.com/ruby-json-schema/json-schema).
data/bin/oncall CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require File.expand_path(File.dirname(__FILE__) + '/../lib/oncall')
4
- Oncall::CLI.run
4
+ Oncall::CLI.run(ARGV)
data/lib/oncall/cli.rb CHANGED
@@ -1,24 +1,80 @@
1
- # frozen_string_literal: true
1
+ module Oncall
2
+ # Manage the processing of command line options
3
+ class CLI
4
+ SCRIPT = 'oncall'
2
5
 
3
- require_relative 'commands/base_command'
4
- require_relative 'commands/init_command'
5
- require_relative 'commands/run_command'
6
- require_relative 'commands/shell_command'
6
+ attr_reader :args, :options
7
7
 
8
- module Oncall
9
- module CLI
10
- extend self
11
-
12
- def self.run
13
- case ARGV[0].to_s.downcase
14
- when 'init'
15
- Oncall::Commands::InitCommand.invoke(ARGV)
16
- when 'run'
17
- Oncall::Commands::RunCommand.invoke(ARGV)
18
- when 'shell'
19
- Oncall::Commands::ShellCommand.invoke(ARGV)
20
- else
21
- Oncall::Commands::BaseCommand.invoke(ARGV)
8
+ def initialize(args, options=Oncall.options)
9
+ @args = args
10
+ @options = options
11
+ end
12
+
13
+ def self.run(args)
14
+ new(args).run
15
+ end
16
+
17
+ def run
18
+ begin
19
+ parser.parse!(args)
20
+ rescue OptionParser::InvalidOption => e
21
+ abort "#{SCRIPT}: #{e.message}\nPlease use --help for a listing of valid options"
22
+ rescue OptionParser::MissingArgument => e
23
+ abort "#{SCRIPT}: #{e.message}"
24
+ end
25
+
26
+ status = options.runner.run($stderr, $stdout)
27
+ exit(status) if status.is_a? Integer
28
+ end
29
+
30
+ private
31
+
32
+ def parser
33
+ OptionParser.new do |opt|
34
+ opt.on('--env ENV', String) do |env|
35
+ options.env= env
36
+ end
37
+
38
+ opt.on('--path PATH', String) do |path|
39
+ options.path= path
40
+ end
41
+
42
+ opt.on('--pattern PATTERN', String) do |pattern|
43
+ options.pattern= pattern
44
+ end
45
+
46
+ opt.on('--exclude PATTERN', String) do |pattern|
47
+ options.exclude= pattern
48
+ end
49
+
50
+ opt.on('--group GROUP', String) do |group|
51
+ options.group= group
52
+ end
53
+
54
+ opt.on('--persist PATH', String) do |path|
55
+ options.persist= path
56
+ end
57
+
58
+ opt.on('--config PATH', String) do |path|
59
+ options.config= path
60
+ end
61
+
62
+ opt.on('--init', '') do
63
+ options.runner= Oncall::Invocations::InitRunner.new
64
+ end
65
+
66
+ # This is for later
67
+ # opt.on('--console', '') do
68
+ # options.runner= Oncall::Invocations::ConsoleRunner.new
69
+ # end
70
+
71
+ opt.on('--version', '') do
72
+ options.runner= Oncall::Invocations::VersionRunner.new
73
+ end
74
+
75
+ opt.on_tail('--help', 'This help message') do
76
+ options.runner= Oncall::Invocations::HelpRunner.new(parser)
77
+ end
22
78
  end
23
79
  end
24
80
  end
@@ -0,0 +1,4 @@
1
+ module Oncall
2
+ class Config
3
+ end
4
+ end
data/lib/oncall/dsl.rb CHANGED
@@ -1,7 +1,85 @@
1
1
  module Oncall
2
- module DSL
3
- require_relative 'dsl/assertion'
4
- require_relative 'dsl/call'
5
- require_relative 'dsl/group'
2
+ class DSL
3
+ private
4
+
5
+ attr_accessor :response, :request
6
+ attr_reader :reporter, :file, :http
7
+
8
+ public
9
+
10
+ def initialize(file, reporter)
11
+ @reporter = reporter
12
+ @file = file
13
+ @http = Net::HTTP.new('localhost', 4567)
14
+ @headers = { 'User-Agent' => "oncall/#{Oncall::VERSION}" }
15
+ @params = {}
16
+ @query = {}
17
+ @response = nil
18
+ @request = nil
19
+ end
20
+
21
+ def to_s
22
+ file
23
+ end
24
+
25
+ private
26
+
27
+ def group(name=nil, &block)
28
+ return reporter.empty_group(self) unless block_given?
29
+
30
+ instance_exec &block
31
+ end
32
+
33
+ def get(path, &block)
34
+ return reporter.empty_call(self) unless block_given?
35
+
36
+ uri = Oncall.uri(path, @params)
37
+ @request = Net::HTTP::Get.new(uri)
38
+
39
+ @headers.each do |key, value|
40
+ @request[key] = value
41
+ end
42
+
43
+ @response = http.request(request)
44
+
45
+ instance_exec &block
46
+ end
47
+
48
+ def post(path, &block)
49
+ return reporter.empty_call(self) unless block_given?
50
+
51
+ uri = Oncall.uri(path, @params)
52
+ @request = Net::HTTP::Post.new(uri)
53
+
54
+ @headers.each do |key, value|
55
+ @request[key] = value
56
+ end
57
+
58
+ @response = http.request(request)
59
+
60
+ instance_exec &block
61
+ end
62
+
63
+ def header(key_value)
64
+ key_value.each do |key, value|
65
+ @headers[key] = value
66
+ end
67
+ end
68
+
69
+ def param(key_value)
70
+ key_value.each do |key, value|
71
+ @params[key] = value
72
+ end
73
+ end
74
+
75
+ def validate(expected)
76
+ result = JSON::Validator.validate(expected, @response.body)
77
+ reporter.json_schema(self, result, expected)
78
+ end
79
+
80
+ def status(expected)
81
+ result = response.code == expected.to_s
82
+ reporter.status(self, result, expected)
83
+ end
6
84
  end
7
85
  end
@@ -0,0 +1,73 @@
1
+ module Oncall
2
+ module Invocations
3
+ class ConsoleRunner
4
+ def run(err, out); end
5
+ end
6
+
7
+ class HelpRunner
8
+ attr_reader :parser
9
+
10
+ def initialize(parser)
11
+ @parser = parser
12
+ end
13
+
14
+ def run(err, out)
15
+ out.puts parser
16
+ end
17
+ end
18
+
19
+ class InitRunner
20
+ def run(err, out)
21
+ config_template_path = File.join(File.dirname(__FILE__), 'templates', 'oncall.yml.template')
22
+ template = File.read(config_template_path)
23
+
24
+ File.open(File.join(Dir.getwd, 'oncall.yml'), 'w') do |file|
25
+ file.write(template)
26
+ end
27
+ end
28
+ end
29
+
30
+ class VersionRunner
31
+ def run(err, out)
32
+ out.puts "Oncall: v#{Oncall::VERSION}"
33
+ end
34
+ end
35
+
36
+ class TestRunner
37
+ def run(err, out)
38
+ reporter.report do |r|
39
+ suite.map { |g| g.run(r) }
40
+ end
41
+
42
+ reporter.success? ? 0 : 1
43
+ end
44
+
45
+ private
46
+
47
+ def reporter
48
+ @reporter ||= Oncall::Reporter.new
49
+ end
50
+
51
+ def suite
52
+ files = []
53
+
54
+ test_files.each do |file|
55
+ test_file = Oncall::TestFile.new(file)
56
+ files << test_file
57
+ end
58
+
59
+ files
60
+ end
61
+
62
+ def test_files
63
+ matched_files = Dir.glob(options.pattern)
64
+ excluded_files = Dir.glob(options.exclude)
65
+ matched_files - excluded_files
66
+ end
67
+
68
+ def options
69
+ Oncall.options
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,26 @@
1
+ module Oncall
2
+ class Options
3
+ attr_writer :runner
4
+ attr_accessor :env,
5
+ :pattern,
6
+ :exclude,
7
+ :group,
8
+ :persist,
9
+ :config,
10
+ :path
11
+
12
+ def initialize
13
+ @env = 'develop'
14
+ @pattern = '**{,/*/**}/*_oncall.rb'
15
+ @exclude = ''
16
+ @group = nil
17
+ @persist = nil
18
+ @config = nil
19
+ @path = nil
20
+ end
21
+
22
+ def runner
23
+ @runner ||= Oncall::Invocations::TestRunner.new
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,120 @@
1
+ require 'colorize'
2
+
3
+ module Oncall
4
+ class Reporter
5
+ attr_accessor :results
6
+
7
+ def initialize
8
+ @messages = []
9
+ @start_time = nil
10
+ @end_time = nil
11
+ @results = {
12
+ success: 0,
13
+ failed: 0,
14
+ warn: 0,
15
+ skipped: 0
16
+ }
17
+ end
18
+
19
+ def report
20
+ start
21
+ begin
22
+ yield self
23
+ ensure
24
+ finish
25
+ end
26
+ end
27
+
28
+ def empty_group(test_case)
29
+ add_warn
30
+ report_empty_group
31
+ end
32
+
33
+ def empty_call(test_case)
34
+ add_skipped
35
+ report_empty_call
36
+ end
37
+
38
+ def status(test_case, result, expected)
39
+ if result
40
+ add_success
41
+ report_success
42
+ else
43
+ add_failed
44
+ report_failure
45
+ @messages << "#{test_case.to_s}: Expected status: #{expected}"
46
+ end
47
+ end
48
+
49
+ def json_schema(test_case, result, expected)
50
+ if result
51
+ add_success
52
+ report_success
53
+ else
54
+ add_failed
55
+ report_failure
56
+ @messages << "#{test_case.to_s}: JSON schema didn't match:\n#{expected}"
57
+ end
58
+ end
59
+
60
+ def success?
61
+ @results[:failed].zero?
62
+ end
63
+
64
+ private
65
+
66
+ def add_success
67
+ @results[:success] = @results[:success] + 1
68
+ end
69
+
70
+ def add_failed
71
+ @results[:failed] = @results[:failed] + 1
72
+ end
73
+
74
+ def add_warn
75
+ @results[:warn] = @results[:warn] + 1
76
+ end
77
+
78
+ def add_skipped
79
+ @results[:skipped] = @results[:skipped] + 1
80
+ end
81
+
82
+ def report_success
83
+ print '.'
84
+ end
85
+
86
+ def report_failure
87
+ print 'F'
88
+ end
89
+
90
+ def report_empty_group
91
+ print 'W'
92
+ end
93
+
94
+ def report_empty_call
95
+ print '*'
96
+ end
97
+
98
+ def start
99
+ @start_time = Time.now
100
+ end
101
+
102
+ def finish
103
+ @end_time = Time.now
104
+
105
+ puts "\n\n"
106
+ puts @messages
107
+
108
+ elapsed_seconds = (@end_time.to_f - @start_time.to_f).to_f
109
+ puts "\nFinished in #{elapsed_seconds.round(4)} seconds"
110
+
111
+ result = "#{@results[:success]} passed.\n#{@results[:failed]} failed.\n#{@results[:warn]} warnings.\n#{@results[:skipped]} skipped.\n"
112
+
113
+ if success?
114
+ puts result.green
115
+ else
116
+ puts result.red
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,13 @@
1
+ module Oncall
2
+ class TestFile
3
+ attr_reader :file
4
+
5
+ def initialize(file)
6
+ @file = file
7
+ end
8
+
9
+ def run(reporter)
10
+ Oncall::DSL.new(file, reporter).instance_eval File.read(file)
11
+ end
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Oncall
4
- VERSION = '0.2.5'
4
+ VERSION = '0.3.0'
5
5
  end
data/lib/oncall.rb CHANGED
@@ -7,5 +7,33 @@ require 'json-schema'
7
7
 
8
8
  # Oncall
9
9
  module Oncall
10
- require File.expand_path(File.join(File.dirname(__FILE__), 'oncall', 'cli'))
10
+ require_relative 'oncall/cli'
11
+ require_relative 'oncall/dsl'
12
+ require_relative 'oncall/options'
13
+ require_relative 'oncall/invocations'
14
+ require_relative 'oncall/test_file'
15
+ require_relative 'oncall/reporter'
16
+ require_relative 'oncall/version'
17
+
18
+ class << self
19
+ attr_writer :options
20
+ end
21
+
22
+ def self.options
23
+ @options ||= Oncall::Options.new
24
+ end
25
+
26
+ def self.uri(path, params)
27
+ parts = path.split('/')
28
+ return '/' if parts.empty?
29
+
30
+ parts.each_with_index do |part, index|
31
+ if part.start_with?(':')
32
+ part[0] = ''
33
+ parts[index] = params[part.to_sym]
34
+ end
35
+ end
36
+
37
+ parts.join('/')
38
+ end
11
39
  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.2.5
4
+ version: 0.3.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-04 00:00:00.000000000 Z
11
+ date: 2019-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -80,7 +80,7 @@ dependencies:
80
80
  - - '='
81
81
  - !ruby/object:Gem::Version
82
82
  version: 2.0.7
83
- description: ''
83
+ description: BDD for JSON API's
84
84
  email: koensw@outlook.com
85
85
  executables:
86
86
  - oncall
@@ -92,29 +92,19 @@ files:
92
92
  - bin/oncall
93
93
  - lib/oncall.rb
94
94
  - lib/oncall/cli.rb
95
- - lib/oncall/commands/base_command.rb
96
- - lib/oncall/commands/init_command.rb
97
- - lib/oncall/commands/run_command.rb
98
- - lib/oncall/commands/shell_command.rb
99
- - lib/oncall/core.rb
100
- - lib/oncall/core/config.rb
101
- - lib/oncall/core/reporter.rb
102
- - lib/oncall/core/runner.rb
103
- - lib/oncall/core/world.rb
104
- - lib/oncall/core/wrapper.rb
95
+ - lib/oncall/config.rb
105
96
  - lib/oncall/dsl.rb
106
- - lib/oncall/dsl/assertion.rb
107
- - lib/oncall/dsl/call.rb
108
- - lib/oncall/dsl/group.rb
109
- - lib/oncall/http.rb
110
- - lib/oncall/http/request.rb
111
- - lib/oncall/http/response.rb
97
+ - lib/oncall/invocations.rb
98
+ - lib/oncall/options.rb
99
+ - lib/oncall/reporter.rb
112
100
  - lib/oncall/templates/oncall.yml.template
101
+ - lib/oncall/test_file.rb
113
102
  - lib/oncall/version.rb
114
- homepage:
103
+ homepage: https://github.com/koenwoortman/oncall
115
104
  licenses:
116
105
  - MIT
117
- metadata: {}
106
+ metadata:
107
+ bug_tracker_uri: https://github.com/koenwoortman/oncall/issues
118
108
  post_install_message:
119
109
  rdoc_options: []
120
110
  require_paths:
@@ -1,32 +0,0 @@
1
- require_relative '../version'
2
-
3
- module Oncall
4
- module Commands
5
- class BaseCommand
6
- def self.invoke(args)
7
- OptionParser.new do |opts|
8
- opts.banner = 'Usage: oncall'
9
- opts.separator ''
10
- opts.separator 'Commands:'
11
- opts.separator ' init Create an empty oncall project.'
12
- opts.separator ' run [ENV] Run the test suite.'
13
- opts.separator ''
14
- opts.separator 'Options:'
15
-
16
- opts.on('--version', 'Show version information.') do
17
- puts "oncall: version #{Oncall::VERSION}"
18
- exit
19
- end
20
-
21
- opts.on('--help', 'Display this help message.') do
22
- puts opts
23
- exit
24
- end
25
-
26
- puts opts
27
- exit
28
- end.parse!
29
- end
30
- end
31
- end
32
- end
@@ -1,16 +0,0 @@
1
- module Oncall
2
- module Commands
3
- class InitCommand
4
- def self.invoke(args)
5
- config_template_path = File.join(File.dirname(__FILE__), '..', 'templates', 'oncall.yml.template')
6
- template = File.read(config_template_path)
7
-
8
- File.open(File.join(Dir.getwd, 'oncall.yml'), 'w') do |file|
9
- file.write(template)
10
- end
11
-
12
- exit
13
- end
14
- end
15
- end
16
- end
@@ -1,11 +0,0 @@
1
- require_relative '../core'
2
-
3
- module Oncall
4
- module Commands
5
- class RunCommand
6
- def self.invoke(args)
7
- Oncall::Core::Runner.invoke(args)
8
- end
9
- end
10
- end
11
- end
@@ -1,17 +0,0 @@
1
- require 'readline'
2
-
3
- module Oncall
4
- module Commands
5
- class ShellCommand
6
- def self.invoke(args)
7
- while input = Readline.readline("> ", true)
8
- break if input == "exit"
9
-
10
- # Remove blank lines from history
11
- Readline::HISTORY.pop if input == ""
12
- system(input)
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,40 +0,0 @@
1
- module Oncall
2
- module Core
3
- class Config
4
- DEFAULT_PATTERN = '**{,/*/**}/*_oncall.rb'.freeze
5
-
6
- def initialize
7
- @config = []
8
- @env = 'develop'
9
- end
10
-
11
- def set_config(config)
12
- @config = config
13
- end
14
-
15
- def set_env(env)
16
- @env = env
17
- end
18
-
19
- def pattern
20
- DEFAULT_PATTERN
21
- end
22
-
23
- def failure_exit_code
24
- 1
25
- end
26
-
27
- def domain
28
- @config[@env]['domain'] || 'localhost'
29
- end
30
-
31
- def port
32
- @config[@env]['port'] || 4567
33
- end
34
-
35
- def test_files
36
- Dir.glob(pattern)
37
- end
38
- end
39
- end
40
- end
@@ -1,70 +0,0 @@
1
- require 'colorize'
2
-
3
- module Oncall
4
- module Core
5
- class Reporter
6
- def initialize
7
- @results = {
8
- failure: 0,
9
- success: 0,
10
- empty: 0
11
- }
12
-
13
- @start_time = nil
14
- @end_time = nil
15
- @messages = []
16
- end
17
-
18
- def report(tests)
19
- start
20
- begin
21
- yield self
22
- ensure
23
- finish
24
- end
25
- end
26
-
27
- def start
28
- @start_time = Time.now
29
- end
30
-
31
- def finish
32
- @end_time = Time.now
33
-
34
- puts "\n\n"
35
- puts @messages
36
-
37
- elapsed_seconds = (@end_time.to_f - @start_time.to_f).to_f
38
- puts "Finished in #{elapsed_seconds.round(4)} seconds"
39
-
40
- result = "#{@results[:success]} passed, #{@results[:failure]} failed.\n"
41
-
42
- if success?
43
- puts result.green
44
- else
45
- puts result.red
46
- end
47
- end
48
-
49
- def success?
50
- @results[:failure].zero? && @results[:empty].zero?
51
- end
52
-
53
- def report_empty_group
54
- print '*'
55
- @results[:empty] = @results[:empty] + 1
56
- end
57
-
58
- def report_status(result, message)
59
- if result
60
- print '.'
61
- @results[:success] = @results[:success] + 1
62
- else
63
- print 'F'
64
- @results[:failure] = @results[:failure] + 1
65
- @messages << message
66
- end
67
- end
68
- end
69
- end
70
- end
@@ -1,50 +0,0 @@
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
- new.run(args, err, out)
17
- end
18
-
19
- def run(args, err, out)
20
- setup(args, err, out)
21
- run_tests(@world.suite)
22
- end
23
-
24
- def setup(args, err, out)
25
- begin
26
- config = YAML.load_file('oncall.yml')
27
- rescue StandardError
28
- puts 'Cannot load oncall.yml'
29
- exit 1
30
- end
31
-
32
- env = args[1] || config['default']
33
-
34
- @config.set_config(config)
35
- @config.set_env(env)
36
-
37
- files = @config.test_files
38
- @world.register_suite(files)
39
- end
40
-
41
- def run_tests(suite)
42
- @reporter.report(suite) do |reporter|
43
- suite.map { |g| g.run(reporter) }
44
- end
45
-
46
- @reporter.success? ? 0 : @config.failure_exit_code
47
- end
48
- end
49
- end
50
- end
@@ -1,19 +0,0 @@
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
@@ -1,15 +0,0 @@
1
- require_relative '../dsl'
2
-
3
- module Oncall
4
- module Core
5
- class Wrapper
6
- def initialize(file)
7
- @file = file
8
- end
9
-
10
- def run(reporter)
11
- Oncall::DSL::Group.new.instance_eval File.read(@file)
12
- end
13
- end
14
- end
15
- end
data/lib/oncall/core.rb DELETED
@@ -1,25 +0,0 @@
1
- module Oncall
2
- module Core
3
- require_relative 'core/config'
4
- require_relative 'core/reporter'
5
- require_relative 'core/runner'
6
- require_relative 'core/world'
7
- require_relative 'core/wrapper'
8
-
9
- class << self
10
- attr_writer :config, :world, :reporter
11
- end
12
-
13
- def self.config
14
- @config ||= Oncall::Core::Config.new
15
- end
16
-
17
- def self.world
18
- @world ||= Oncall::Core::World.new
19
- end
20
-
21
- def self.reporter
22
- @reporter ||= Oncall::Core::Reporter.new
23
- end
24
- end
25
- end
@@ -1,28 +0,0 @@
1
- module Oncall
2
- module DSL
3
- class Assertion
4
- def initialize(response, method, path)
5
- @reporter = Oncall::Core.reporter
6
- @response = response
7
- @method = method
8
- @path = path
9
- end
10
-
11
- def status(expected)
12
- result = @response.code == expected.to_s
13
-
14
- message = "#{@method} #{@path}\nexpected: #{expected}\nactual: #{@response.code}"
15
-
16
- @reporter.report_status(result, message)
17
- end
18
-
19
- def validate(expected)
20
- result = JSON::Validator.validate(expected, @response.body)
21
-
22
- message = "#{@method} #{@path}\nexpected: #{expected}\nactual: #{@response.body}"
23
-
24
- @reporter.report_status(result, message)
25
- end
26
- end
27
- end
28
- end
@@ -1,54 +0,0 @@
1
- require_relative '../http'
2
-
3
- module Oncall
4
- module DSL
5
- class Call
6
- def initialize
7
- @config = Oncall::Core.config
8
- @http = Net::HTTP.new(@config.domain, @config.port)
9
- @headers = { 'User-Agent' => "oncall/#{Oncall::VERSION}" }
10
- @params = {}
11
- end
12
-
13
- def header(hash)
14
- hash.each do |key, value|
15
- @headers[key] = value
16
- end
17
- end
18
-
19
- def param(hash)
20
- hash.each do |key, value|
21
- @params[key] = value
22
- end
23
- end
24
-
25
- def get(path, &block)
26
- uri = Oncall::HTTP.uri(path, @params)
27
- request = Net::HTTP::Get.new(uri)
28
-
29
- @headers.each do |key, value|
30
- request[key] = value
31
- end
32
-
33
- response = @http.request(request)
34
-
35
- assertion = Oncall::DSL::Assertion.new(response, 'GET', path)
36
- assertion.instance_exec(&block)
37
- end
38
-
39
- def post(path, &block)
40
- uri = Oncall::HTTP.uri(path, @params)
41
- request = Net::HTTP::Post.new(uri)
42
-
43
- @headers.each do |key, value|
44
- request[key] = value
45
- end
46
-
47
- response = @http.request(request)
48
-
49
- assertion = Oncall::DSL::Assertion.new(response, 'POST', path)
50
- assertion.instance_exec(&block)
51
- end
52
- end
53
- end
54
- end
@@ -1,18 +0,0 @@
1
- module Oncall
2
- module DSL
3
- class Group
4
- def initialize
5
- @reporter = Oncall::Core.reporter
6
- end
7
-
8
- def group(name=nil, &block)
9
- if block_given?
10
- scenario = Oncall::DSL::Call.new
11
- scenario.instance_exec &block
12
- else
13
- @reporter.report_empty_group
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,6 +0,0 @@
1
- module Oncall
2
- module HTTP
3
- class Request
4
- end
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- module Oncall
2
- module HTTP
3
- class Response
4
- end
5
- end
6
- end
data/lib/oncall/http.rb DELETED
@@ -1,17 +0,0 @@
1
- module Oncall
2
- module HTTP
3
- def self.uri(path, params)
4
- parts = path.split('/')
5
- return '/' if parts.empty?
6
-
7
- parts.each_with_index do |part, index|
8
- if part.start_with?(':')
9
- part[0] = ''
10
- parts[index] = params[part.to_sym]
11
- end
12
- end
13
-
14
- parts.join('/')
15
- end
16
- end
17
- end