-
Notifications
You must be signed in to change notification settings - Fork 31
Expand file tree
/
Copy pathtest_ticker_returns_contract.sql
More file actions
168 lines (148 loc) · 5.54 KB
/
test_ticker_returns_contract.sql
File metadata and controls
168 lines (148 loc) · 5.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
-- test_ticker_returns_contract.sql -- pin pgque.ticker / force_next_tick return shapes
-- Copyright 2026 Nikolay Samokhvalov. Apache-2.0 license.
--
-- ticker(queue text) -> bigint -- new tick id, or NULL when throttled
-- ticker() -> bigint -- count of queues that ticked
-- force_next_tick(queue) -> bigint -- last tick id; raises for unknown / paused / external queues
-- force_tick(queue) -> compatibility alias, covered by test_force_next_tick_alias.sql
-- ticker(unknown) RAISES 'no such queue'
-- ticker(paused) RAISES 'Ticker has been paused'
-- ticker(external) RAISES 'external tick source'
\set ON_ERROR_STOP on
-- Test 1: ticker(queue) returns bigint > 0 when a tick is created.
do $$ begin
perform pgque.create_queue('test_ticker_ret');
perform pgque.subscribe('test_ticker_ret', 'rt1');
end $$;
do $$ begin
perform pgque.send('test_ticker_ret', 'rt.test', '{"n":1}'::jsonb);
end $$;
do $$
declare
v_force bigint;
v_tid bigint;
begin
v_force := pgque.force_next_tick('test_ticker_ret');
assert v_force > 0, 'force_next_tick must return a positive tick id';
-- ticker(queue) may return NULL when throttled; if non-null, must be > 0.
v_tid := pgque.ticker('test_ticker_ret');
assert v_tid is null or v_tid > 0, 'ticker(queue) tick id must be positive when present';
raise notice 'PASS: ticker(queue) and force_next_tick(queue) return bigint';
end $$;
-- Test 2: zero-arg ticker() returns count of queues that ticked.
do $$
declare
v_count bigint;
begin
perform pgque.create_queue('test_ticker_ret_b');
perform pgque.send('test_ticker_ret_b', 'rt.test', '{"n":1}'::jsonb);
perform pgque.force_next_tick('test_ticker_ret_b');
perform pgque.send('test_ticker_ret', 'rt.again', '{"n":2}'::jsonb);
perform pgque.force_next_tick('test_ticker_ret');
v_count := pgque.ticker();
assert v_count >= 0, 'ticker() count must be a non-negative bigint';
raise notice 'PASS: ticker() returns bigint count (got %)', v_count;
end $$;
-- Test 3: force_next_tick(unknown) raises. This is the hardened contract
-- from #195; silent NULL would hide queue-name bugs in manual schedulers.
do $$
declare
v_ok boolean := false;
begin
begin
perform pgque.force_next_tick('test_ticker_does_not_exist_xyz');
exception when others then
assert sqlerrm like '%test_ticker_does_not_exist_xyz%' or sqlerrm like '%not found%' or sqlerrm like '%no such queue%',
'unexpected message: ' || sqlerrm;
v_ok := true;
end;
assert v_ok, 'force_next_tick(unknown) did not raise';
raise notice 'PASS: force_next_tick(unknown queue) raises';
end $$;
-- Test 4: ticker(unknown) raises 'no such queue'.
do $$
declare
v_ok boolean := false;
begin
begin
perform pgque.ticker('test_ticker_does_not_exist_xyz');
exception when raise_exception then
assert sqlerrm like '%no such queue%', 'unexpected message: ' || sqlerrm;
v_ok := true;
end;
assert v_ok, 'ticker(unknown) did not raise';
raise notice 'PASS: ticker(unknown queue) raises no-such-queue';
end $$;
-- Test 5: ticker(paused) and force_next_tick(paused) both raise.
do $$ begin
perform pgque.create_queue('test_ticker_paused');
perform pgque.set_queue_config('test_ticker_paused', 'ticker_paused', 'true');
end $$;
do $$
declare
v_ok boolean := false;
begin
begin
perform pgque.ticker('test_ticker_paused');
exception when raise_exception then
assert sqlerrm like '%paused%', 'unexpected message: ' || sqlerrm;
v_ok := true;
end;
assert v_ok, 'ticker(paused) did not raise';
v_ok := false;
begin
perform pgque.force_next_tick('test_ticker_paused');
exception when others then
assert sqlerrm like '%paused%' or sqlerrm like '%test_ticker_paused%',
'unexpected message: ' || sqlerrm;
v_ok := true;
end;
assert v_ok, 'force_next_tick(paused) did not raise';
raise notice 'PASS: paused queue rejects ticker and force_next_tick';
end $$;
-- Test 6: ticker(external) and force_next_tick(external) both raise.
do $$ begin
perform pgque.create_queue('test_ticker_external');
perform pgque.set_queue_config('test_ticker_external', 'external_ticker', 'true');
end $$;
do $$
declare
v_ok boolean := false;
begin
begin
perform pgque.ticker('test_ticker_external');
exception when raise_exception then
assert sqlerrm like '%external%', 'unexpected message: ' || sqlerrm;
v_ok := true;
end;
assert v_ok, 'ticker(external) did not raise';
v_ok := false;
begin
perform pgque.force_next_tick('test_ticker_external');
exception when others then
assert sqlerrm like '%external%' or sqlerrm like '%test_ticker_external%',
'unexpected message: ' || sqlerrm;
v_ok := true;
end;
assert v_ok, 'force_next_tick(external) did not raise';
raise notice 'PASS: external-ticker queue rejects ticker and force_next_tick';
end $$;
-- Test 7: zero-arg ticker() skips paused / external queues without raising.
-- A regression that lets exceptions escape the dispatcher would silently
-- drop every queue after the first paused/external one.
do $$
declare
v_count bigint;
begin
v_count := pgque.ticker();
assert v_count >= 0, 'ticker() with paused/external queues must remain non-negative';
raise notice 'PASS: ticker() skips paused/external queues without raising';
end $$;
do $$ begin
perform pgque.unsubscribe('test_ticker_ret', 'rt1');
perform pgque.drop_queue('test_ticker_ret');
perform pgque.drop_queue('test_ticker_ret_b');
perform pgque.drop_queue('test_ticker_paused');
perform pgque.drop_queue('test_ticker_external');
end $$;
\echo 'PASS: test_ticker_returns_contract'