startback 0.4.5 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/startback/audit/trailer.rb +145 -0
- data/lib/startback/audit.rb +1 -0
- data/lib/startback/bus/bunny/async.rb +117 -0
- data/lib/startback/bus/bunny.rb +1 -0
- data/lib/startback/bus/memory/async.rb +40 -0
- data/lib/startback/bus/memory/sync.rb +30 -0
- data/lib/startback/bus/memory.rb +2 -0
- data/lib/startback/bus.rb +94 -0
- data/lib/startback/caching/entity_cache.rb +80 -0
- data/lib/startback/caching/store.rb +34 -0
- data/lib/startback/context/middleware.rb +1 -1
- data/lib/startback/context.rb +93 -4
- data/lib/startback/event.rb +43 -0
- data/lib/startback/operation.rb +39 -6
- data/lib/startback/support/fake_logger.rb +18 -0
- data/lib/startback/support/hooks.rb +48 -0
- data/lib/startback/support/operation_runner.rb +150 -0
- data/lib/startback/support/robustness.rb +153 -0
- data/lib/startback/support.rb +3 -0
- data/lib/startback/version.rb +2 -2
- data/lib/startback/web/api.rb +3 -4
- data/lib/startback/web/catch_all.rb +12 -5
- data/lib/startback/web/middleware.rb +13 -0
- data/lib/startback.rb +2 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/unit/audit/test_trailer.rb +88 -0
- data/spec/unit/bus/memory/test_async.rb +41 -0
- data/spec/unit/bus/memory/test_sync.rb +41 -0
- data/spec/unit/caching/test_entity_cache.rb +109 -0
- data/spec/unit/context/test_abstraction_factory.rb +64 -0
- data/spec/unit/support/hooks/test_after_hook.rb +54 -0
- data/spec/unit/support/hooks/test_before_hook.rb +54 -0
- data/spec/unit/support/operation_runner/test_around_run.rb +157 -0
- data/spec/unit/support/operation_runner/test_before_after_call.rb +48 -0
- data/spec/unit/support/test_robusteness.rb +209 -0
- data/spec/unit/test_context.rb +51 -0
- data/spec/unit/test_event.rb +69 -0
- data/spec/unit/test_operation.rb +0 -3
- metadata +32 -4
@@ -0,0 +1,209 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Startback
|
3
|
+
module Support
|
4
|
+
describe Robustness do
|
5
|
+
|
6
|
+
let(:the_logger) {
|
7
|
+
FakeLogger.new
|
8
|
+
}
|
9
|
+
|
10
|
+
let(:context_with_logger) {
|
11
|
+
Context.new.tap{|c| c.logger = the_logger }
|
12
|
+
}
|
13
|
+
|
14
|
+
describe "monitor" do
|
15
|
+
include Robustness
|
16
|
+
|
17
|
+
it 'works' do
|
18
|
+
x = monitor("test", context_with_logger) do
|
19
|
+
12
|
20
|
+
end
|
21
|
+
expect(x).to eql(12)
|
22
|
+
expect(the_logger.last_msg.keys).to eql([:op, :op_took])
|
23
|
+
end
|
24
|
+
|
25
|
+
end # monitor
|
26
|
+
|
27
|
+
describe "stop_errors" do
|
28
|
+
include Robustness
|
29
|
+
|
30
|
+
it 'works and logs the error' do
|
31
|
+
x = nil
|
32
|
+
expect {
|
33
|
+
x = stop_errors("test", context_with_logger) do
|
34
|
+
raise "Test"
|
35
|
+
end
|
36
|
+
}.not_to raise_error
|
37
|
+
expect(x).to be(nil)
|
38
|
+
expect(the_logger.last_msg.keys).to eql([:op, :op_took, :error])
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'returns the result if no error' do
|
42
|
+
x = nil
|
43
|
+
expect {
|
44
|
+
x = stop_errors("test", context_with_logger) do
|
45
|
+
12
|
46
|
+
end
|
47
|
+
}.not_to raise_error
|
48
|
+
expect(x).to eql(12)
|
49
|
+
expect(the_logger.last_msg).to be_nil
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "try_max_times" do
|
55
|
+
include Robustness
|
56
|
+
|
57
|
+
it 'fails if n errors are seen' do
|
58
|
+
seen = 0
|
59
|
+
expect {
|
60
|
+
try_max_times(2, "test", context_with_logger) do
|
61
|
+
seen += 1
|
62
|
+
raise "Test"
|
63
|
+
end
|
64
|
+
}.to raise_error
|
65
|
+
expect(seen).to eql(2)
|
66
|
+
expect(the_logger.last_msg.keys).to eql([:op, :op_took, :error])
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'suceeds if an attemps succeeds' do
|
70
|
+
seen = 0
|
71
|
+
result = nil
|
72
|
+
expect {
|
73
|
+
result = try_max_times(2, "test", context_with_logger) do
|
74
|
+
seen += 1
|
75
|
+
raise "Test" if seen == 1
|
76
|
+
12
|
77
|
+
end
|
78
|
+
}.not_to raise_error
|
79
|
+
expect(result).to eql(12)
|
80
|
+
expect(seen).to eql(2)
|
81
|
+
expect(the_logger.last_msg.keys).to eql([:op, :op_took, :error])
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'suceeds if first attemps succeeds' do
|
85
|
+
result = nil
|
86
|
+
expect {
|
87
|
+
result = try_max_times(2, "test", context_with_logger) do
|
88
|
+
12
|
89
|
+
end
|
90
|
+
}.not_to raise_error
|
91
|
+
expect(result).to eql(12)
|
92
|
+
expect(the_logger.last_msg).to be_nil
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "parse_args" do
|
98
|
+
include Robustness::Tools
|
99
|
+
|
100
|
+
it 'works fine with full op and no context' do
|
101
|
+
log_msg_src = {
|
102
|
+
op: "AnOp",
|
103
|
+
op_data: { foo: "bar" }
|
104
|
+
}
|
105
|
+
log_msg, logger = parse_args(log_msg_src)
|
106
|
+
expect(log_msg).to eql(log_msg_src)
|
107
|
+
expect(logger).to be_a(::Logger)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'works fine with an string and a method name' do
|
111
|
+
expected = {
|
112
|
+
op: "AClass#method"
|
113
|
+
}
|
114
|
+
log_msg, logger = parse_args("AClass", "method")
|
115
|
+
expect(log_msg).to eql(expected)
|
116
|
+
expect(logger).to be_a(::Logger)
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'works fine with a string only' do
|
120
|
+
expected = {
|
121
|
+
op: "a message"
|
122
|
+
}
|
123
|
+
log_msg, logger = parse_args("a message")
|
124
|
+
expect(log_msg).to eql(expected)
|
125
|
+
expect(logger).to be_a(::Logger)
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'works fine with a string and a context with logger' do
|
129
|
+
expected = {
|
130
|
+
op: "a message"
|
131
|
+
}
|
132
|
+
log_msg, logger = parse_args("a message", context_with_logger)
|
133
|
+
expect(log_msg).to eql(expected)
|
134
|
+
expect(logger).to be(the_logger)
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'works fine with a string and an extra hash' do
|
138
|
+
expected = {
|
139
|
+
op: "a message",
|
140
|
+
op_took: 16
|
141
|
+
}
|
142
|
+
log_msg, logger = parse_args("a message", op_took: 16)
|
143
|
+
expect(log_msg).to eql(expected)
|
144
|
+
expect(logger).to be_a(::Logger)
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'works fine with a module and method' do
|
148
|
+
expected = {
|
149
|
+
op: "Startback#foo"
|
150
|
+
}
|
151
|
+
log_msg, logger = parse_args(Startback, "foo")
|
152
|
+
expect(log_msg).to eql(expected)
|
153
|
+
expect(logger).to be_a(::Logger)
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'works fine with a class and method' do
|
157
|
+
expected = {
|
158
|
+
op: "Startback::Event#foo"
|
159
|
+
}
|
160
|
+
log_msg, logger = parse_args(Startback::Event, "foo")
|
161
|
+
expect(log_msg).to eql(expected)
|
162
|
+
expect(logger).to be_a(::Logger)
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'works fine with an instance and method' do
|
166
|
+
expected = {
|
167
|
+
op: "Startback::Event#foo"
|
168
|
+
}
|
169
|
+
log_msg, logger = parse_args(Startback::Event.new(nil, nil), "foo")
|
170
|
+
expect(log_msg).to eql(expected)
|
171
|
+
expect(logger).to be_a(::Logger)
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'when a hash is passed as last arg' do
|
175
|
+
expected = {
|
176
|
+
op: "hello#foo",
|
177
|
+
op_took: 16
|
178
|
+
}
|
179
|
+
log_msg, logger = parse_args("hello", "foo", op_took: 16)
|
180
|
+
expect(log_msg).to eql(expected)
|
181
|
+
expect(logger).to be_a(::Logger)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
describe "logger_for" do
|
186
|
+
include Robustness::Tools
|
187
|
+
|
188
|
+
it 'works on a logger' do
|
189
|
+
expect(logger_for(the_logger)).to be(the_logger)
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'works on a Context responding to logger' do
|
193
|
+
expect(logger_for(context_with_logger)).to be(the_logger)
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'works on an object having a Context responding to logger' do
|
197
|
+
x = OpenStruct.new(context: context_with_logger)
|
198
|
+
expect(logger_for(x)).to eql(the_logger)
|
199
|
+
end
|
200
|
+
|
201
|
+
it 'works on an object having a Context but no logger' do
|
202
|
+
x = OpenStruct.new(context: Context.new)
|
203
|
+
expect(logger_for(x)).to be_a(::Logger)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Startback
|
4
|
+
describe Context do
|
5
|
+
|
6
|
+
it "has a to_json that dumps it" do
|
7
|
+
expect(Context.new.to_json).to eql("{}")
|
8
|
+
end
|
9
|
+
|
10
|
+
class SubContext < Context
|
11
|
+
attr_accessor :foo
|
12
|
+
h_factory do |c,h|
|
13
|
+
c.foo = h["foo"]
|
14
|
+
end
|
15
|
+
h_dump do |h|
|
16
|
+
h.merge!("foo" => foo)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class SubContext
|
21
|
+
attr_accessor :bar
|
22
|
+
h_factory do |c,h|
|
23
|
+
c.bar = h["bar"]
|
24
|
+
end
|
25
|
+
h_dump do |h|
|
26
|
+
h.merge!("bar" => bar)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'allows installing factories' do
|
31
|
+
expect(Context.h_factories).to be_empty
|
32
|
+
expect(SubContext.h_factories.size).to eql(2)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'has a `to_h` information contract that works as expected' do
|
36
|
+
context = SubContext.new.tap{|c|
|
37
|
+
c.foo = "Hello"
|
38
|
+
c.bar = "World"
|
39
|
+
}
|
40
|
+
expect(context.to_h).to eql({ "foo" => "Hello", "bar" => "World" })
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'has a `h` information contract that works as expected' do
|
44
|
+
context = SubContext.h({ "foo" => "Hello", "bar" => "World" })
|
45
|
+
expect(context).to be_a(SubContext)
|
46
|
+
expect(context.foo).to eql("Hello")
|
47
|
+
expect(context.bar).to eql("World")
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Startback
|
4
|
+
describe Event do
|
5
|
+
|
6
|
+
subject{
|
7
|
+
Event.new("user_changed", { "foo" => "bar" })
|
8
|
+
}
|
9
|
+
|
10
|
+
it 'presents an ostruct on top of its data' do
|
11
|
+
expect(subject.data.foo).to eql("bar")
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "the json information contract" do
|
15
|
+
|
16
|
+
JSON_SRC = <<-JSON.gsub(/\s+/, "")
|
17
|
+
{
|
18
|
+
"type": "user_changed",
|
19
|
+
"data": {
|
20
|
+
"foo": "bar"
|
21
|
+
}
|
22
|
+
}
|
23
|
+
JSON
|
24
|
+
|
25
|
+
it 'has a to_json method that works as expected' do
|
26
|
+
expect(subject.to_json).to eql(JSON_SRC)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'has a to_json that dumps the context if any' do
|
30
|
+
evt = Event.new("user_changed", { "foo" => "bar" }, { "baz": "context" })
|
31
|
+
expect(evt.to_json).to eql(<<-JSON.gsub(/\s+/, ""))
|
32
|
+
{
|
33
|
+
"type": "user_changed",
|
34
|
+
"data": {
|
35
|
+
"foo": "bar"
|
36
|
+
},
|
37
|
+
"context": {
|
38
|
+
"baz": "context"
|
39
|
+
}
|
40
|
+
}
|
41
|
+
JSON
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
it 'has a json class method that works as expected' do
|
46
|
+
evt = Event.json(JSON_SRC)
|
47
|
+
expect(evt).to be_a(Event)
|
48
|
+
expect(evt.type).to eql("user_changed")
|
49
|
+
expect(evt.data).to eql(subject.data)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'accepts an explicit context in the world' do
|
53
|
+
evt = Event.json(JSON_SRC, context: 12)
|
54
|
+
expect(evt.context).to eql(12)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'accepts an context factory in the world' do
|
58
|
+
cf = ->(arg) {
|
59
|
+
expect(arg).to eql(JSON.parse(JSON_SRC))
|
60
|
+
12
|
61
|
+
}
|
62
|
+
evt = Event.json(JSON_SRC, context_factory: cf)
|
63
|
+
expect(evt.context).to eql(12)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end # module Startback
|
data/spec/unit/test_operation.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: startback
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernard Lambeau
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '0.
|
117
|
+
version: '0.7'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '0.
|
124
|
+
version: '0.7'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: path
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,9 +146,20 @@ files:
|
|
146
146
|
- README.md
|
147
147
|
- Rakefile
|
148
148
|
- lib/startback.rb
|
149
|
+
- lib/startback/audit.rb
|
150
|
+
- lib/startback/audit/trailer.rb
|
151
|
+
- lib/startback/bus.rb
|
152
|
+
- lib/startback/bus/bunny.rb
|
153
|
+
- lib/startback/bus/bunny/async.rb
|
154
|
+
- lib/startback/bus/memory.rb
|
155
|
+
- lib/startback/bus/memory/async.rb
|
156
|
+
- lib/startback/bus/memory/sync.rb
|
157
|
+
- lib/startback/caching/entity_cache.rb
|
158
|
+
- lib/startback/caching/store.rb
|
149
159
|
- lib/startback/context.rb
|
150
160
|
- lib/startback/context/middleware.rb
|
151
161
|
- lib/startback/errors.rb
|
162
|
+
- lib/startback/event.rb
|
152
163
|
- lib/startback/ext.rb
|
153
164
|
- lib/startback/ext/date_time.rb
|
154
165
|
- lib/startback/ext/time.rb
|
@@ -156,7 +167,11 @@ files:
|
|
156
167
|
- lib/startback/operation/error_operation.rb
|
157
168
|
- lib/startback/operation/multi_operation.rb
|
158
169
|
- lib/startback/support.rb
|
170
|
+
- lib/startback/support/fake_logger.rb
|
171
|
+
- lib/startback/support/hooks.rb
|
159
172
|
- lib/startback/support/logger.rb
|
173
|
+
- lib/startback/support/operation_runner.rb
|
174
|
+
- lib/startback/support/robustness.rb
|
160
175
|
- lib/startback/version.rb
|
161
176
|
- lib/startback/web/api.rb
|
162
177
|
- lib/startback/web/auto_caching.rb
|
@@ -166,9 +181,22 @@ files:
|
|
166
181
|
- lib/startback/web/magic_assets.rb
|
167
182
|
- lib/startback/web/magic_assets/ng_html_transformer.rb
|
168
183
|
- lib/startback/web/magic_assets/rake_tasks.rb
|
184
|
+
- lib/startback/web/middleware.rb
|
169
185
|
- lib/startback/web/shield.rb
|
170
186
|
- spec/spec_helper.rb
|
187
|
+
- spec/unit/audit/test_trailer.rb
|
188
|
+
- spec/unit/bus/memory/test_async.rb
|
189
|
+
- spec/unit/bus/memory/test_sync.rb
|
190
|
+
- spec/unit/caching/test_entity_cache.rb
|
191
|
+
- spec/unit/context/test_abstraction_factory.rb
|
171
192
|
- spec/unit/context/test_middleware.rb
|
193
|
+
- spec/unit/support/hooks/test_after_hook.rb
|
194
|
+
- spec/unit/support/hooks/test_before_hook.rb
|
195
|
+
- spec/unit/support/operation_runner/test_around_run.rb
|
196
|
+
- spec/unit/support/operation_runner/test_before_after_call.rb
|
197
|
+
- spec/unit/support/test_robusteness.rb
|
198
|
+
- spec/unit/test_context.rb
|
199
|
+
- spec/unit/test_event.rb
|
172
200
|
- spec/unit/test_operation.rb
|
173
201
|
- spec/unit/test_support.rb
|
174
202
|
- spec/unit/web/fixtures/assets/app/hello.es6
|