airborne_report 0.1.0 → 0.2.0

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: 341027d5bc0c0b14f5909a55dd9ace77581024d6
4
- data.tar.gz: a770921562e20a30f7872d40e83fd3e9fd61f352
3
+ metadata.gz: ed1c7456a4dd13090a4dae8e93b9f9a59ae4d36e
4
+ data.tar.gz: 9539721512253d96189ec9b90c7c77cd1d8bca4f
5
5
  SHA512:
6
- metadata.gz: 8133f68adb5098ca288636bfa374a2dd477753c5e19c64e516766125e680485b39bd41733e47419cfef9de770995ed3b3540b9b51cb56627bcb7a57d4661e8cc
7
- data.tar.gz: 4b9ee896cb80975d0183d6f917955188e1eb0b16671a65be2ff9c16e28a9be14543dc6c127502381e146b7746cca5a4633c0fc97d0e7eb142aa61ffe14949b3a
6
+ metadata.gz: 98a06ab9ea2344fa44e1d15bed80a72d7b756264b5ac1e36a1204a4dddab66fa58ac678e0e2a177388bb453fb6cf79cea89aaf1550879380ab2b893b5912c295
7
+ data.tar.gz: 8209349b2f1406fb7c2109e732291d4358b6d2902b5ee4c7f733abc4987d72bfb3db1e9c43465e52d80f13eadd74dc907ecfa7a96a4e1a04129c97aa50545335
data/.gitignore CHANGED
@@ -11,4 +11,3 @@
11
11
  report.html
12
12
  report.json
13
13
  .byebug_history
14
- storage.json
data/README.md CHANGED
@@ -22,7 +22,7 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- ```
25
+ ```ruby
26
26
  # spec/spec_helper.rb
27
27
  require 'airborne_report'
28
28
  ```
@@ -29,4 +29,6 @@ Gem::Specification.new do |spec|
29
29
  spec.add_development_dependency 'bundler'
30
30
  spec.add_development_dependency 'rake'
31
31
  spec.add_development_dependency 'rspec'
32
+ spec.add_development_dependency 'simplecov'
33
+ spec.add_development_dependency 'byebug'
32
34
  end
@@ -1,5 +1,6 @@
1
1
  require 'airborne_report/version'
2
2
  require 'airborne_report/message'
3
+ require 'airborne_report/storage/tests'
3
4
 
4
5
  module AirborneReport
5
6
  end
@@ -29,18 +30,14 @@ module Airborne
29
30
 
30
31
  def full_save(response)
31
32
  request = response.request
32
- AirborneReport::JsonFile.push(
33
- location,
34
- AirborneReport::Message.full(request, response).to_hash
35
- )
33
+ AirborneReport::Storage::Tests.find_or_create(location)
34
+ .push(AirborneReport::Message.full(request, response).to_hash)
36
35
  end
37
36
 
38
37
  def wasted_save(args, response)
39
38
  url = get_url(args[1])
40
- AirborneReport::JsonFile.push(
41
- location,
42
- AirborneReport::Message.wasted(args, response, url).to_hash
43
- )
39
+ AirborneReport::Storage::Tests.find_or_create(location)
40
+ .push(AirborneReport::Message.wasted(args, response, url).to_hash)
44
41
  end
45
42
 
46
43
  def location
@@ -1,5 +1,4 @@
1
1
  require 'multi_json'
2
- require 'airborne_report/json_file'
3
2
 
4
3
  module AirborneReport
5
4
  class Message
@@ -10,30 +9,36 @@ module AirborneReport
10
9
  def self.full(request, response)
11
10
  new(
12
11
  'time' => Time.now,
13
- 'request' => {
14
- 'method' => request.method,
15
- 'url' => request.url,
16
- 'headers' => request.headers,
17
- 'body' => request.args
18
- },
19
12
  'response' => {
20
13
  'headers' => response.headers,
21
- 'body' => MultiJson.load(response)
14
+ 'body' => load_response(response),
15
+ 'request' => {
16
+ 'method' => request.method,
17
+ 'url' => request.url,
18
+ 'headers' => request.headers,
19
+ 'body' => request.args[:payload]
20
+ }
22
21
  }
23
22
  )
24
23
  end
25
24
 
25
+ def self.load_response(response)
26
+ MultiJson.load(response)
27
+ rescue MultiJson::ParseError
28
+ response
29
+ end
30
+
26
31
  def self.wasted(args, response, url)
27
32
  new(
28
33
  'time' => Time.now,
29
- 'request' => {
30
- 'method' => args[0],
31
- 'url' => url,
32
- 'headers' => args[2][:headers],
33
- 'body' => args[2][:body]
34
- },
35
34
  'response' => {
36
- 'body' => response
35
+ 'body' => response,
36
+ 'request' => {
37
+ 'method' => args[0],
38
+ 'url' => url,
39
+ 'headers' => args[2][:headers],
40
+ 'body' => args[2][:body]
41
+ }
37
42
  }
38
43
  )
39
44
  end
@@ -11,7 +11,18 @@ module AirborneReport
11
11
 
12
12
  notification.examples.map do |example|
13
13
  location = example.metadata[:location]
14
- after_json[location] = craft_example(before_json, location, example)
14
+
15
+ hash = {}
16
+ e = example.exception
17
+ if e
18
+ hash['exception'] = {
19
+ 'class' => e.class.name,
20
+ 'message' => e.message,
21
+ 'backtrace' => e.backtrace,
22
+ }
23
+ end
24
+
25
+ after_json[location] = craft_example(before_json, location, example).merge(hash)
15
26
  statuses = increment_statuses(statuses, example)
16
27
  end
17
28
 
@@ -35,7 +46,7 @@ module AirborneReport
35
46
 
36
47
  def craft_example(before_json, location, example)
37
48
  if before_json[location]
38
- Message.extra(example).to_hash.merge(before_json[location])
49
+ Message.extra(example).to_hash.merge('responses' => before_json[location])
39
50
  else
40
51
  Message.extra(example).to_hash
41
52
  end
@@ -1,19 +1,14 @@
1
1
  require 'rspec/core/formatters/base_formatter'
2
2
  require 'haml'
3
- require 'airborne_report/json_file'
4
3
  require 'airborne_report/report'
4
+ require 'airborne_report/storage/tests'
5
5
 
6
6
  module AirborneReport
7
7
  class RspecHtmlFormatter < RSpec::Core::Formatters::BaseFormatter
8
- RSpec::Core::Formatters.register self, :start, :stop
9
-
10
- def start(_notification)
11
- AirborneReport::JsonFile.save(Report.blank)
12
- end
8
+ RSpec::Core::Formatters.register self, :stop
13
9
 
14
10
  def stop(notification)
15
- tests = AirborneReport::JsonFile.tests
16
- AirborneReport::JsonFile.destroy
11
+ tests = AirborneReport::Storage::Tests.all
17
12
 
18
13
  report = Report.new(tests, notification).to_hash
19
14
  craft_html(report)
@@ -1,19 +1,14 @@
1
1
  require 'rspec/core/formatters/base_formatter'
2
2
  require 'multi_json'
3
- require 'airborne_report/json_file'
4
3
  require 'airborne_report/report'
4
+ require 'airborne_report/storage/tests'
5
5
 
6
6
  module AirborneReport
7
7
  class RspecJsonFormatter < RSpec::Core::Formatters::BaseFormatter
8
- RSpec::Core::Formatters.register self, :start, :stop
9
-
10
- def start(_notification)
11
- AirborneReport::JsonFile.save(Report.blank)
12
- end
8
+ RSpec::Core::Formatters.register self, :stop
13
9
 
14
10
  def stop(notification)
15
- tests = AirborneReport::JsonFile.tests
16
- AirborneReport::JsonFile.destroy
11
+ tests = AirborneReport::Storage::Tests.all
17
12
 
18
13
  report = Report.new(tests, notification).to_hash
19
14
  craft_json(report)
@@ -0,0 +1,20 @@
1
+ module AirborneReport
2
+ module Storage
3
+ module Tests
4
+ class << self
5
+ def find_or_create(location)
6
+ @tests ||= {}
7
+ unless @tests[location]
8
+ @tests[location] = []
9
+ end
10
+ @tests[location]
11
+ end
12
+
13
+ def all
14
+ @tests ||= {}
15
+ @tests
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,3 +1,3 @@
1
1
  module AirborneReport
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
@@ -21,63 +21,56 @@
21
21
  %details
22
22
  %summary{class: "collapse #{example.last['status']}"}
23
23
  = example.last['full_description']
24
- %div
24
+ %div{class: 'group'}
25
25
  %div{class: 'section'}
26
- - if example.last['request'] && example.last['response']['body']
27
26
  %div
28
27
  %b path:
29
28
  = example.first
30
- %div
31
- %b time:
32
- = example.last['time']
33
- %div{class: 'section'}
34
- %div
35
- %b request.method:
36
- = example.last['request']['method']
37
- %div
38
- %b request.url:
39
- = example.last['request']['url']
40
- %div
41
- %b request.headers:
42
- = example.last['request']['headers']
43
- %div
44
- %b request.body:
45
- %xmp
46
- = example.last['request']['body']
47
- %div{class: 'section'}
48
- %div
49
- %b response.headers:
50
- = example.last['response']['headers']
51
- %div
52
- %b response.body:
53
- %xmp
54
- = example.last['response']['body']
55
- - elsif example.last['request']
56
- %div
57
- %b path:
58
- = example.first
59
- %div{class: 'section'}
29
+
30
+ - if example.last['responses']
31
+ - example.last['responses'].each do |response|
32
+ %div{class: 'group'}
33
+ - if response['response'] && response['response']['request']
34
+ %div{class: 'section'}
35
+ %div
36
+ %b request.time:
37
+ = response['time']
38
+ %div
39
+ %b request.method:
40
+ = response['response']['request']['method']
41
+ %div
42
+ %b request.url:
43
+ = response['response']['request']['url']
44
+ %div
45
+ %b request.headers:
46
+ = response['response']['request']['headers']
47
+ %div
48
+ %b request.body:
49
+ %xmp
50
+ =response['response']['request']['body']
51
+ - if response['response']
52
+ %div{class: 'section'}
53
+ %div
54
+ %b response.headers:
55
+ = response['response']['headers']
56
+ %div
57
+ %b response.body:
58
+ %xmp
59
+ = response['response']['body']
60
+
61
+ - if example.last['exception']
62
+
63
+ %details
64
+ %summary{class: "collapse"}
65
+ = 'exception'
60
66
  %div
61
- %b request.method:
62
- = example.last['request']['method']
63
- %div
64
- %b request.url:
65
- = example.last['request']['url']
66
- %div
67
- %b request.headers:
68
- = example.last['request']['headers']
69
- %div
70
- %b request.body:
71
- = example.last['request']['body']
72
- %div{class: 'section'}
73
- %div
74
- Request failed
75
- - elsif example.last['status'] == 'pending'
76
- %div
77
- %b path:
78
- = example.first
79
- - else
80
- %div
81
- %b path:
82
- = example.first
83
- Test failed
67
+ %div{class: 'group section'}
68
+ %div
69
+ %b exception.class:
70
+ = example.last['exception']['class']
71
+ %div
72
+ %b exception.message:
73
+ = example.last['exception']['message']
74
+ %div
75
+ %b exception.backtrace:
76
+ = example.last['exception']['backtrace']
@@ -39,3 +39,9 @@ summary:hover {
39
39
  .section {
40
40
  padding-top: 10px;
41
41
  }
42
+
43
+ .group {
44
+ border: 1px solid black;
45
+ margin: 5px 0px;
46
+ padding: 0px 5px;
47
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airborne_report
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Efimov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-25 00:00:00.000000000 Z
11
+ date: 2017-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: airborne
@@ -94,6 +94,34 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
97
125
  description: This gem gives you RSpec formatters which let you generate HTML and JSON
98
126
  reports if you use the airborne gem for your integration tests.
99
127
  email:
@@ -112,11 +140,11 @@ files:
112
140
  - bin/console
113
141
  - bin/setup
114
142
  - lib/airborne_report.rb
115
- - lib/airborne_report/json_file.rb
116
143
  - lib/airborne_report/message.rb
117
144
  - lib/airborne_report/report.rb
118
145
  - lib/airborne_report/rspec_html_formatter.rb
119
146
  - lib/airborne_report/rspec_json_formatter.rb
147
+ - lib/airborne_report/storage/tests.rb
120
148
  - lib/airborne_report/version.rb
121
149
  - lib/airborne_report/view/report.html.haml
122
150
  - lib/airborne_report/view/style.css
@@ -1,25 +0,0 @@
1
- require 'multi_json'
2
-
3
- module AirborneReport
4
- class JsonFile
5
- NAME = 'storage.json'.freeze
6
-
7
- def self.save(json)
8
- File.open(NAME, 'w') do |file|
9
- file.write(MultiJson.dump(json))
10
- end
11
- end
12
-
13
- def self.push(key, value)
14
- save('tests' => tests.merge(key => value))
15
- end
16
-
17
- def self.tests
18
- MultiJson.load(File.read(NAME))['tests']
19
- end
20
-
21
- def self.destroy
22
- File.delete(NAME)
23
- end
24
- end
25
- end