kapnismology 1.12.0 → 2.0.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 +4 -4
- data/README.md +45 -22
- data/app/controllers/kapnismology/smoke_tests_controller.rb +17 -1
- data/lib/kapnismology/evaluation.rb +1 -1
- data/lib/kapnismology/result.rb +22 -20
- data/lib/kapnismology/smoke_test.rb +1 -3
- data/lib/kapnismology/spec_helper.rb +2 -2
- data/lib/kapnismology/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1cbf3d487a4c5443e4d4cb4fd5cc77f432ed4954
|
4
|
+
data.tar.gz: 1e5c71a2f44f9da570c420ead7ff56e1b2445a4b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cacad590a7220d64e4194abf8eefa561a550ec5d1d37fd08215ec4795f7e413acba81edd2ce7bb91db2d589f4f07d5ee89c5613a1dc1250769655d032b0bce2
|
7
|
+
data.tar.gz: e011b97bd0d5f35db1fa08bd37e57db69ef7c29097deef445e7e54c31a13d5a57d71045dc010a427d2f6ba03256b9e2575b5b4c519e9d063eb344ec04e52b16d
|
data/README.md
CHANGED
@@ -5,13 +5,13 @@ Kapnismology 'the study of smoke', is a gem containing a Rails engine to easily
|
|
5
5
|
## Installation
|
6
6
|
|
7
7
|
In the Gemfile write:
|
8
|
-
```
|
8
|
+
```ruby
|
9
9
|
gem 'kapnismology', '~> 1.7'
|
10
10
|
```
|
11
11
|
|
12
12
|
In your config/routes write:
|
13
13
|
|
14
|
-
```
|
14
|
+
```ruby
|
15
15
|
Kapnismology::Routes.insert!('/smoke_test')
|
16
16
|
```
|
17
17
|
|
@@ -19,11 +19,48 @@ In your config/routes write:
|
|
19
19
|
|
20
20
|
Access the path '/smoke_test' to see the results of the smoke_test
|
21
21
|
|
22
|
+
## Smoke test output format
|
23
|
+
|
24
|
+
The output of the /smoke_test path is a Hypermedia document.
|
25
|
+
|
26
|
+
Sample:
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
{
|
30
|
+
"_links": {
|
31
|
+
"self": "https://www.example.org/smoke_test?tags=runtime",
|
32
|
+
"profile": "http://tbd.mdsol.com"
|
33
|
+
},
|
34
|
+
"passed": false,
|
35
|
+
"count": 2,
|
36
|
+
"trace_id": "d93abb9f-e0a2-467b-902f-b78069167e8f",
|
37
|
+
"items": [
|
38
|
+
{
|
39
|
+
"name": "database_smoke_test",
|
40
|
+
"passed": true,
|
41
|
+
"message": "The database is connected and responding correctly.",
|
42
|
+
"data": {
|
43
|
+
"database_name": "Polybus"
|
44
|
+
}
|
45
|
+
},
|
46
|
+
{
|
47
|
+
"name": "api_smoke_test",
|
48
|
+
"passed": false,
|
49
|
+
"message": "Api failed to respond correctly.",
|
50
|
+
"data": {
|
51
|
+
"exception": "name of exception class (StandardError, NoMethodError)",
|
52
|
+
"message": "exception message",
|
53
|
+
"stack": ["array of strings", "containing the backtrace","one string per backtrace entry"]
|
54
|
+
}
|
55
|
+
}
|
56
|
+
]
|
57
|
+
}
|
58
|
+
```
|
22
59
|
|
23
60
|
## Adding more smoke tests
|
24
61
|
|
25
62
|
Create a class like this:
|
26
|
-
```
|
63
|
+
```ruby
|
27
64
|
class MySmokeTest < Kapnismology::SmokeTest
|
28
65
|
|
29
66
|
def result
|
@@ -47,8 +84,8 @@ A test fails if it returns:
|
|
47
84
|
|
48
85
|
Any class created this way will be called and its result will be merged with other results.
|
49
86
|
In the example above the result of this class would be added to the results as:
|
50
|
-
```
|
51
|
-
{'
|
87
|
+
```ruby
|
88
|
+
{ name: 'my_smoke_test', passed: true, data: { connection: 'good' }, message: 'Connected!' }
|
52
89
|
```
|
53
90
|
|
54
91
|
## Loading tests
|
@@ -74,24 +111,10 @@ end
|
|
74
111
|
|
75
112
|
Will produce:
|
76
113
|
```ruby
|
77
|
-
{'
|
78
|
-
|
79
|
-
```
|
114
|
+
{ name: 'database smoke test', passed: true, data: { connection: 'good' }, message: 'Connected!' }
|
80
115
|
|
81
|
-
## Not runnable tests
|
82
|
-
|
83
|
-
If your check finds a situation when it does not make sense to test, you can return a `InfoResult` instead of a `Result`. Like:
|
84
|
-
```ruby
|
85
|
-
if (File.exist?('necessary file'))
|
86
|
-
Result.new(....)
|
87
|
-
else
|
88
|
-
InfoResult.new({}, 'There is no need to run this test')
|
89
|
-
end
|
90
116
|
```
|
91
117
|
|
92
|
-
Be very careful of not returning InfoResult when you should be returning a failing Result.
|
93
|
-
|
94
|
-
|
95
118
|
## Tagging and running tags
|
96
119
|
|
97
120
|
All smoke tests are tagged by default with 'deployment' and 'runtime'.
|
@@ -147,7 +170,7 @@ For instance:
|
|
147
170
|
|
148
171
|
Hopefully Kapnismology is flexible enough so you can code your smoke test as you prefer, our recommended style is this:
|
149
172
|
|
150
|
-
```
|
173
|
+
```ruby
|
151
174
|
def result
|
152
175
|
user = user_from_remote
|
153
176
|
puts_to_result('User successfully retrieved')
|
@@ -178,7 +201,7 @@ You can pass your own data to SmokeTestFailed or you can pass an exception which
|
|
178
201
|
|
179
202
|
There is a Kapnismology::SpecHelper which can be useful when running your tests.
|
180
203
|
Usage:
|
181
|
-
```
|
204
|
+
```ruby
|
182
205
|
RSpec.describe DatabaseSmokeTest do
|
183
206
|
let(:result) { Kapnismology::SpecHelper.result_for(described_class.new) }
|
184
207
|
...
|
@@ -2,9 +2,11 @@ module Kapnismology
|
|
2
2
|
# This is called when the user goes to the /smoke_test URL. This calls all the
|
3
3
|
# smoke tests registered in the application and gather the results
|
4
4
|
class SmokeTestsController < ApplicationController
|
5
|
+
PROFILE_URL = 'http://tbd.mdsol.com'.freeze
|
6
|
+
|
5
7
|
def index
|
6
8
|
evaluations = SmokeTestCollection.evaluations(allowed_tags, blacklist)
|
7
|
-
render json: evaluations.to_json, status: status(evaluations)
|
9
|
+
render json: results(evaluations).to_json, status: status(evaluations)
|
8
10
|
end
|
9
11
|
|
10
12
|
private
|
@@ -24,5 +26,19 @@ module Kapnismology
|
|
24
26
|
:service_unavailable
|
25
27
|
end
|
26
28
|
end
|
29
|
+
|
30
|
+
def results(evaluations)
|
31
|
+
items = evaluations.as_json.select { |e| e.has_key?(:passed) }
|
32
|
+
{
|
33
|
+
_links: {
|
34
|
+
self: CGI.unescape(request.original_url),
|
35
|
+
profile: PROFILE_URL
|
36
|
+
},
|
37
|
+
passed: evaluations.passed?,
|
38
|
+
count: items.size,
|
39
|
+
trace_id: Object.const_defined?(:Trace) ? Trace.id.trace_id.to_s : nil,
|
40
|
+
items: items
|
41
|
+
}
|
42
|
+
end
|
27
43
|
end
|
28
44
|
end
|
data/lib/kapnismology/result.rb
CHANGED
@@ -3,21 +3,21 @@ module Kapnismology
|
|
3
3
|
# It is useful to be able to test if the object is of a correct result type.
|
4
4
|
# It also have methods to add information and serialize it.
|
5
5
|
class BaseResult
|
6
|
-
attr_reader :data, :message, :
|
6
|
+
attr_reader :data, :message, :debug_messages
|
7
7
|
def to_hash
|
8
|
-
{ passed: passed?, data: @data, message: @message,
|
8
|
+
{ passed: passed?, data: @data, message: @message, debug_messages: @debug_messages }
|
9
9
|
end
|
10
10
|
|
11
11
|
def to_s(name)
|
12
12
|
<<-eos
|
13
13
|
#{format_passed(passed?)}: #{name}
|
14
|
-
#{
|
14
|
+
#{format_debug_messages(@debug_messages)}#{Terminal.bold(@message)}
|
15
15
|
#{@data}
|
16
16
|
eos
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
@
|
19
|
+
def add_debug_messages(messages)
|
20
|
+
@debug_messages = (messages || []).compact.flatten
|
21
21
|
self
|
22
22
|
end
|
23
23
|
|
@@ -27,11 +27,11 @@ eos
|
|
27
27
|
|
28
28
|
private
|
29
29
|
|
30
|
-
def
|
31
|
-
if
|
30
|
+
def format_debug_messages(debug_messages)
|
31
|
+
if debug_messages.empty?
|
32
32
|
''
|
33
33
|
else
|
34
|
-
|
34
|
+
debug_messages.join("\n") + "\n"
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -52,23 +52,29 @@ eos
|
|
52
52
|
@passed = passed
|
53
53
|
@data = data
|
54
54
|
@message = message
|
55
|
-
@
|
55
|
+
@debug_messages = []
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
#
|
60
|
-
|
61
|
-
class InfoResult < BaseResult
|
59
|
+
# Deprecated NullResult class provided for compatibility.
|
60
|
+
class NullResult < BaseResult
|
62
61
|
def initialize(data, message = 'The result could not be determined')
|
63
62
|
@passed = true
|
64
63
|
@data = data
|
65
64
|
@message = message
|
66
|
-
@
|
65
|
+
@debug_messages = []
|
67
66
|
end
|
68
67
|
|
69
|
-
|
68
|
+
def to_s(name)
|
69
|
+
<<-eos
|
70
|
+
#{Terminal.yellow('This test can not be run. Skipping...')}
|
71
|
+
#{super(name).chomp}
|
72
|
+
eos
|
73
|
+
end
|
74
|
+
|
75
|
+
# Nullresult does not output any data.
|
70
76
|
def to_hash
|
71
|
-
{
|
77
|
+
{}
|
72
78
|
end
|
73
79
|
|
74
80
|
private
|
@@ -78,10 +84,6 @@ eos
|
|
78
84
|
end
|
79
85
|
end
|
80
86
|
|
81
|
-
# Deprecated NullResult class provided for compatibility.
|
82
|
-
class NullResult < InfoResult
|
83
|
-
end
|
84
|
-
|
85
87
|
class NotApplicableResult < BaseResult
|
86
88
|
end
|
87
89
|
|
@@ -92,7 +94,7 @@ eos
|
|
92
94
|
@passed = true
|
93
95
|
@data = data
|
94
96
|
@message = message
|
95
|
-
@
|
97
|
+
@debug_messages = []
|
96
98
|
end
|
97
99
|
end
|
98
100
|
end
|
@@ -32,7 +32,7 @@ module Kapnismology
|
|
32
32
|
message = "Unrescued error happened in #{self.class}"
|
33
33
|
result_object = Result.new(false, { exception: e.class, message: e.message }, message)
|
34
34
|
ensure
|
35
|
-
return result_object.
|
35
|
+
return result_object.add_debug_messages(@all_result_messages)
|
36
36
|
end
|
37
37
|
|
38
38
|
class << self
|
@@ -59,8 +59,6 @@ module Kapnismology
|
|
59
59
|
# These classes makes it very simple to implementors of results to use them without the module name
|
60
60
|
class Result < Kapnismology::Result
|
61
61
|
end
|
62
|
-
class InfoResult < Kapnismology::InfoResult
|
63
|
-
end
|
64
62
|
class NullResult < Kapnismology::NullResult
|
65
63
|
end
|
66
64
|
class Success < Kapnismology::Success
|
@@ -2,13 +2,13 @@ require 'kapnismology/result'
|
|
2
2
|
|
3
3
|
module Kapnismology
|
4
4
|
class RSpecResult < BaseResult
|
5
|
-
attr_reader :data, :message, :
|
5
|
+
attr_reader :data, :message, :debug_messages
|
6
6
|
def initialize(result)
|
7
7
|
hash = result.to_hash
|
8
8
|
@data = hash[:data]
|
9
9
|
@message = hash[:message]
|
10
10
|
@passed = hash[:passed]
|
11
|
-
@
|
11
|
+
@debug_messages = hash[:debug_messages]
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
data/lib/kapnismology/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kapnismology
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordi Polo Carres
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|