gecko-ess 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/.rspec +1 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +91 -0
- data/Rakefile +2 -0
- data/gecko.gemspec +29 -0
- data/lib/gecko.rb +22 -0
- data/lib/gecko/configurator.rb +11 -0
- data/lib/gecko/graph/funnel.rb +67 -0
- data/lib/gecko/graph/geckometer.rb +39 -0
- data/lib/gecko/graph/line.rb +64 -0
- data/lib/gecko/graph/pie.rb +49 -0
- data/lib/gecko/http.rb +79 -0
- data/lib/gecko/version.rb +3 -0
- data/lib/gecko/widget.rb +75 -0
- data/lib/gecko/widget/number_secondary_stat.rb +23 -0
- data/lib/gecko/widget/rag.rb +21 -0
- data/lib/gecko/widget/rag_columns.rb +21 -0
- data/lib/gecko/widget/text.rb +67 -0
- data/spec/gecko/funnel_spec.rb +40 -0
- data/spec/gecko/geckometer_spec.rb +38 -0
- data/spec/gecko/line_spec.rb +42 -0
- data/spec/gecko/number_and_secondary_stat_spec.rb +32 -0
- data/spec/gecko/pie_spec.rb +36 -0
- data/spec/gecko/rag_spec.rb +48 -0
- data/spec/gecko/text_spec.rb +49 -0
- data/spec/gecko_spec.rb +31 -0
- data/spec/helper.rb +25 -0
- data/spec/http_spec.rb +141 -0
- data/spec/support/shared_examples_for_widget.rb +64 -0
- data/spec/widget_spec.rb +172 -0
- metadata +215 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Gecko::Widget::Pie do
|
4
|
+
it_behaves_like "a Gecko::Widget"
|
5
|
+
|
6
|
+
describe '#payload' do
|
7
|
+
before(:each) do
|
8
|
+
@widget = described_class.new('widget_key')
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should be empty by default' do
|
12
|
+
expect(@widget.payload).to be_a_valid_payload(
|
13
|
+
TEST_API_KEY,
|
14
|
+
{
|
15
|
+
:item => []
|
16
|
+
}
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should be correct hash when values assigned' do
|
21
|
+
@widget.add(1, 'first', '#cc0000')
|
22
|
+
@widget.add(2, 'second', '#ffffff')
|
23
|
+
@widget.add(3, 'third')
|
24
|
+
expect(@widget.payload).to be_a_valid_payload(
|
25
|
+
TEST_API_KEY,
|
26
|
+
{
|
27
|
+
:item => [
|
28
|
+
{:value => 1, :label => 'first', :colour => '#cc0000'},
|
29
|
+
{:value => 2, :label => 'second', :colour => '#ffffff'},
|
30
|
+
{:value => 3, :label => 'third'},
|
31
|
+
]
|
32
|
+
}
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
shared_examples "a RAG" do
|
4
|
+
it_behaves_like "a Gecko::Widget"
|
5
|
+
|
6
|
+
describe '#payload' do
|
7
|
+
before(:each) do
|
8
|
+
@widget = described_class.new('widget_key')
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should be empty by default' do
|
12
|
+
expect(@widget.payload).to be_a_valid_payload(
|
13
|
+
TEST_API_KEY,
|
14
|
+
{:item => [
|
15
|
+
{:value => nil, :text => nil},
|
16
|
+
{:value => nil, :text => nil},
|
17
|
+
{:value => nil, :text => nil}
|
18
|
+
]}
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should be correct hash when values assigned' do
|
23
|
+
@widget.green_text = 'green text'
|
24
|
+
@widget.green_value = 1
|
25
|
+
@widget.amber_text = 'amber text'
|
26
|
+
@widget.amber_value = 2
|
27
|
+
@widget.red_text = 'red text'
|
28
|
+
@widget.red_value = 3
|
29
|
+
|
30
|
+
expect(@widget.payload).to be_a_valid_payload(
|
31
|
+
TEST_API_KEY,
|
32
|
+
{:item => [
|
33
|
+
{:value => 3, :text => 'red text'},
|
34
|
+
{:value => 2, :text => 'amber text'},
|
35
|
+
{:value => 1, :text => 'green text'},
|
36
|
+
]}
|
37
|
+
)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe Gecko::Widget::Rag do
|
43
|
+
it_behaves_like "a RAG"
|
44
|
+
end
|
45
|
+
|
46
|
+
describe Gecko::Widget::RagColumns do
|
47
|
+
it_behaves_like "a RAG"
|
48
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Gecko::Widget::Text do
|
4
|
+
it_behaves_like "a Gecko::Widget"
|
5
|
+
|
6
|
+
describe described_class::Item do
|
7
|
+
describe '#initialize' do
|
8
|
+
it 'should raise error if undefined type given' do
|
9
|
+
expect{ described_class.new('text', :undefined_type) }.to raise_error(ArgumentError)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#reset' do
|
15
|
+
before(:each) do
|
16
|
+
@widget = described_class.new('widget_key')
|
17
|
+
@widget.add('this is test')
|
18
|
+
end
|
19
|
+
it 'should clear items' do
|
20
|
+
@widget.reset
|
21
|
+
expect(@widget.count).to be(0)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#payload' do
|
26
|
+
before(:each) do
|
27
|
+
@widget = described_class.new('widget_key')
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should be empty by default' do
|
31
|
+
expect(@widget.payload).to be_a_valid_payload(
|
32
|
+
TEST_API_KEY,
|
33
|
+
{:item => []}
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should be correct hash when values assigned' do
|
38
|
+
@widget.add('this is the text')
|
39
|
+
@widget.add('more text', :alert)
|
40
|
+
expect(@widget.payload).to be_a_valid_payload(
|
41
|
+
TEST_API_KEY,
|
42
|
+
{:item => [
|
43
|
+
{:text => 'this is the text', :type => described_class::Item::TYPES[:normal]},
|
44
|
+
{:text => 'more text', :type => described_class::Item::TYPES[:alert]}
|
45
|
+
]}
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/spec/gecko_spec.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Gecko do
|
4
|
+
describe '#config' do
|
5
|
+
it 'should return a config object' do
|
6
|
+
expect(described_class.config).to be_a described_class::Configurator
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should yield config object' do
|
10
|
+
expect{ |p| described_class.config(&p) }.to yield_with_args(described_class::Configurator)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should allow setting/getting #api_key' do
|
14
|
+
api_key = 'abc1234'
|
15
|
+
described_class.config.api_key = api_key
|
16
|
+
described_class.config.api_key.should eql api_key
|
17
|
+
end
|
18
|
+
|
19
|
+
it '#http_builder by default should not respond to call' do
|
20
|
+
described_class.config.http_builder # nil out any previous values
|
21
|
+
expect(described_class.config.connection_builder.respond_to?(:call)).to be false
|
22
|
+
end
|
23
|
+
|
24
|
+
it '#http_builder should allow setting via block' do
|
25
|
+
proc = Proc.new { 1 }
|
26
|
+
described_class.config.http_builder(&proc)
|
27
|
+
expect(described_class.config.connection_builder.respond_to?(:call)).to be true
|
28
|
+
expect(described_class.config.connection_builder).to be proc
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/spec/helper.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'gecko'
|
2
|
+
require 'rspec'
|
3
|
+
|
4
|
+
Dir["./spec/support/**/*.rb"].sort.each { |f| require f }
|
5
|
+
|
6
|
+
Faraday.default_adapter = :test
|
7
|
+
|
8
|
+
RSpec::Matchers.define :be_a_valid_payload do |api_key, data|
|
9
|
+
def payload(api_key, data)
|
10
|
+
{:api_key => api_key, :data => data}
|
11
|
+
end
|
12
|
+
match do |actual|
|
13
|
+
actual.kind_of?(Hash) && actual == payload(api_key, data)
|
14
|
+
end
|
15
|
+
failure_message_for_should do |actual|
|
16
|
+
"expected that\n#{actual.inspect}\nwould be\n#{payload(api_key, data).inspect}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Thanks https://gist.github.com/1428875
|
21
|
+
class MockBlock
|
22
|
+
def to_proc
|
23
|
+
lambda { |*a| call(*a) }
|
24
|
+
end
|
25
|
+
end
|
data/spec/http_spec.rb
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Gecko::Http do
|
4
|
+
def stub_post(url, request_body = {}, &response)
|
5
|
+
stub = Faraday::Adapter::Test::Stubs.new do |stub|
|
6
|
+
stub.post(url, MultiJson.encode(request_body), &response)
|
7
|
+
end
|
8
|
+
Gecko::Http.new do |builder|
|
9
|
+
builder.adapter :test, stub
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#initialize' do
|
14
|
+
after(:all) do
|
15
|
+
# reset config
|
16
|
+
Gecko.config.http_builder { }
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should yield connection builder' do
|
20
|
+
expect{ |p| described_class.new(&p) }.to yield_with_args(Faraday::Connection)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should use Gecko.config.connection_builder' do
|
24
|
+
Gecko.config.http_builder { |c|
|
25
|
+
expect(c).to be_a(Faraday::Connection)
|
26
|
+
}
|
27
|
+
Gecko.config.connection_builder.should_receive(:call).and_call_original
|
28
|
+
described_class.new
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#post' do
|
33
|
+
it 'returns string if invalid json given' do
|
34
|
+
http = stub_post('/test', {:test => true}) { [200, {}, 'caca}'] }
|
35
|
+
expect(http.post('/test', {:test => true}).response_body).to eq("caca}")
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should return a Result object' do
|
39
|
+
http = stub_post('/test', {:test => true}) { [200, {}, MultiJson.encode({})] }
|
40
|
+
expect(http.post('/test', {:test => true})).to be_a(described_class::Result)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should yield a Faraday::Request instance' do
|
44
|
+
http = stub_post('/test', {:test => true}) { [200, {}, MultiJson.encode({})] }
|
45
|
+
expect { |p| http.post('/test', {:test => true}, &p) }.to yield_with_args(Faraday::Request)
|
46
|
+
end
|
47
|
+
|
48
|
+
describe described_class::Result do
|
49
|
+
context 'success response' do
|
50
|
+
before(:each) do
|
51
|
+
@http = stub_post('/test', {:test => true}) { [200, {}, MultiJson.encode({:success => true, :other_key => {:nested_key => 1234}})] }
|
52
|
+
@response = @http.post('/test', {:test => true})
|
53
|
+
end
|
54
|
+
|
55
|
+
it '#response_body should be a converted from JSON' do
|
56
|
+
expect(@response.response_body).to eq({:success => true, :other_key => {:nested_key => 1234}})
|
57
|
+
end
|
58
|
+
|
59
|
+
it '#http_200? should be true' do
|
60
|
+
expect(@response.http_200?).to be true
|
61
|
+
end
|
62
|
+
|
63
|
+
it '#error? should be false' do
|
64
|
+
expect(@response.error?).to be false
|
65
|
+
end
|
66
|
+
|
67
|
+
it '#success? should be true' do
|
68
|
+
expect(@response.success?).to be true
|
69
|
+
end
|
70
|
+
|
71
|
+
it '#fetch should work with nested keys' do
|
72
|
+
expect(@response.fetch(:other_key, :nested_key)).to eq(1234)
|
73
|
+
end
|
74
|
+
|
75
|
+
it '#fetch should return nil if key does not exist' do
|
76
|
+
expect(@response.fetch(:weird_key, :nested_key)).to be_nil
|
77
|
+
end
|
78
|
+
|
79
|
+
it '#error should return an Error instance' do
|
80
|
+
expect(@response.error).to be_a(described_class::Error)
|
81
|
+
end
|
82
|
+
|
83
|
+
it '#error should be empty' do
|
84
|
+
error = @response.error
|
85
|
+
expect(error.text).to be_nil
|
86
|
+
expect(error.status).to eq(200)
|
87
|
+
end
|
88
|
+
|
89
|
+
it '#on_complete should call block with correct params' do
|
90
|
+
expect{ |p| @response.on_complete(&p) }.to yield_with_args(true, described_class)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context 'error response' do
|
95
|
+
before(:each) do
|
96
|
+
@http = stub_post('/test', {:test => true}) { [400, {}, MultiJson.encode({:success => false, :error => {:nested_key => 1234}})] }
|
97
|
+
@response = @http.post('/test', {:test => true})
|
98
|
+
end
|
99
|
+
|
100
|
+
it '#response_body should be a converted from JSON' do
|
101
|
+
expect(@response.response_body).to eq({:success => false, :error => {:nested_key => 1234}})
|
102
|
+
end
|
103
|
+
|
104
|
+
it '#http_200? should be true' do
|
105
|
+
expect(@response.http_200?).to be false
|
106
|
+
end
|
107
|
+
|
108
|
+
it '#error? should be false' do
|
109
|
+
expect(@response.error?).to be true
|
110
|
+
end
|
111
|
+
|
112
|
+
it '#success? should be true' do
|
113
|
+
expect(@response.success?).to be false
|
114
|
+
end
|
115
|
+
|
116
|
+
it '#fetch should work with nested keys' do
|
117
|
+
expect(@response.fetch(:error, :nested_key)).to eq(1234)
|
118
|
+
end
|
119
|
+
|
120
|
+
it '#fetch should return nil if key does not exist' do
|
121
|
+
expect(@response.fetch(:weird_key, :nested_key)).to be_nil
|
122
|
+
end
|
123
|
+
|
124
|
+
it '#error should return an Error instance' do
|
125
|
+
expect(@response.error).to be_a(described_class::Error)
|
126
|
+
end
|
127
|
+
|
128
|
+
it '#error should be populated' do
|
129
|
+
error = @response.error
|
130
|
+
expect(error.text).to eq({:nested_key => 1234})
|
131
|
+
expect(error.status).to eq(400)
|
132
|
+
end
|
133
|
+
|
134
|
+
it '#on_complete should call block with correct params' do
|
135
|
+
expect { |p| @response.on_complete(&p) }.to yield_with_args(false, described_class)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
TEST_API_KEY = 'gecko.rb-api_key'
|
4
|
+
shared_examples 'a Gecko::Widget' do
|
5
|
+
before(:all) do
|
6
|
+
Gecko.config do |c|
|
7
|
+
c.api_key = TEST_API_KEY
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#initialize' do
|
12
|
+
it 'should receive a list of keys' do
|
13
|
+
widget = described_class.new('widget_key_A', 'widget_key_B')
|
14
|
+
expect(widget.keys).to eq(['widget_key_A', 'widget_key_B'])
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should receive an array' do
|
18
|
+
widget = described_class.new(['widget_key_A', 'widget_key_B'])
|
19
|
+
expect(widget.keys).to eq(['widget_key_A', 'widget_key_B'])
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should yield itself to a block' do
|
23
|
+
expect { |p| described_class.new('widget_key', &p) }.to yield_with_args(described_class)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should raise error if no keys given' do
|
27
|
+
expect { described_class.new }.to raise_error(ArgumentError)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#keys=' do
|
32
|
+
before(:each) do
|
33
|
+
@widget = described_class.new('key')
|
34
|
+
end
|
35
|
+
it 'should receive a key' do
|
36
|
+
@widget.keys = 'widget_key_A'
|
37
|
+
expect(@widget.keys).to eq(['widget_key_A'])
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should receive a list of keys' do
|
41
|
+
@widget.keys = 'widget_key_A', 'widget_key_B'
|
42
|
+
expect(@widget.keys).to eq(['widget_key_A', 'widget_key_B'])
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should receive an array of keys' do
|
46
|
+
@widget.keys = ['widget_key_A', 'widget_key_B']
|
47
|
+
expect(@widget.keys).to eq(['widget_key_A', 'widget_key_B'])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#keys' do
|
52
|
+
it 'should be an array' do
|
53
|
+
widget = described_class.new('widget_key_1234')
|
54
|
+
expect(widget.keys).to be_kind_of(Array)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '#config' do
|
59
|
+
it 'should yield self' do
|
60
|
+
widget = described_class.new('widget_key_1234')
|
61
|
+
expect { |p| widget.config(&p) }.to yield_with_args(widget)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/spec/widget_spec.rb
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Gecko::Widget do
|
4
|
+
before(:all) do
|
5
|
+
Gecko.config do |c|
|
6
|
+
c.api_push_url = '/v1/send/:widget_key'
|
7
|
+
c.api_key = TEST_API_KEY
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_widget(*keys, &response)
|
12
|
+
@widget = described_class.new(*keys)
|
13
|
+
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
14
|
+
@widget.keys.each do |key|
|
15
|
+
stub.post(@widget.push_url(key), MultiJson.encode(@widget.payload), &response)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
Gecko.config.http_builder do |builder|
|
19
|
+
builder.adapter :test, stubs
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'Widget with 1 key, successful response' do
|
24
|
+
before(:each) do
|
25
|
+
create_widget('widget_key1') do
|
26
|
+
[200, {}, MultiJson.encode({:success => true})]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#update' do
|
31
|
+
it 'should return 1 request objects' do
|
32
|
+
update_result = @widget.update
|
33
|
+
expect(update_result).to be_a(Array)
|
34
|
+
expect(update_result.length).to eql(1)
|
35
|
+
update_result.each do |result|
|
36
|
+
expect(result).to be_a(Gecko::Http::Result)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should evoke callback passed to #update' do
|
41
|
+
callback = MockBlock.new
|
42
|
+
expect(callback).to receive(:call).once do |success, result, key|
|
43
|
+
expect(success).to be true
|
44
|
+
expect(result).to be_a(Gecko::Http::Result)
|
45
|
+
expect(key).to eq('widget_key1')
|
46
|
+
end
|
47
|
+
@widget.update(&callback)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should evoke callback passed to #on_update' do
|
51
|
+
callback = MockBlock.new
|
52
|
+
expect(callback).to receive(:call).once do |success, result, key|
|
53
|
+
expect(success).to be true
|
54
|
+
expect(result).to be_a(Gecko::Http::Result)
|
55
|
+
expect(key).to eq('widget_key1')
|
56
|
+
end
|
57
|
+
@widget.on_update(&callback)
|
58
|
+
@widget.update
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'response object' do
|
62
|
+
let(:http_response) { @widget.update.first }
|
63
|
+
|
64
|
+
it 'should have no errors' do
|
65
|
+
expect(http_response.error?).to be false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'Widget with 2 keys, successful response' do
|
73
|
+
before(:each) do
|
74
|
+
create_widget('widget_key1', 'widget_key2') do
|
75
|
+
[200, {}, MultiJson.encode({:success => true})]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#update' do
|
80
|
+
it 'should return 2 request objects' do
|
81
|
+
update_result = @widget.update
|
82
|
+
expect(update_result).to be_a(Array)
|
83
|
+
expect(update_result.length).to eql(2)
|
84
|
+
update_result.each do |result|
|
85
|
+
expect(result).to be_a(Gecko::Http::Result)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should evoke callback passed to #update' do
|
90
|
+
callback = MockBlock.new
|
91
|
+
expect(callback).to receive(:call).twice do |success, result, key|
|
92
|
+
expect(success).to be true
|
93
|
+
expect(result).to be_a(Gecko::Http::Result)
|
94
|
+
expect(key).to match(/widget_key[1|2]/)
|
95
|
+
end
|
96
|
+
@widget.update(&callback)
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should evoke callback passed to #on_update' do
|
100
|
+
callback = MockBlock.new
|
101
|
+
expect(callback).to receive(:call).twice do |success, result, key|
|
102
|
+
expect(success).to be true
|
103
|
+
expect(result).to be_a(Gecko::Http::Result)
|
104
|
+
expect(key).to match(/widget_key[1|2]/)
|
105
|
+
end
|
106
|
+
@widget.on_update(&callback)
|
107
|
+
@widget.update
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'response objects' do
|
111
|
+
let(:http_responses) { @widget.update }
|
112
|
+
|
113
|
+
it 'should have no errors' do
|
114
|
+
http_responses.each do |http_response|
|
115
|
+
expect(http_response.error?).to be false
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'Widget with 2 keys, errors response' do
|
123
|
+
before(:each) do
|
124
|
+
create_widget('widget_key1', 'widget_key2') do
|
125
|
+
[200, {}, MultiJson.encode({:success => false, :error => 'Push operation failed due to an unknown reason. Please try again!'})]
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe '#update' do
|
130
|
+
it 'should return 2 request objects' do
|
131
|
+
update_result = @widget.update
|
132
|
+
expect(update_result).to be_a(Array)
|
133
|
+
expect(update_result.length).to eql(2)
|
134
|
+
update_result.each do |result|
|
135
|
+
expect(result).to be_a(Gecko::Http::Result)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'should evoke callback passed to #update' do
|
140
|
+
callback = MockBlock.new
|
141
|
+
expect(callback).to receive(:call).twice do |success, result, key|
|
142
|
+
expect(success).to be false
|
143
|
+
expect(result).to be_a(Gecko::Http::Result)
|
144
|
+
expect(key).to match(/widget_key[1|2]/)
|
145
|
+
end
|
146
|
+
@widget.update(&callback)
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'should evoke callback passed to #on_update' do
|
150
|
+
callback = MockBlock.new
|
151
|
+
expect(callback).to receive(:call).twice do |success, result, key|
|
152
|
+
expect(success).to be false
|
153
|
+
expect(result).to be_a(Gecko::Http::Result)
|
154
|
+
expect(key).to match(/widget_key[1|2]/)
|
155
|
+
end
|
156
|
+
@widget.on_update(&callback)
|
157
|
+
@widget.update
|
158
|
+
end
|
159
|
+
|
160
|
+
context 'response objects' do
|
161
|
+
let(:http_responses) { @widget.update }
|
162
|
+
|
163
|
+
it 'should have errors' do
|
164
|
+
http_responses.each do |http_response|
|
165
|
+
expect(http_response.error?).to be true
|
166
|
+
expect(http_response.error.to_s).to eq('Push operation failed due to an unknown reason. Please try again!')
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|