barthes 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
data/barthes.gemspec CHANGED
@@ -27,4 +27,6 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency "term-ansicolor"
28
28
  spec.add_dependency "activesupport"
29
29
  spec.add_dependency "nokogiri"
30
+ spec.add_dependency "chronic"
31
+ spec.add_dependency "httparty"
30
32
  end
@@ -0,0 +1,4 @@
1
+ {
2
+ "endpoint": "http://q3-global.herokuapp.com",
3
+ "method": "GET"
4
+ }
@@ -0,0 +1,66 @@
1
+ ["feature", "Q3", [
2
+ ["scenario", "CreateQueue", [
3
+ ["action", "create queue with CreateQueue API", {
4
+ "params": {
5
+ "Action": "CreateQueue",
6
+ "QueueName": "takeuchitest"
7
+ },
8
+ "expectations": [
9
+ {
10
+ "type": "response_code",
11
+ "value": 200
12
+ },
13
+ {
14
+ "type": "xpath_value",
15
+ "xpath": "//CreateQueueResponse/CreateQueueResult/QueueUrl",
16
+ "value": "http://q3-global.herokuapp.com/*/takeuchitest"
17
+ }
18
+ ]
19
+ }],
20
+ ["action", "check if that queue is created with ListQueues API", {
21
+ "params": {
22
+ "Action": "ListQueues"
23
+ },
24
+ "expectations": [
25
+ {
26
+ "type": "response_code",
27
+ "value": 200
28
+ },
29
+ {
30
+ "type": "xpath_value",
31
+ "xpath": "ListQueuesResponse/ListQueuesResult/QueueUrl[1]",
32
+ "value": "http://q3-global.herokuapp.com/*/takeuchitest"
33
+ }
34
+ ]
35
+ }],
36
+ ["action", "send message to that queue with SendMessage API", {
37
+ "params": {
38
+ "Action": "SendMessage",
39
+ "MessageBody": "hello barthes"
40
+ },
41
+ "env": {
42
+ "path": "/*/takeuchitest"
43
+ },
44
+ "expectations": [
45
+ {
46
+ "type": "response_code",
47
+ "value": 200
48
+ }
49
+ ]
50
+ }],
51
+ ["action", "receive message from that queue with ReceiveMessage API", {
52
+ "params": {
53
+ "Action": "ReceiveMessage"
54
+ },
55
+ "env": {
56
+ "path": "/*/takeuchitest"
57
+ },
58
+ "expectations": [
59
+ {
60
+ "type": "response_code",
61
+ "value": 200
62
+ }
63
+ ]
64
+ }]
65
+ ]]
66
+ ]]
@@ -1,10 +1,12 @@
1
1
  require 'barthes/cache'
2
+ require 'barthes/client/httparty'
3
+ require 'chronic'
2
4
 
3
5
  module Barthes
4
6
  class Action
5
7
  def initialize(env)
6
8
  @env = env.dup
7
- client_class = Object.const_get(@env['client_class'])
9
+ client_class = @env['client_class'] ? @env['client_class'].constantize : Barthes::Client::HTTParty
8
10
  @client = client_class.new(env)
9
11
  end
10
12
 
@@ -73,7 +75,8 @@ module Barthes
73
75
  new_params = {}
74
76
  params.each do |k, v|
75
77
  if v.class == String
76
- new_v = v.gsub(/\$\{(.+?)\}/) { @env[$1] }
78
+ new_v = v.gsub(/\$\{time:(.+?):(.+?)\}/) { Chronic.parse($1).strftime($2) }
79
+ new_v = new_v.gsub(/\$\{(.+?)\}/) { @env[$1] }
77
80
  new_v = new_v.gsub(/\@\{(.+?)\}/) { Barthes::Cache[$1] }
78
81
  else
79
82
  new_v = v
data/lib/barthes/cli.rb CHANGED
@@ -11,7 +11,7 @@ module Barthes
11
11
  on 'e', 'env', 'environment file paths', argument: :optional, as: Array
12
12
  on 'q', 'quiet', 'not show test details', argument: :optional, as: :count
13
13
  on 'f', 'from', 'test number to start from', argument: :optional, as: Integer, default: 1
14
- on 't', 'to', 'test number to stop to', argument: :optional
14
+ on 't', 'to', 'test number to stop to', argument: :optional, as: Integer
15
15
  on 'l', 'load', 'An optional password', argument: :optional
16
16
  on 'd', 'dryrun', 'not run test but show just structure', argument: :optional, as: :count
17
17
  on 'c', 'cache', 'cache path', argument: :optional, default: './barthes-cache.json'
@@ -0,0 +1,56 @@
1
+ require 'httparty'
2
+ require 'nokogiri'
3
+
4
+ module Barthes
5
+ module Client
6
+ class HTTParty
7
+ include ::HTTParty
8
+
9
+ def initialize(env)
10
+ @env = env
11
+ end
12
+
13
+ def action(params)
14
+ url = @env['path'] ? @env['endpoint'] + @env['path'] : @env['endpoint']
15
+ self.class.post(url, query: params)
16
+ end
17
+
18
+ def compare(response, expectation)
19
+ result = nil
20
+ case expectation['type']
21
+ when 'response_code'
22
+ result = response.code == expectation['value']
23
+ {'result' => result, 'returned' => response.code, 'expected' => expectation['value']}
24
+ when 'xpath_value'
25
+ text = xpath(response, expectation['xpath']).text
26
+ if expectation['method'].nil? || expectation['method'] == 'eq'
27
+ result = (text == expectation['value'])
28
+ elsif expectation['method'] == 'regexp'
29
+ result = !(text.match Regexp.new(expectation['value'])).nil?
30
+ elsif expectation['method'] == 'ne'
31
+ result = (text != expectation['value'])
32
+ end
33
+ {'result' => result, 'returned' => text, 'expected' => expectation['value']}
34
+ when 'xpath_size'
35
+ size = xpath(response, expectation['xpath']).size
36
+ if expectation['method'].nil? || expectation['method'] == 'eq'
37
+ result = (size == expectation['value'])
38
+ elsif expectation['method'] == 'gt'
39
+ result = (size > expectation['value'])
40
+ end
41
+ {'result' => result, 'returned' => size, 'expected' => expectation['value']}
42
+ else
43
+ {'result' => true}
44
+ end
45
+ end
46
+
47
+ def extract(config, response)
48
+ end
49
+
50
+ def xpath(response, xpath)
51
+ doc = Nokogiri::XML response.body.gsub(/xmlns="(.+?)"/, '')
52
+ doc.xpath(xpath)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -9,19 +9,19 @@ module Barthes
9
9
  @opts = opts
10
10
  end
11
11
 
12
- def before_feature(num, name)
13
- puts "#{name} (##{num})"
12
+ def before_feature(name)
13
+ puts name
14
14
  end
15
15
 
16
- def before_scenario(num, name, scenario, scenarios)
17
- puts ("\t" * scenarios.size) + "#{name} (##{num})"
16
+ def before_scenario(name, scenario, scenarios)
17
+ puts ("\t" * scenarios.size) + name
18
18
  end
19
19
 
20
- def before_action(num, name, action, scenarios)
21
- puts ("\t" * scenarios.size) + "#{name} (##{num})"
20
+ def before_action(name, action, scenarios)
21
+ puts ("\t" * scenarios.size) + "##{action['number']} #{name}"
22
22
  end
23
23
 
24
- def after_action(num, name, action, scenarios)
24
+ def after_action(name, action, scenarios)
25
25
  if Barthes::Config[:quiet] == 0 && Barthes::Config[:dryrun] == 0
26
26
  puts indent scenarios.size + 1, "request:"
27
27
  puts indent scenarios.size + 2, JSON.pretty_generate(action['request'])
@@ -59,6 +59,31 @@ module Barthes
59
59
  ("\t" * num) + line
60
60
  end.join("\n")
61
61
  end
62
+
63
+ def after_run(features)
64
+ @count = Hash.new(0)
65
+ walk_json(features)
66
+ puts '-' * 80
67
+ puts [
68
+ "all: #{@count['all'].to_s }",
69
+ "success: #{@count['success'] > 0 ? green { @count['success'].to_s } : @count['success'].to_s }",
70
+ "failure: #{@count['failure'] > 0 ? red { @count['failure'].to_s } : @count['failure'].to_s }",
71
+ "error: #{@count['error'] > 0 ? red { @count['error'].to_s } : @count['error'].to_s }",
72
+ "skipped: #{@count['skipped'].to_s }"
73
+ ].join(", ")
74
+ end
75
+
76
+ def walk_json(obj)
77
+ case obj.first
78
+ when 'feature', 'scenario'
79
+ walk_json(obj.last)
80
+ when 'action'
81
+ @count['all'] += 1
82
+ @count[obj.last['status']] += 1
83
+ else
84
+ obj.each {|obj2| walk_json(obj2) }
85
+ end
86
+ end
62
87
  end
63
88
  end
64
89
  end
@@ -10,7 +10,8 @@ module Barthes
10
10
  Barthes::Config.update(options)
11
11
  load_cache
12
12
  load_libraries
13
- load_envs(options[:env])
13
+ @env = {}
14
+ load_envs(options[:env]) if options[:env]
14
15
  @reporter = Reporter.new
15
16
  end
16
17
 
@@ -26,7 +27,6 @@ module Barthes
26
27
  end
27
28
 
28
29
  def load_envs(env_paths)
29
- @env = {}
30
30
  env_paths.each do |path|
31
31
  @env.update JSON.parse File.read(path)
32
32
  end
@@ -55,8 +55,7 @@ module Barthes
55
55
  @num = 1
56
56
  files.each do |file|
57
57
  json = JSON.parse File.read(file)
58
- @reporter.report(:feature, @num, json[1]) do
59
- @num += 1
58
+ @reporter.report(:feature, json[1]) do
60
59
  walk_json(json.last, [file])
61
60
  results << json
62
61
  json
@@ -71,7 +70,7 @@ module Barthes
71
70
 
72
71
  def in_range?
73
72
  flag = @num >= Barthes::Config[:from]
74
- flag = flag && (@num >= Barthes::Config[:to]) if Barthes::Config[:to]
73
+ flag = flag && (@num <= Barthes::Config[:to]) if Barthes::Config[:to]
75
74
  flag
76
75
  end
77
76
 
@@ -80,11 +79,12 @@ module Barthes
80
79
  case json.first
81
80
  when 'scenario'
82
81
  handle_scenario(json, scenarios)
83
- @num += 1
84
82
  scenarios.push(json.first)
85
83
  walk_json(json.last, scenarios)
86
84
  scenarios.pop
87
85
  when 'action'
86
+ json.last['status'] = 'skipped' if Barthes::Config[:dryrun] > 0
87
+ json.last['number'] = @num
88
88
  handle_action(json, scenarios) if in_range?
89
89
  @num += 1
90
90
  else
@@ -97,7 +97,7 @@ module Barthes
97
97
 
98
98
  def handle_scenario(scenario, scenarios)
99
99
  return if @failed
100
- @reporter.report(:scenario, @num, scenario[1], scenario.last, scenarios) do
100
+ @reporter.report(:scenario, scenario[1], scenario.last, scenarios) do
101
101
  scenario.last
102
102
  end
103
103
  end
@@ -107,13 +107,11 @@ module Barthes
107
107
  name, content = action[1], action.last
108
108
  env = @env.dup
109
109
  env.update(content['env']) if content['env']
110
- @reporter.report(:action, @num, name, action.last, scenarios) do
111
- content['number'] = @num
110
+ @reporter.report(:action, name, action.last, scenarios) do
112
111
  if Barthes::Config[:dryrun] == 0 && !@failed
113
112
  content = Action.new(env).action(content)
114
113
  @failed = true if %w(failure error).include?(content['status'])
115
114
  end
116
- content['status'] = 'skipped' if Barthes::Config[:dryrun] > 0
117
115
  content
118
116
  end
119
117
  end
@@ -1,3 +1,3 @@
1
1
  module Barthes
2
- VERSION = "0.0.13"
2
+ VERSION = "0.0.14"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: barthes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-11-04 00:00:00.000000000 Z
12
+ date: 2014-11-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -139,6 +139,38 @@ dependencies:
139
139
  - - ! '>='
140
140
  - !ruby/object:Gem::Version
141
141
  version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: chronic
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: httparty
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
142
174
  description: lightweight scenario test framework
143
175
  email:
144
176
  - tily05@gmail.com
@@ -155,10 +187,13 @@ files:
155
187
  - Rakefile
156
188
  - barthes.gemspec
157
189
  - bin/barthes
190
+ - example/q3_env.json
191
+ - example/q3_spec.json
158
192
  - lib/barthes.rb
159
193
  - lib/barthes/action.rb
160
194
  - lib/barthes/cache.rb
161
195
  - lib/barthes/cli.rb
196
+ - lib/barthes/client/httparty.rb
162
197
  - lib/barthes/config.rb
163
198
  - lib/barthes/reporter.rb
164
199
  - lib/barthes/reporter/default.rb