1616import static org .assertj .core .api .Assertions .assertThat ;
1717
1818/**
19- * Unit tests for {@link FakeNtfyConnection} class.
20- * Tests the fake implementation of {@link NtfyConnection} used for isolated testing.
21- * Verifies message sending, file sending, message receiving, and state management behavior.
19+ * Unit tests for {@link FakeNtfyConnection}.
20+ * Verifies sending messages/files, receiving messages, and internal state behavior.
2221 */
2322class FakeNtfyConnectionTest {
2423
2524 private FakeNtfyConnection fakeConnection ;
2625
27- /**
28- * Sets up a fresh {@link FakeNtfyConnection} instance before each test method.
29- */
3026 @ BeforeEach
3127 void setUp () {
3228 fakeConnection = new FakeNtfyConnection ();
3329 }
3430
35- /**
36- * Tests that the send method stores messages and returns success when configured to succeed.
37- */
3831 @ Test
3932 @ DisplayName ("send should store message and return success" )
4033 void send_ShouldStoreMessageAndReturnSuccess () {
41- // Act
4234 boolean result = fakeConnection .send ("Test message" );
43-
44- // Assert
4535 assertThat (result ).isTrue ();
4636 assertThat (fakeConnection .getSentMessages ()).containsExactly ("Test message" );
4737 }
4838
49- /**
50- * Tests that the send method returns false when the connection is configured to fail.
51- */
5239 @ Test
5340 @ DisplayName ("send should return false when shouldSucceed is false" )
5441 void send_ShouldReturnFalse_WhenShouldSucceedIsFalse () {
55- // Arrange
5642 fakeConnection .setShouldSucceed (false );
57-
58- // Act
5943 boolean result = fakeConnection .send ("Test message" );
60-
61- // Assert
6244 assertThat (result ).isFalse ();
6345 assertThat (fakeConnection .getSentMessages ()).containsExactly ("Test message" );
6446 }
6547
66- /**
67- * Tests that sendFile stores files and returns success for existing files.
68- *
69- * @param tempDir the temporary directory provided by JUnit for creating test files
70- * @throws IOException if test file creation fails
71- */
7248 @ Test
7349 @ DisplayName ("sendFile should store file and return success for existing file" )
7450 void sendFile_ShouldStoreFileAndReturnSuccess (@ TempDir java .nio .file .Path tempDir ) throws IOException {
75- // Arrange
7651 File testFile = tempDir .resolve ("test.txt" ).toFile ();
7752 Files .writeString (testFile .toPath (), "Test content" );
7853
79- // Act
8054 boolean result = fakeConnection .sendFile (testFile );
8155
82- // Assert
8356 assertThat (result ).isTrue ();
8457 assertThat (fakeConnection .getSentFiles ()).containsExactly (testFile );
8558 }
8659
87- /**
88- * Tests that sendFile returns false for non-existent files.
89- */
9060 @ Test
9161 @ DisplayName ("sendFile should return false for non-existent file" )
9262 void sendFile_ShouldReturnFalseForNonExistentFile () {
93- // Act
9463 boolean result = fakeConnection .sendFile (new File ("non_existent.txt" ));
95-
96- // Assert
9764 assertThat (result ).isFalse ();
9865 assertThat (fakeConnection .getSentFiles ()).isEmpty ();
9966 }
10067
101- /**
102- * Tests that sendFile returns false for null file references.
103- */
10468 @ Test
10569 @ DisplayName ("sendFile should return false for null file" )
10670 void sendFile_ShouldReturnFalseForNullFile () {
107- // Act
10871 boolean result = fakeConnection .sendFile (null );
109-
110- // Assert
11172 assertThat (result ).isFalse ();
11273 assertThat (fakeConnection .getSentFiles ()).isEmpty ();
11374 }
11475
115- /**
116- * Tests that the receive method properly sets the message handler.
117- */
11876 @ Test
11977 @ DisplayName ("receive should set message handler" )
12078 void receive_ShouldSetMessageHandler () {
121- // Arrange
12279 AtomicBoolean handlerCalled = new AtomicBoolean (false );
123-
124- // Act
12580 fakeConnection .receive (message -> handlerCalled .set (true ));
126-
127- // Assert - simulate a message to verify handler is set
12881 fakeConnection .simulateIncomingMessage (new NtfyMessageDto ("1" , 123L , "message" , "topic" , "test" , null , null ));
12982 assertThat (handlerCalled .get ()).isTrue ();
13083 }
13184
132- /**
133- * Tests that simulateIncomingMessage calls the registered handler with the correct message.
134- */
13585 @ Test
13686 @ DisplayName ("simulateIncomingMessage should call registered handler" )
13787 void simulateIncomingMessage_ShouldCallRegisteredHandler () {
138- // Arrange
13988 AtomicReference <NtfyMessageDto > receivedMessage = new AtomicReference <>();
14089 fakeConnection .receive (receivedMessage ::set );
141- NtfyMessageDto testMessage = new NtfyMessageDto ("1" , 123L , "message" , "topic" , "test" , null , null );
14290
143- // Act
91+ NtfyMessageDto testMessage = new NtfyMessageDto ( "1" , 123L , "message" , "topic" , "test" , null , null );
14492 fakeConnection .simulateIncomingMessage (testMessage );
14593
146- // Assert
14794 assertThat (receivedMessage .get ()).isEqualTo (testMessage );
14895 }
14996
150- /**
151- * Tests that simulateIncomingMessage doesn't throw exceptions when no handler is registered.
152- */
15397 @ Test
15498 @ DisplayName ("simulateIncomingMessage should not throw when no handler is set" )
15599 void simulateIncomingMessage_ShouldNotThrow_WhenNoHandlerIsSet () {
156- // Arrange
157100 NtfyMessageDto testMessage = new NtfyMessageDto ("1" , 123L , "message" , "topic" , "test" , null , null );
158-
159- // Act & Assert - Should not throw exception
160- fakeConnection .simulateIncomingMessage (testMessage );
101+ fakeConnection .simulateIncomingMessage (testMessage ); // No exception should occur
161102 }
162103
163- /**
164- * Tests that the clear method resets all internal state including messages, files, and handler.
165- */
166104 @ Test
167105 @ DisplayName ("clear should reset all state" )
168106 void clear_ShouldResetAllState () {
169- // Arrange
170- fakeConnection .receive (msg -> {
171- });
172107 fakeConnection .send ("Test message" );
108+ fakeConnection .receive (msg -> {});
173109
174- // Act
175110 fakeConnection .clear ();
176111
177- // Assert
178112 assertThat (fakeConnection .getSentMessages ()).isEmpty ();
179113 assertThat (fakeConnection .getSentFiles ()).isEmpty ();
180- // Verify simulateIncomingMessage doesn't crash after clear
114+
115+ // simulateIncomingMessage should not throw
181116 fakeConnection .simulateIncomingMessage (new NtfyMessageDto ("1" , 123L , "message" , "topic" , "test" , null , null ));
182117 }
183118
184- /**
185- * Tests that getSentMessages returns a defensive copy, not the internal list.
186- */
187119 @ Test
188120 @ DisplayName ("getSentMessages should return copy of sent messages" )
189121 void getSentMessages_ShouldReturnCopy () {
190- // Arrange
191122 fakeConnection .send ("Message 1" );
192123
193- // Act
194124 List <String > messages1 = fakeConnection .getSentMessages ();
195125 fakeConnection .send ("Message 2" );
196126 List <String > messages2 = fakeConnection .getSentMessages ();
197127
198- // Assert
199128 assertThat (messages1 ).containsExactly ("Message 1" );
200129 assertThat (messages2 ).containsExactly ("Message 1" , "Message 2" );
201130 }
202131
203- /**
204- * Tests that getSentFiles returns a defensive copy, not the internal list.
205- *
206- * @param tempDir the temporary directory provided by JUnit for creating test files
207- * @throws IOException if test file creation fails
208- */
209132 @ Test
210133 @ DisplayName ("getSentFiles should return copy of sent files" )
211134 void getSentFiles_ShouldReturnCopy (@ TempDir java .nio .file .Path tempDir ) throws IOException {
212- // Arrange
213135 File file1 = tempDir .resolve ("file1.txt" ).toFile ();
214136 Files .writeString (file1 .toPath (), "Content 1" );
215137 fakeConnection .sendFile (file1 );
216138
217- // Act
218139 List <File > files1 = fakeConnection .getSentFiles ();
140+
219141 File file2 = tempDir .resolve ("file2.txt" ).toFile ();
220142 Files .writeString (file2 .toPath (), "Content 2" );
221143 fakeConnection .sendFile (file2 );
144+
222145 List <File > files2 = fakeConnection .getSentFiles ();
223146
224- // Assert
225147 assertThat (files1 ).containsExactly (file1 );
226148 assertThat (files2 ).containsExactly (file1 , file2 );
227149 }
228150
229- /**
230- * Tests that the connection should succeed by default.
231- */
232151 @ Test
233152 @ DisplayName ("shouldSucceed should be true by default" )
234153 void shouldSucceed_ShouldBeTrueByDefault () {
235- // Act
236- boolean result = fakeConnection .send ("Test" );
237-
238- // Assert
239- assertThat (result ).isTrue ();
154+ assertThat (fakeConnection .send ("Test" )).isTrue ();
240155 }
241156
242- /**
243- * Tests that multiple message handlers can be set sequentially and each receives the appropriate messages.
244- */
245157 @ Test
246158 @ DisplayName ("should handle multiple message handlers sequentially" )
247159 void shouldHandleMultipleMessageHandlers_Sequentially () {
248- // Arrange
249160 AtomicInteger handler1Count = new AtomicInteger (0 );
250161 AtomicInteger handler2Count = new AtomicInteger (0 );
251162
252- // Act - Set first handler, send message, then set second handler
163+ // First handler
253164 fakeConnection .receive (msg -> handler1Count .incrementAndGet ());
254165 fakeConnection .simulateIncomingMessage (new NtfyMessageDto ("1" , 123L , "message" , "topic" , "test1" , null , null ));
255166
167+ // Second handler overwrites first
256168 fakeConnection .receive (msg -> handler2Count .incrementAndGet ());
257169 fakeConnection .simulateIncomingMessage (new NtfyMessageDto ("2" , 124L , "message" , "topic" , "test2" , null , null ));
258170
259- // Assert
260- assertThat (handler1Count .get ()).isEqualTo (1 ); // Should only receive first message
261- assertThat (handler2Count .get ()).isEqualTo (1 ); // Should only receive second message
171+ assertThat (handler1Count .get ()).isEqualTo (1 ); // Received only the first message
172+ assertThat (handler2Count .get ()).isEqualTo (1 ); // Received only the second message
262173 }
263- }
174+ }
0 commit comments