Skip to content

Commit 6f86c1f

Browse files
committed
finished
1 parent 8b698a3 commit 6f86c1f

File tree

5 files changed

+108
-500
lines changed

5 files changed

+108
-500
lines changed

src/main/java/com/example/FakeNtfyConnection.java

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,39 @@
33
import java.io.File;
44
import java.util.ArrayList;
55
import java.util.List;
6+
import java.util.Objects;
67
import java.util.function.Consumer;
78

9+
/**
10+
* A fake implementation of {@link NtfyConnection} for testing purposes.
11+
* Stores sent messages and files in memory and simulates incoming messages.
12+
*/
813
public class FakeNtfyConnection implements NtfyConnection {
14+
915
private final List<String> sentMessages = new ArrayList<>();
1016
private final List<File> sentFiles = new ArrayList<>();
1117
private Consumer<NtfyMessageDto> messageHandler;
1218
private boolean shouldSucceed = true;
1319

1420
/**
15-
* Sends a text message
16-
* @param message the message text to send
17-
* @return true if operation should succeed (based on shouldSucceed flag), false otherwise
21+
* Sends a text message.
22+
* Stores the message in memory and returns success based on {@link #shouldSucceed}.
23+
*
24+
* @param message the message to send
25+
* @return true if operation succeeds, false otherwise
1826
*/
1927
@Override
2028
public boolean send(String message) {
21-
sentMessages.add(message);
29+
sentMessages.add(Objects.requireNonNull(message));
2230
return shouldSucceed;
2331
}
2432

2533
/**
26-
* Sends a file
27-
* @param file the file to send, must exist and not be null
28-
* @return true if file exists and operation should succeed, false otherwise
34+
* Sends a file.
35+
* Stores the file in memory if it exists and returns success based on {@link #shouldSucceed}.
36+
*
37+
* @param file the file to send
38+
* @return true if file exists and operation succeeds, false otherwise
2939
*/
3040
@Override
3141
public boolean sendFile(File file) {
@@ -37,17 +47,21 @@ public boolean sendFile(File file) {
3747
}
3848

3949
/**
40-
* Sets up the message handler for receiving incoming messages
41-
* @param handler the consumer that will process incoming NtfyMessageDto objects
50+
* Registers a message handler to receive incoming messages.
51+
* Only the last registered handler will be active.
52+
*
53+
* @param handler the consumer that handles incoming messages
4254
*/
4355
@Override
4456
public void receive(Consumer<NtfyMessageDto> handler) {
45-
this.messageHandler = handler;
57+
this.messageHandler = Objects.requireNonNull(handler);
4658
}
4759

4860
/**
49-
* Simulates an incoming message for testing purposes
50-
* @param message the message DTO to simulate as incoming
61+
* Simulates an incoming message.
62+
* Calls the registered handler if present.
63+
*
64+
* @param message the message to simulate
5165
*/
5266
public void simulateIncomingMessage(NtfyMessageDto message) {
5367
if (messageHandler != null) {
@@ -56,35 +70,38 @@ public void simulateIncomingMessage(NtfyMessageDto message) {
5670
}
5771

5872
/**
59-
* Gets all sent messages for verification
60-
* @return a copy of the list of sent messages
73+
* Returns a copy of all sent messages for verification.
74+
*
75+
* @return list of sent messages
6176
*/
6277
public List<String> getSentMessages() {
6378
return new ArrayList<>(sentMessages);
6479
}
6580

6681
/**
67-
* Gets all sent files for verification
68-
* @return a copy of the list of sent files
82+
* Returns a copy of all sent files for verification.
83+
*
84+
* @return list of sent files
6985
*/
7086
public List<File> getSentFiles() {
7187
return new ArrayList<>(sentFiles);
7288
}
7389

7490
/**
75-
* Configures whether operations should succeed or fail
76-
* @param shouldSucceed true to make operations return success, false to make them fail
91+
* Configures whether operations should succeed.
92+
*
93+
* @param shouldSucceed true for success, false for failure
7794
*/
7895
public void setShouldSucceed(boolean shouldSucceed) {
7996
this.shouldSucceed = shouldSucceed;
8097
}
8198

8299
/**
83-
* Clears all stored state and resets the connection
100+
* Clears all stored messages, files, and the message handler.
84101
*/
85102
public void clear() {
86103
sentMessages.clear();
87104
sentFiles.clear();
88105
messageHandler = null;
89106
}
90-
}
107+
}
-22.3 KB
Binary file not shown.

src/test/java/com/example/FakeNtfyConnectionTest.java

Lines changed: 15 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -16,248 +16,159 @@
1616
import 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
*/
2322
class 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

Comments
 (0)