queue_classic 3.1.0 → 3.2.0.RC1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,12 +1,9 @@
1
- $: << File.expand_path("lib")
2
- $: << File.expand_path("test")
3
-
4
1
  require "bundler"
5
2
  Bundler.setup :default, :test
6
3
 
7
4
  ENV["DATABASE_URL"] ||= "postgres:///queue_classic_test"
8
5
 
9
- require "queue_classic"
6
+ require_relative '../lib/queue_classic'
10
7
  require "stringio"
11
8
  require "minitest/autorun"
12
9
 
@@ -51,4 +48,14 @@ class QCTest < Minitest::Test
51
48
  $stdout = original_stdout
52
49
  end
53
50
 
51
+ def with_env(temporary_environment)
52
+ original_environment = {}
53
+ temporary_environment.each do |name, value|
54
+ original_environment[name] = ENV[name]
55
+ ENV[name] = value
56
+ end
57
+ yield
58
+ ensure
59
+ original_environment.each { |name, value| ENV[name] = value }
60
+ end
54
61
  end
@@ -0,0 +1,25 @@
1
+ DO $$
2
+ -- Set initial sequence to a large number to test the entire toolchain
3
+ -- works on integers with higher bits set.
4
+ DECLARE
5
+ quoted_name text;
6
+ quoted_size text;
7
+ BEGIN
8
+ -- Find the name of the relevant sequence.
9
+ --
10
+ -- pg_get_serial_sequence quotes identifiers as part of its
11
+ -- behavior.
12
+ SELECT name
13
+ INTO STRICT quoted_name
14
+ FROM pg_get_serial_sequence('queue_classic_jobs', 'id') AS name;
15
+
16
+ -- Don't quote, because ALTER SEQUENCE RESTART doesn't like
17
+ -- general literals, only unquoted numeric literals.
18
+ SELECT pow(2, 34)::text AS size
19
+ INTO STRICT quoted_size;
20
+
21
+ EXECUTE 'ALTER SEQUENCE ' || quoted_name ||
22
+ ' RESTART ' || quoted_size || ';';
23
+ END;
24
+ $$;
25
+
@@ -22,10 +22,10 @@ class QueueClassicRailsConnectionTest < QCTest
22
22
  end
23
23
 
24
24
  def test_does_not_use_active_record_connection_if_env_var_set
25
- ENV['QC_RAILS_DATABASE'] = 'false'
26
- connection = get_connection
27
- assert_raises(MockExpectationError) { connection.verify }
28
- ENV['QC_RAILS_DATABASE'] = 'true'
25
+ with_env 'QC_RAILS_DATABASE' => 'false' do
26
+ connection = get_connection
27
+ assert_raises(MockExpectationError) { connection.verify }
28
+ end
29
29
  end
30
30
 
31
31
  private
@@ -1,6 +1,13 @@
1
1
  require File.expand_path("../../helper.rb", __FILE__)
2
2
 
3
3
  class QueueClassicTest < QCTest
4
+ def test_only_delegate_calls_to_queue_it_understands
5
+ e = assert_raises(NoMethodError) do
6
+ QC.probably_not
7
+ end
8
+ assert_match "undefined method `probably_not' for QC:Module", e.message
9
+ end
10
+
4
11
  def test_default_conn_adapter_default_value
5
12
  assert(QC.default_conn_adapter.is_a?(QC::ConnAdapter))
6
13
  end
@@ -17,11 +24,11 @@ class QueueClassicTest < QCTest
17
24
  def test_unlock_jobs_of_dead_workers
18
25
  # Insert a locked job
19
26
  adapter = QC::ConnAdapter.new
20
- query = "INSERT INTO #{QC::TABLE_NAME} (q_name, method, args, locked_by, locked_at) VALUES ('whatever', 'Kernel.puts', '[\"ok?\"]', 0, (CURRENT_TIMESTAMP))"
27
+ query = "INSERT INTO #{QC.table_name} (q_name, method, args, locked_by, locked_at) VALUES ('whatever', 'Kernel.puts', '[\"ok?\"]', 0, (CURRENT_TIMESTAMP))"
21
28
  adapter.execute(query)
22
29
 
23
30
  # We should have no unlocked jobs
24
- query_locked_jobs = "SELECT * FROM #{QC::TABLE_NAME} WHERE locked_at IS NULL"
31
+ query_locked_jobs = "SELECT * FROM #{QC.table_name} WHERE locked_at IS NULL"
25
32
  res = adapter.connection.exec(query_locked_jobs)
26
33
  assert_equal(0, res.count)
27
34
 
@@ -1,4 +1,4 @@
1
- require File.expand_path("../helper.rb", __FILE__)
1
+ require_relative 'helper'
2
2
 
3
3
  class QueueTest < QCTest
4
4
 
@@ -28,12 +28,14 @@ class QueueTest < QCTest
28
28
  end
29
29
 
30
30
  def test_lock_with_future_job_with_enqueue_in
31
+ now = Time.now
31
32
  QC.enqueue_in(2, "Klass.method")
32
33
  assert_nil QC.lock
33
34
  sleep 2
34
35
  job = QC.lock
35
36
  assert_equal("Klass.method", job[:method])
36
37
  assert_equal([], job[:args])
38
+ assert_equal((now + 2).to_i, job[:scheduled_at].to_i)
37
39
  end
38
40
 
39
41
  def test_lock_with_future_job_with_enqueue_at_with_a_time_object
@@ -44,6 +46,7 @@ class QueueTest < QCTest
44
46
  job = QC.lock
45
47
  assert_equal("Klass.method", job[:method])
46
48
  assert_equal([], job[:args])
49
+ assert_equal(future.to_i, job[:scheduled_at].to_i)
47
50
  end
48
51
 
49
52
  def test_lock_with_future_job_with_enqueue_at_with_a_float_timestamp
@@ -129,9 +132,50 @@ class QueueTest < QCTest
129
132
  QC.default_queue = nil
130
133
  end
131
134
 
135
+ def test_multi_threaded_server_can_specified_connection
136
+ adapter1 = QC::ConnAdapter.new
137
+ adapter2 = QC::ConnAdapter.new
138
+ q1 = q2 = nil
139
+
140
+ QC.default_conn_adapter = adapter1
141
+
142
+ t1 = Thread.new do
143
+ QC.default_conn_adapter = adapter1
144
+ q1 = QC::Queue.new('queue1').conn_adapter
145
+ end
146
+
147
+ t2 = Thread.new do
148
+ QC.default_conn_adapter = adapter2
149
+ q2 = QC::Queue.new('queue2').conn_adapter
150
+ end
151
+
152
+ t1.join
153
+ t2.join
154
+
155
+ assert_equal adapter1, q1
156
+ assert_equal adapter2, q2
157
+ end
158
+
159
+ def test_multi_threaded_server_each_thread_acquires_unique_connection
160
+ q1 = q2 = nil
161
+
162
+ t1 = Thread.new do
163
+ q1 = QC::Queue.new('queue1').conn_adapter
164
+ end
165
+
166
+ t2 = Thread.new do
167
+ q2 = QC::Queue.new('queue2').conn_adapter
168
+ end
169
+
170
+ t1.join
171
+ t2.join
172
+
173
+ refute_equal q1, q2
174
+ end
175
+
132
176
  def test_enqueue_triggers_notify
133
177
  adapter = QC.default_conn_adapter
134
- adapter.execute('LISTEN "' + QC::QUEUE + '"')
178
+ adapter.execute('LISTEN "' + QC.queue + '"')
135
179
  adapter.send(:drain_notify)
136
180
 
137
181
  msgs = adapter.send(:wait_for_notify, 0.25)
@@ -142,4 +186,23 @@ class QueueTest < QCTest
142
186
  assert_equal(1, msgs.length)
143
187
  end
144
188
 
189
+ def test_enqueue_returns_job_id
190
+ enqueued_job = QC.enqueue("Klass.method")
191
+ locked_job = QC.lock
192
+ assert_equal enqueued_job, "id" => locked_job[:id]
193
+ end
194
+
195
+ def test_enqueue_in_returns_job_id
196
+ enqueued_job = QC.enqueue_in(1, "Klass.method")
197
+ sleep 1
198
+ locked_job = QC.lock
199
+ assert_equal enqueued_job, "id" => locked_job[:id]
200
+ end
201
+
202
+ def test_enqueue_at_returns_job_id
203
+ enqueued_job = QC.enqueue_at(Time.now + 1, "Klass.method")
204
+ sleep 1
205
+ locked_job = QC.lock
206
+ assert_equal enqueued_job, "id" => locked_job[:id]
207
+ end
145
208
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path("../helper.rb", __FILE__)
1
+ require_relative 'helper'
2
2
 
3
3
  module TestObject
4
4
  extend self
@@ -27,7 +27,6 @@ class TestWorker < QC::Worker
27
27
  end
28
28
 
29
29
  class WorkerTest < QCTest
30
-
31
30
  def test_work
32
31
  QC.enqueue("TestObject.no_args")
33
32
  worker = TestWorker.new
@@ -122,7 +121,7 @@ class WorkerTest < QCTest
122
121
  t.join
123
122
  end
124
123
 
125
- def test_worker_ueses_one_conn
124
+ def test_worker_uses_one_conn
126
125
  skip "This test is broken and needs to be fixed."
127
126
 
128
127
  QC.enqueue("TestObject.no_args")
@@ -178,50 +177,43 @@ class WorkerTest < QCTest
178
177
  end
179
178
 
180
179
  def test_init_worker_with_arg
181
- set_database 'postgres:///invalid'
182
-
183
- conn = PG::Connection.connect(dbname: 'queue_classic_test')
184
- QC::Worker.new connection: conn
180
+ with_database 'postgres:///invalid' do
181
+ conn = PG::Connection.connect(dbname: 'queue_classic_test')
182
+ QC::Worker.new connection: conn
185
183
 
186
- conn.close
187
- ensure
188
- reset_database
184
+ conn.close
185
+ end
189
186
  end
190
187
 
191
188
  def test_init_worker_with_database_url
192
- set_database ENV['DATABASE_URL'] || ENV['QC_DATABASE_URL']
189
+ with_database ENV['DATABASE_URL'] || ENV['QC_DATABASE_URL'] do
190
+ worker = QC::Worker.new
191
+ QC.enqueue("TestObject.no_args")
192
+ worker.lock_job
193
193
 
194
- worker = QC::Worker.new
195
- QC.enqueue("TestObject.no_args")
196
- worker.lock_job
197
-
198
- QC.default_conn_adapter.disconnect
199
- ensure
200
- reset_database
194
+ QC.default_conn_adapter.disconnect
195
+ end
201
196
  end
202
197
 
203
198
  def test_init_worker_without_conn
204
- set_database nil
205
-
206
- assert_raises(ArgumentError) { QC::Worker.new }
207
-
208
- ensure
209
- reset_database
199
+ with_database nil do
200
+ assert_raises(ArgumentError) { QC::Worker.new }
201
+ end
210
202
  end
211
203
 
212
204
  private
213
205
 
214
- def set_database(url)
215
- @database_url = ENV['DATABASE_URL']
216
- @qc_database_url = ENV['QC_DATABASE_URL']
206
+ def with_database(url)
207
+ original_conn_adapter = QC.default_conn_adapter
208
+ original_database_url = ENV['DATABASE_URL']
209
+ original_qc_database_url = ENV['QC_DATABASE_URL']
210
+
217
211
  ENV['DATABASE_URL'] = ENV['QC_DATABASE_URL'] = url
218
- @conn_adapter = QC.default_conn_adapter
219
212
  QC.default_conn_adapter = nil
220
- end
221
-
222
- def reset_database
223
- ENV['DATABASE_URL'] = @database_url
224
- ENV['QC_DATABASE_URL'] = @qc_database_url
225
- QC.default_conn_adapter = @conn_adapter
213
+ yield
214
+ ensure
215
+ ENV['DATABASE_URL'] = original_database_url
216
+ ENV['QC_DATABASE_URL'] = original_qc_database_url
217
+ QC.default_conn_adapter = original_conn_adapter
226
218
  end
227
219
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: queue_classic
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.2.0.RC1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Smith (♠ ace hacker)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-17 00:00:00.000000000 Z
11
+ date: 2016-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg
@@ -38,19 +38,29 @@ executables: []
38
38
  extensions: []
39
39
  extra_rdoc_files: []
40
40
  files:
41
+ - ".gitignore"
42
+ - ".travis.yml"
43
+ - CONTRIBUTING.md
44
+ - Gemfile
45
+ - LICENSE.txt
41
46
  - README.md
47
+ - Rakefile
48
+ - changelog
42
49
  - lib/generators/queue_classic/install_generator.rb
43
50
  - lib/generators/queue_classic/templates/add_queue_classic.rb
44
51
  - lib/generators/queue_classic/templates/update_queue_classic_3_0_0.rb
45
52
  - lib/generators/queue_classic/templates/update_queue_classic_3_0_2.rb
46
53
  - lib/generators/queue_classic/templates/update_queue_classic_3_1_0.rb
47
54
  - lib/queue_classic.rb
55
+ - lib/queue_classic/config.rb
48
56
  - lib/queue_classic/conn_adapter.rb
49
57
  - lib/queue_classic/queue.rb
50
58
  - lib/queue_classic/railtie.rb
51
59
  - lib/queue_classic/setup.rb
52
60
  - lib/queue_classic/tasks.rb
61
+ - lib/queue_classic/version.rb
53
62
  - lib/queue_classic/worker.rb
63
+ - queue_classic.gemspec
54
64
  - sql/create_table.sql
55
65
  - sql/ddl.sql
56
66
  - sql/downgrade_from_3_0_0.sql
@@ -59,7 +69,9 @@ files:
59
69
  - sql/update_to_3_0_0.sql
60
70
  - sql/update_to_3_1_0.sql
61
71
  - test/benchmark_test.rb
72
+ - test/config_test.rb
62
73
  - test/helper.rb
74
+ - test/helper.sql
63
75
  - test/lib/queue_classic_rails_connection_test.rb
64
76
  - test/lib/queue_classic_test.rb
65
77
  - test/queue_test.rb
@@ -79,17 +91,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
79
91
  version: '0'
80
92
  required_rubygems_version: !ruby/object:Gem::Requirement
81
93
  requirements:
82
- - - ">="
94
+ - - ">"
83
95
  - !ruby/object:Gem::Version
84
- version: '0'
96
+ version: 1.3.1
85
97
  requirements: []
86
98
  rubyforge_project:
87
- rubygems_version: 2.4.5
99
+ rubygems_version: 2.4.5.1
88
100
  signing_key:
89
101
  specification_version: 4
90
102
  summary: Simple, efficient worker queue for Ruby & PostgreSQL.
91
103
  test_files:
92
104
  - test/benchmark_test.rb
105
+ - test/config_test.rb
106
+ - test/helper.rb
107
+ - test/helper.sql
93
108
  - test/lib/queue_classic_rails_connection_test.rb
94
109
  - test/lib/queue_classic_test.rb
95
110
  - test/queue_test.rb