copy_tuner_client 0.4.9 → 0.4.10
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/CHANGELOG.md +4 -0
- data/Gemfile.lock +2 -8
- data/app/assets/javascripts/copyray.js +961 -888
- data/copy_tuner_client.gemspec +0 -1
- data/lib/copy_tuner_client/cache.rb +4 -4
- data/lib/copy_tuner_client/copyray_middleware.rb +1 -1
- data/lib/copy_tuner_client/version.rb +1 -1
- data/lib/tasks/copy_tuner_client_tasks.rake +1 -1
- data/package-lock.json +1719 -1118
- data/package.json +15 -12
- data/rollup.config.js +5 -3
- data/spec/copy_tuner_client/cache_spec.rb +30 -32
- data/spec/copy_tuner_client/client_spec.rb +3 -5
- data/spec/copy_tuner_client/configuration_spec.rb +20 -18
- data/spec/copy_tuner_client/i18n_backend_spec.rb +5 -7
- data/spec/copy_tuner_client/poller_spec.rb +4 -5
- data/spec/copy_tuner_client/prefixed_logger_spec.rb +1 -3
- data/spec/copy_tuner_client/process_guard_spec.rb +12 -13
- data/spec/copy_tuner_client/request_sync_spec.rb +19 -17
- data/spec/copy_tuner_client_spec.rb +3 -4
- data/spec/spec_helper.rb +0 -2
- data/spec/support/fake_client.rb +13 -1
- metadata +2 -16
data/package.json
CHANGED
@@ -4,24 +4,27 @@
|
|
4
4
|
"repository": "https://github.com/SonicGarden/copy-tuner-ruby-client",
|
5
5
|
"author": "SonicGarden",
|
6
6
|
"license": "MIT",
|
7
|
+
"engines": {
|
8
|
+
"node": "8.x"
|
9
|
+
},
|
7
10
|
"scripts": {
|
8
11
|
"build": "rollup -c",
|
9
12
|
"watch": "rollup -c -w"
|
10
13
|
},
|
11
|
-
"dependencies": {
|
12
|
-
"keycode-js": "0.0.4",
|
13
|
-
"lodash.debounce": "^4.0.8"
|
14
|
-
},
|
14
|
+
"dependencies": {},
|
15
15
|
"devDependencies": {
|
16
|
+
"babel-core": "^6.26.3",
|
16
17
|
"babel-plugin-external-helpers": "^6.22.0",
|
17
|
-
"babel-preset-env": "^1.
|
18
|
-
"eslint": "^
|
19
|
-
"eslint-config-airbnb-base": "^
|
20
|
-
"eslint-plugin-import": "^2.
|
21
|
-
"
|
22
|
-
"
|
23
|
-
"rollup
|
24
|
-
"rollup-plugin-
|
18
|
+
"babel-preset-env": "^1.7.0",
|
19
|
+
"eslint": "^4.19.1",
|
20
|
+
"eslint-config-airbnb-base": "^13.0.0",
|
21
|
+
"eslint-plugin-import": "^2.13.0",
|
22
|
+
"keycode-js": "^1.0.0",
|
23
|
+
"lodash.debounce": "^4.0.8",
|
24
|
+
"rollup": "^0.62.0",
|
25
|
+
"rollup-plugin-babel": "^3.0.7",
|
26
|
+
"rollup-plugin-commonjs": "^9.1.3",
|
27
|
+
"rollup-plugin-node-resolve": "^3.3.0",
|
25
28
|
"rollup-watch": "^4.3.1"
|
26
29
|
}
|
27
30
|
}
|
data/rollup.config.js
CHANGED
@@ -3,9 +3,11 @@ import resolve from 'rollup-plugin-node-resolve';
|
|
3
3
|
import commonjs from 'rollup-plugin-commonjs';
|
4
4
|
|
5
5
|
export default {
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
input: 'src/main.js',
|
7
|
+
output: {
|
8
|
+
file: 'app/assets/javascripts/copyray.js',
|
9
|
+
format: 'iife',
|
10
|
+
},
|
9
11
|
plugins: [
|
10
12
|
resolve({ jsnext: true, main: true }),
|
11
13
|
commonjs(),
|
@@ -98,7 +98,7 @@ describe CopyTunerClient::Cache do
|
|
98
98
|
it "handles connection errors when flushing" do
|
99
99
|
failure = "server is napping"
|
100
100
|
logger = FakeLogger.new
|
101
|
-
client.
|
101
|
+
expect(client).to receive(:upload).and_raise(CopyTunerClient::ConnectionError.new(failure))
|
102
102
|
cache = build_cache(:logger => logger)
|
103
103
|
cache['upload.key'] = 'upload'
|
104
104
|
|
@@ -110,7 +110,7 @@ describe CopyTunerClient::Cache do
|
|
110
110
|
it "handles connection errors when downloading" do
|
111
111
|
failure = "server is napping"
|
112
112
|
logger = FakeLogger.new
|
113
|
-
client.
|
113
|
+
expect(client).to receive(:download).and_raise(CopyTunerClient::ConnectionError.new(failure))
|
114
114
|
cache = build_cache(:logger => logger)
|
115
115
|
|
116
116
|
cache.download
|
@@ -120,43 +120,46 @@ describe CopyTunerClient::Cache do
|
|
120
120
|
|
121
121
|
it "blocks until the first download is complete" do
|
122
122
|
logger = FakeLogger.new
|
123
|
-
logger.
|
124
|
-
client.delay =
|
123
|
+
expect(logger).to receive(:flush)
|
124
|
+
client.delay = true
|
125
125
|
cache = build_cache(:logger => logger)
|
126
126
|
|
127
|
-
Thread.new { cache.download }
|
127
|
+
t_download = Thread.new { cache.download }
|
128
|
+
sleep 0.1 until cache.pending?
|
128
129
|
|
129
|
-
|
130
|
-
Thread.new do
|
130
|
+
t_wait = Thread.new do
|
131
131
|
cache.wait_for_download
|
132
|
-
finished = true
|
133
132
|
end
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
expect(
|
138
|
-
|
139
|
-
# logger.should have_entry(:info, "Waiting for first download")
|
140
|
-
# logger.should have_received(:flush)
|
133
|
+
sleep 0.1 until logger.has_entry?(:info, "Waiting for first download")
|
134
|
+
client.go
|
135
|
+
expect(t_download.join(1)).not_to be_nil
|
136
|
+
expect(cache.pending?).to be_falsey
|
137
|
+
expect(t_wait.join(1)).not_to be_nil
|
141
138
|
end
|
142
139
|
|
143
140
|
it "doesn't block if the first download fails" do
|
144
|
-
client.delay =
|
141
|
+
client.delay = true
|
145
142
|
client.error = StandardError.new("Failure")
|
146
143
|
cache = build_cache
|
147
144
|
|
148
|
-
|
145
|
+
error = nil
|
146
|
+
t_download = Thread.new do
|
147
|
+
begin
|
148
|
+
cache.download
|
149
|
+
rescue StandardError => e
|
150
|
+
error = e
|
151
|
+
end
|
152
|
+
end
|
153
|
+
sleep 0.1 until cache.pending?
|
149
154
|
|
150
|
-
|
151
|
-
Thread.new do
|
155
|
+
t_wait = Thread.new do
|
152
156
|
cache.wait_for_download
|
153
|
-
finished = true
|
154
157
|
end
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
+
client.go
|
159
|
+
expect(t_download.join(1)).not_to be_nil
|
160
|
+
expect(error).to be_kind_of(StandardError)
|
161
|
+
expect(t_wait.join(1)).not_to be_nil
|
158
162
|
expect { cache.download }.to raise_error(StandardError, "Failure")
|
159
|
-
expect(finished).to eq(true)
|
160
163
|
end
|
161
164
|
|
162
165
|
it "doesn't block before downloading" do
|
@@ -218,7 +221,7 @@ describe CopyTunerClient::Cache do
|
|
218
221
|
|
219
222
|
before do
|
220
223
|
mutex.lock
|
221
|
-
Mutex.
|
224
|
+
allow(Mutex).to receive(:new).and_return(mutex)
|
222
225
|
end
|
223
226
|
|
224
227
|
it "synchronizes read access to keys between threads" do
|
@@ -239,12 +242,9 @@ describe CopyTunerClient::Cache do
|
|
239
242
|
CopyTunerClient.configure do |config|
|
240
243
|
config.cache = cache
|
241
244
|
end
|
242
|
-
cache.
|
245
|
+
expect(cache).to receive(:flush).at_least(:once)
|
243
246
|
|
244
247
|
CopyTunerClient.flush
|
245
|
-
|
246
|
-
# FIXME 不安定なので後ほど修正する。
|
247
|
-
# cache.should have_received(:flush)
|
248
248
|
end
|
249
249
|
|
250
250
|
describe "#export" do
|
@@ -260,11 +260,9 @@ describe CopyTunerClient::Cache do
|
|
260
260
|
CopyTunerClient.configure do |config|
|
261
261
|
config.cache = @cache
|
262
262
|
end
|
263
|
-
@cache.
|
263
|
+
expect(@cache).to receive(:export)
|
264
264
|
|
265
265
|
CopyTunerClient.export
|
266
|
-
|
267
|
-
expect(@cache).to have_received(:export)
|
268
266
|
end
|
269
267
|
|
270
268
|
it "returns no yaml with no blurb keys" do
|
@@ -24,7 +24,7 @@ describe CopyTunerClient do
|
|
24
24
|
let(:http) { Net::HTTP.new(config.host, config.port) }
|
25
25
|
|
26
26
|
before do
|
27
|
-
Net::HTTP.
|
27
|
+
allow(Net::HTTP).to receive(:new).and_return(http)
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'should timeout when connecting' do
|
@@ -71,7 +71,7 @@ describe CopyTunerClient do
|
|
71
71
|
]
|
72
72
|
|
73
73
|
errors.each do |original_error|
|
74
|
-
http.
|
74
|
+
allow(http).to receive(:request).and_raise(original_error)
|
75
75
|
client = build_client_with_project
|
76
76
|
expect { client.download { |ignore| } }.
|
77
77
|
to raise_error(CopyTunerClient::ConnectionError) { |error|
|
@@ -200,11 +200,9 @@ describe CopyTunerClient do
|
|
200
200
|
CopyTunerClient.configure do |config|
|
201
201
|
config.client = client
|
202
202
|
end
|
203
|
-
client.
|
203
|
+
expect(client).to receive(:deploy)
|
204
204
|
|
205
205
|
CopyTunerClient.deploy
|
206
|
-
|
207
|
-
expect(client).to have_received(:deploy)
|
208
206
|
end
|
209
207
|
|
210
208
|
it "deploys" do
|
@@ -162,9 +162,8 @@ describe CopyTunerClient::Configuration do
|
|
162
162
|
|
163
163
|
it 'logs to $stdout by default' do
|
164
164
|
logger = FakeLogger.new
|
165
|
-
Logger.
|
165
|
+
expect(Logger).to receive(:new).with($stdout).and_return(logger)
|
166
166
|
config = CopyTunerClient::Configuration.new
|
167
|
-
expect(Logger).to have_received(:new).with($stdout)
|
168
167
|
expect(config.logger.original_logger).to eq(logger)
|
169
168
|
end
|
170
169
|
|
@@ -194,19 +193,19 @@ end
|
|
194
193
|
|
195
194
|
shared_context 'stubbed configuration' do
|
196
195
|
subject { CopyTunerClient::Configuration.new }
|
197
|
-
let(:backend) {
|
198
|
-
let(:cache) {
|
199
|
-
let(:client) {
|
196
|
+
let(:backend) { double('i18n-backend') }
|
197
|
+
let(:cache) { double('cache', download: "download") }
|
198
|
+
let(:client) { double('client') }
|
200
199
|
let(:logger) { FakeLogger.new }
|
201
|
-
let(:poller) {
|
202
|
-
let(:process_guard) {
|
200
|
+
let(:poller) { double('poller') }
|
201
|
+
let(:process_guard) { double('process_guard', start: nil) }
|
203
202
|
|
204
203
|
before do
|
205
|
-
CopyTunerClient::I18nBackend.
|
206
|
-
CopyTunerClient::Client.
|
207
|
-
CopyTunerClient::Cache.
|
208
|
-
CopyTunerClient::Poller.
|
209
|
-
CopyTunerClient::ProcessGuard.
|
204
|
+
allow(CopyTunerClient::I18nBackend).to receive(:new).and_return(backend)
|
205
|
+
allow(CopyTunerClient::Client).to receive(:new).and_return(client)
|
206
|
+
allow(CopyTunerClient::Cache).to receive(:new).and_return(cache)
|
207
|
+
allow(CopyTunerClient::Poller).to receive(:new).and_return(poller)
|
208
|
+
allow(CopyTunerClient::ProcessGuard).to receive(:new).and_return(process_guard)
|
210
209
|
subject.logger = logger
|
211
210
|
apply
|
212
211
|
end
|
@@ -243,7 +242,7 @@ end
|
|
243
242
|
describe CopyTunerClient::Configuration, 'applied when testing' do
|
244
243
|
it_should_behave_like 'applied configuration' do
|
245
244
|
it 'does not start the process guard' do
|
246
|
-
expect(process_guard).
|
245
|
+
expect(process_guard).not_to receive(:start)
|
247
246
|
end
|
248
247
|
end
|
249
248
|
|
@@ -334,13 +333,16 @@ describe CopyTunerClient::Configuration, 'applied with locale filter' do
|
|
334
333
|
end
|
335
334
|
|
336
335
|
describe CopyTunerClient::Configuration, 'applied with Rails i18n config' do
|
336
|
+
let!(:rails_defined) { Object.const_defined?(:Rails) }
|
337
|
+
|
337
338
|
def self.with_config(i18n_options)
|
338
|
-
|
339
|
-
rails_defined = Object.const_defined?(:Rails)
|
339
|
+
before do
|
340
340
|
Object.const_set :Rails, Module.new unless rails_defined
|
341
|
-
i18n =
|
342
|
-
Rails.
|
343
|
-
|
341
|
+
i18n = double('i18n', i18n_options)
|
342
|
+
allow(Rails).to receive_message_chain(:application, :config, :i18n) { i18n }
|
343
|
+
end
|
344
|
+
|
345
|
+
after do
|
344
346
|
Object.send(:remove_const, :Rails) unless rails_defined
|
345
347
|
end
|
346
348
|
end
|
@@ -11,7 +11,7 @@ describe CopyTunerClient::I18nBackend do
|
|
11
11
|
|
12
12
|
before do
|
13
13
|
@default_backend = I18n.backend
|
14
|
-
cache.
|
14
|
+
allow(cache).to receive(:wait_for_download)
|
15
15
|
end
|
16
16
|
|
17
17
|
after { I18n.backend = @default_backend }
|
@@ -19,12 +19,10 @@ describe CopyTunerClient::I18nBackend do
|
|
19
19
|
subject { build_backend }
|
20
20
|
|
21
21
|
it "reloads locale files and waits for the download to complete" do
|
22
|
-
I18n.
|
22
|
+
expect(I18n).to receive(:load_path).and_return([])
|
23
|
+
expect(cache).to receive(:wait_for_download)
|
23
24
|
subject.reload!
|
24
25
|
subject.translate('en', 'test.key', :default => 'something')
|
25
|
-
|
26
|
-
expect(cache).to have_received(:wait_for_download)
|
27
|
-
expect(I18n).to have_received(:load_path)
|
28
26
|
end
|
29
27
|
|
30
28
|
it "includes the base i18n backend" do
|
@@ -41,8 +39,8 @@ describe CopyTunerClient::I18nBackend do
|
|
41
39
|
end
|
42
40
|
|
43
41
|
it "finds available locales from locale files and cache" do
|
44
|
-
YAML.
|
45
|
-
I18n.
|
42
|
+
allow(YAML).to receive(:load_file).and_return({ 'es' => { 'key' => 'value' } })
|
43
|
+
allow(I18n).to receive(:load_path).and_return(["test.yml"])
|
46
44
|
|
47
45
|
cache['en.key'] = ''
|
48
46
|
cache['fr.key'] = ''
|
@@ -61,7 +61,8 @@ describe CopyTunerClient::Poller do
|
|
61
61
|
it "stops polling with an invalid api key" do
|
62
62
|
failure = "server is napping"
|
63
63
|
logger = FakeLogger.new
|
64
|
-
|
64
|
+
|
65
|
+
expect(cache).to receive(:download).and_raise(CopyTunerClient::InvalidApiKey.new(failure))
|
65
66
|
poller = build_poller(:logger => logger)
|
66
67
|
|
67
68
|
cache['upload.key'] = 'upload'
|
@@ -77,7 +78,7 @@ describe CopyTunerClient::Poller do
|
|
77
78
|
end
|
78
79
|
|
79
80
|
it "logs an error if the background thread can't start" do
|
80
|
-
Thread.
|
81
|
+
expect(Thread).to receive(:new).and_return(nil)
|
81
82
|
logger = FakeLogger.new
|
82
83
|
|
83
84
|
build_poller(:logger => logger).start
|
@@ -87,12 +88,10 @@ describe CopyTunerClient::Poller do
|
|
87
88
|
|
88
89
|
it "flushes the log when polling" do
|
89
90
|
logger = FakeLogger.new
|
90
|
-
logger.
|
91
|
+
expect(logger).to receive(:flush).at_least(:once)
|
91
92
|
|
92
93
|
build_poller(:logger => logger).start
|
93
94
|
|
94
95
|
wait_for_next_sync
|
95
|
-
|
96
|
-
expect(logger).to have_received(:flush).at_least_once
|
97
96
|
end
|
98
97
|
end
|
@@ -24,11 +24,9 @@ describe CopyTunerClient::PrefixedLogger do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it "calls flush for a logger that responds to flush" do
|
27
|
-
output_logger.
|
27
|
+
expect(output_logger).to receive(:flush)
|
28
28
|
|
29
29
|
subject.flush
|
30
|
-
|
31
|
-
expect(output_logger).to have_received(:flush)
|
32
30
|
end
|
33
31
|
|
34
32
|
it "doesn't call flush for a logger that doesn't respond to flush" do
|
@@ -11,24 +11,26 @@ describe CopyTunerClient::ProcessGuard do
|
|
11
11
|
$0 = @original_process_name
|
12
12
|
end
|
13
13
|
|
14
|
-
let(:cache) {
|
15
|
-
let(:poller) {
|
14
|
+
let(:cache) { double('cache', flush: nil) }
|
15
|
+
let(:poller) { double('poller', start: nil) }
|
16
16
|
|
17
17
|
def build_process_guard(options = {})
|
18
|
+
preserve_exit_hook = options.delete(:preserve_exit_hook)
|
18
19
|
options[:logger] ||= FakeLogger.new
|
19
20
|
options[:cache] ||= cache
|
20
|
-
CopyTunerClient::ProcessGuard.new(options[:cache], poller, options)
|
21
|
+
process_guard = CopyTunerClient::ProcessGuard.new(options[:cache], poller, options)
|
22
|
+
allow(process_guard).to receive(:register_exit_hooks) unless preserve_exit_hook
|
23
|
+
process_guard
|
21
24
|
end
|
22
25
|
|
23
26
|
it "starts polling from a worker process" do
|
27
|
+
expect(poller).to receive(:start)
|
24
28
|
process_guard = build_process_guard
|
25
|
-
|
26
29
|
process_guard.start
|
27
|
-
|
28
|
-
expect(poller).to have_received(:start)
|
29
30
|
end
|
30
31
|
|
31
32
|
it "registers passenger hooks from the passenger master" do
|
33
|
+
expect(poller).not_to receive(:start)
|
32
34
|
logger = FakeLogger.new
|
33
35
|
passenger = define_constant('PhusionPassenger', FakePassenger.new)
|
34
36
|
passenger.become_master
|
@@ -37,10 +39,10 @@ describe CopyTunerClient::ProcessGuard do
|
|
37
39
|
process_guard.start
|
38
40
|
|
39
41
|
expect(logger).to have_entry(:info, "Registered Phusion Passenger fork hook")
|
40
|
-
expect(poller).to have_received(:start).never
|
41
42
|
end
|
42
43
|
|
43
44
|
it "starts polling from a passenger worker" do
|
45
|
+
expect(poller).to receive(:start)
|
44
46
|
logger = FakeLogger.new
|
45
47
|
passenger = define_constant('PhusionPassenger', FakePassenger.new)
|
46
48
|
passenger.become_master
|
@@ -48,11 +50,10 @@ describe CopyTunerClient::ProcessGuard do
|
|
48
50
|
|
49
51
|
process_guard.start
|
50
52
|
passenger.spawn
|
51
|
-
|
52
|
-
expect(poller).to have_received(:start)
|
53
53
|
end
|
54
54
|
|
55
55
|
it "registers unicorn hooks from the unicorn master" do
|
56
|
+
expect(poller).not_to receive(:start)
|
56
57
|
logger = FakeLogger.new
|
57
58
|
define_constant('Unicorn', Module.new)
|
58
59
|
http_server = Class.new(FakeUnicornServer)
|
@@ -63,10 +64,10 @@ describe CopyTunerClient::ProcessGuard do
|
|
63
64
|
process_guard.start
|
64
65
|
|
65
66
|
expect(logger).to have_entry(:info, "Registered Unicorn fork hook")
|
66
|
-
expect(poller).to have_received(:start).never
|
67
67
|
end
|
68
68
|
|
69
69
|
it "starts polling from a unicorn worker" do
|
70
|
+
expect(poller).to receive(:start)
|
70
71
|
logger = FakeLogger.new
|
71
72
|
define_constant('Unicorn', Module.new)
|
72
73
|
http_server = Class.new(FakeUnicornServer)
|
@@ -76,14 +77,12 @@ describe CopyTunerClient::ProcessGuard do
|
|
76
77
|
|
77
78
|
process_guard.start
|
78
79
|
unicorn.spawn
|
79
|
-
|
80
|
-
expect(poller).to have_received(:start)
|
81
80
|
end
|
82
81
|
|
83
82
|
it "flushes when the process terminates" do
|
84
83
|
cache = WritingCache.new
|
85
84
|
pid = fork do
|
86
|
-
process_guard = build_process_guard(:cache
|
85
|
+
process_guard = build_process_guard(cache: cache, preserve_exit_hook: true)
|
87
86
|
process_guard.start
|
88
87
|
exit
|
89
88
|
end
|
@@ -5,16 +5,16 @@ describe CopyTunerClient::RequestSync do
|
|
5
5
|
let(:cache) { {} }
|
6
6
|
let(:response) { 'response' }
|
7
7
|
let(:env) { 'env' }
|
8
|
-
let(:app) {
|
8
|
+
let(:app) { double('app', :call => response) }
|
9
9
|
before do
|
10
|
-
cache.
|
11
|
-
poller.
|
10
|
+
allow(cache).to receive_messages(:flush => nil, :download => nil)
|
11
|
+
allow(poller).to receive(:start_sync).and_return(nil)
|
12
12
|
end
|
13
13
|
subject { CopyTunerClient::RequestSync.new(app, :poller => poller, :cache => cache, :interval => 0) }
|
14
14
|
|
15
15
|
it "invokes the upstream app" do
|
16
|
+
expect(app).to receive(:call).with(env)
|
16
17
|
result = subject.call(env)
|
17
|
-
expect(app).to have_received(:call).with(env)
|
18
18
|
expect(result).to eq(response)
|
19
19
|
end
|
20
20
|
end
|
@@ -26,18 +26,18 @@ describe CopyTunerClient::RequestSync, 'serving assets' do
|
|
26
26
|
let(:poller) { {} }
|
27
27
|
let(:cache) { {} }
|
28
28
|
let(:response) { 'response' }
|
29
|
-
let(:app) {
|
29
|
+
let(:app) { double('app', :call => response) }
|
30
30
|
before do
|
31
|
-
cache.
|
32
|
-
poller.
|
31
|
+
allow(cache).to receive_messages(:flush => nil, :download => nil)
|
32
|
+
allow(poller).to receive(:start_sync).and_return(nil)
|
33
33
|
end
|
34
34
|
subject { CopyTunerClient::RequestSync.new(app, :poller => poller, :cache => cache, :interval => 0) }
|
35
35
|
|
36
36
|
it "don't start sync" do
|
37
|
+
expect(cache).to receive(:download).once
|
37
38
|
subject.call(env)
|
38
|
-
expect(
|
39
|
+
expect(poller).not_to receive(:start_sync)
|
39
40
|
subject.call(env)
|
40
|
-
expect(poller).to have_received(:start_sync).never
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
@@ -46,36 +46,38 @@ describe CopyTunerClient::RequestSync do
|
|
46
46
|
let(:cache) { {} }
|
47
47
|
let(:response) { 'response' }
|
48
48
|
let(:env) { 'env' }
|
49
|
-
let(:app) {
|
49
|
+
let(:app) { double('app', :call => response) }
|
50
50
|
subject { CopyTunerClient::RequestSync.new(app, :poller => poller, :cache => cache, :interval => 10) }
|
51
51
|
before do
|
52
|
-
cache.
|
53
|
-
poller.
|
52
|
+
allow(cache).to receive_messages(:flush => nil, :download => nil)
|
53
|
+
allow(poller).to receive(:start_sync).and_return(nil)
|
54
54
|
end
|
55
55
|
|
56
56
|
context "first request" do
|
57
57
|
it "download" do
|
58
|
+
expect(cache).to receive(:download).once
|
58
59
|
subject.call(env)
|
59
|
-
expect(cache).to have_received(:download).once
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
63
|
context 'in interval request' do
|
64
64
|
it "does not start sync for the second time" do
|
65
|
+
expect(cache).to receive(:download).once
|
65
66
|
subject.call(env)
|
66
|
-
|
67
|
+
|
68
|
+
expect(poller).not_to receive(:start_sync)
|
67
69
|
subject.call(env)
|
68
|
-
expect(poller).to have_received(:start_sync).never
|
69
70
|
end
|
70
71
|
end
|
71
72
|
|
72
73
|
context 'over interval request' do
|
73
74
|
it "start sync for the second time" do
|
75
|
+
expect(cache).to receive(:download).once
|
74
76
|
subject.call(env)
|
75
|
-
|
77
|
+
|
78
|
+
expect(poller).to receive(:start_sync).once
|
76
79
|
subject.last_synced = Time.now - 60
|
77
80
|
subject.call(env)
|
78
|
-
expect(poller).to have_received(:start_sync).once
|
79
81
|
end
|
80
82
|
end
|
81
83
|
end
|