1+ <?php
2+
3+ use Goopil \RabbitRs \PhpClient ;
4+ use Goopil \RabbitRs \AmqpMessage ;
5+
6+ // ---------------------------------------------------------------------------------------------
7+ // TRANSACTION TESTS
8+ // ---------------------------------------------------------------------------------------------
9+
10+ test ('PhpChannel transaction methods work correctly ' , function () {
11+ // Description: Tests that PhpChannel transaction methods work correctly.
12+ $ c = mq_client ();
13+ $ ch = $ c ->openChannel ();
14+
15+ // Test tx_select
16+ expect ($ ch ->txSelect ())->toBeTrue ();
17+
18+ // Test tx_commit
19+ expect ($ ch ->txCommit ())->toBeTrue ();
20+
21+ // Test tx_rollback
22+ expect ($ ch ->txSelect ())->toBeTrue ();
23+ expect ($ ch ->txRollback ())->toBeTrue ();
24+
25+ $ ch ->close ();
26+ $ c ->close ();
27+ });
28+
29+ test ('PhpChannel transaction with publish and rollback ' , function () {
30+ // Description: Tests that messages published in a transaction can be rolled back.
31+ $ c = mq_client ();
32+ $ ch = $ c ->openChannel ();
33+
34+ // Declare a temporary queue for testing
35+ $ queue = 'test_transaction_queue_ ' . uniqid ();
36+ $ ch ->queueDeclare ($ queue , ['exclusive ' => true ]);
37+
38+ // First, publish a message without transaction to establish baseline
39+ $ message1 = new AmqpMessage ('normal_message ' );
40+ expect ($ ch ->basicPublish ('' , $ queue , $ message1 ))->toBeTrue ();
41+
42+ // Give some time for the message to be processed
43+ usleep (100000 ); // 100ms
44+
45+ // Verify the normal message is delivered
46+ $ delivery1 = $ ch ->basicGet ($ queue , ['no_ack ' => true ]);
47+ expect ($ delivery1 )->not ->toBeNull ();
48+ expect ($ delivery1 ->getBody ())->toBe ('normal_message ' );
49+
50+ // Start transaction
51+ expect ($ ch ->txSelect ())->toBeTrue ();
52+
53+ // Publish a message within the transaction
54+ $ message2 = new AmqpMessage ('transaction_test_message ' );
55+ expect ($ ch ->basicPublish ('' , $ queue , $ message2 ))->toBeTrue ();
56+
57+ // Rollback the transaction
58+ expect ($ ch ->txRollback ())->toBeTrue ();
59+
60+ // Verify that no additional message was delivered (queue should be empty)
61+ $ delivery2 = $ ch ->basicGet ($ queue , ['no_ack ' => true ]);
62+ expect ($ delivery2 )->toBeNull ();
63+
64+ $ ch ->close ();
65+ $ c ->close ();
66+ });
67+
68+ test ('PhpChannel transaction with publish and commit ' , function () {
69+ // Description: Tests that messages published in a transaction are delivered after commit.
70+ $ c = mq_client ();
71+ $ ch = $ c ->openChannel ();
72+
73+ // Declare a temporary queue for testing
74+ $ queue = 'test_transaction_queue_ ' . uniqid ();
75+ $ ch ->queueDeclare ($ queue , ['exclusive ' => true ]);
76+
77+ // First, verify queue is empty
78+ $ delivery = $ ch ->basicGet ($ queue , ['no_ack ' => true ]);
79+ expect ($ delivery )->toBeNull ();
80+
81+ // Start transaction
82+ expect ($ ch ->txSelect ())->toBeTrue ();
83+
84+ // Publish a message within the transaction
85+ $ message = new AmqpMessage ('transaction_test_message ' );
86+ expect ($ ch ->basicPublish ('' , $ queue , $ message ))->toBeTrue ();
87+
88+ // Verify message is not yet available (transaction not committed)
89+ $ delivery = $ ch ->basicGet ($ queue , ['no_ack ' => true ]);
90+ expect ($ delivery )->toBeNull ();
91+
92+ // Commit the transaction
93+ expect ($ ch ->txCommit ())->toBeTrue ();
94+
95+ // Give some time for the message to be processed
96+ usleep (100000 ); // 100ms
97+
98+ // Verify that the message was delivered (queue should contain the message)
99+ $ delivery = $ ch ->basicGet ($ queue , ['no_ack ' => true ]);
100+ expect ($ delivery )->not ->toBeNull ();
101+ expect ($ delivery ->getBody ())->toBe ('transaction_test_message ' );
102+
103+ $ ch ->close ();
104+ $ c ->close ();
105+ });
106+
107+ test ('PhpChannel transaction with multiple messages and rollback ' , function () {
108+ // Description: Tests that multiple messages published in a transaction can be rolled back.
109+ $ c = mq_client ();
110+ $ ch = $ c ->openChannel ();
111+
112+ // Declare a temporary queue for testing
113+ $ queue = 'test_transaction_queue_ ' . uniqid ();
114+ $ ch ->queueDeclare ($ queue , ['exclusive ' => true ]);
115+
116+ // First, verify queue is empty
117+ $ delivery = $ ch ->basicGet ($ queue , ['no_ack ' => true ]);
118+ expect ($ delivery )->toBeNull ();
119+
120+ // Start transaction
121+ expect ($ ch ->txSelect ())->toBeTrue ();
122+
123+ // Publish multiple messages within the transaction
124+ for ($ i = 0 ; $ i < 5 ; $ i ++) {
125+ $ message = new AmqpMessage ("transaction_message_ $ i " );
126+ expect ($ ch ->basicPublish ('' , $ queue , $ message ))->toBeTrue ();
127+ }
128+
129+ // Verify messages are not yet available (transaction not committed)
130+ $ delivery = $ ch ->basicGet ($ queue , ['no_ack ' => true ]);
131+ expect ($ delivery )->toBeNull ();
132+
133+ // Rollback the transaction
134+ expect ($ ch ->txRollback ())->toBeTrue ();
135+
136+ // Verify that no messages were delivered (queue should still be empty)
137+ $ delivery = $ ch ->basicGet ($ queue , ['no_ack ' => true ]);
138+ expect ($ delivery )->toBeNull ();
139+
140+ $ ch ->close ();
141+ $ c ->close ();
142+ });
143+
144+ test ('PhpChannel transaction with multiple messages and commit ' , function () {
145+ // Description: Tests that multiple messages published in a transaction are delivered after commit.
146+ $ c = mq_client ();
147+ $ ch = $ c ->openChannel ();
148+
149+ // Declare a temporary queue for testing
150+ $ queue = 'test_transaction_queue_ ' . uniqid ();
151+ $ ch ->queueDeclare ($ queue , ['exclusive ' => true ]);
152+
153+ // First, verify queue is empty
154+ $ delivery = $ ch ->basicGet ($ queue , ['no_ack ' => true ]);
155+ expect ($ delivery )->toBeNull ();
156+
157+ // Start transaction
158+ expect ($ ch ->txSelect ())->toBeTrue ();
159+
160+ // Publish multiple messages within the transaction
161+ $ messages = [];
162+ for ($ i = 0 ; $ i < 3 ; $ i ++) {
163+ $ message = new AmqpMessage ("transaction_message_ $ i " );
164+ $ messages [] = "transaction_message_ $ i " ;
165+ expect ($ ch ->basicPublish ('' , $ queue , $ message ))->toBeTrue ();
166+ }
167+
168+ // Verify messages are not yet available (transaction not committed)
169+ $ delivery = $ ch ->basicGet ($ queue , ['no_ack ' => true ]);
170+ expect ($ delivery )->toBeNull ();
171+
172+ // Commit the transaction
173+ expect ($ ch ->txCommit ())->toBeTrue ();
174+
175+ // Give some time for the messages to be processed
176+ usleep (200000 ); // 200ms
177+
178+ // Verify that all messages were delivered
179+ $ receivedMessages = [];
180+ for ($ i = 0 ; $ i < 3 ; $ i ++) {
181+ $ delivery = $ ch ->basicGet ($ queue , ['no_ack ' => true ]);
182+ expect ($ delivery )->not ->toBeNull ();
183+ $ receivedMessages [] = $ delivery ->getBody ();
184+ }
185+
186+ // Verify we received all messages
187+ expect (count ($ receivedMessages ))->toBe (3 );
188+
189+ // Verify queue is now empty
190+ $ delivery = $ ch ->basicGet ($ queue , ['no_ack ' => true ]);
191+ expect ($ delivery )->toBeNull ();
192+
193+ $ ch ->close ();
194+ $ c ->close ();
195+ });
0 commit comments