Skip to content

Commit 5a6b509

Browse files
committed
hopefully fixed test
1 parent fc05207 commit 5a6b509

6 files changed

Lines changed: 79 additions & 77 deletions

File tree

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@
7373
<version>2.0.12</version>
7474
<scope>test</scope>
7575
</dependency>
76+
<dependency>
77+
<groupId>org.awaitility</groupId>
78+
<artifactId>awaitility</artifactId>
79+
<version>4.3.0</version>
80+
<scope>test</scope>
81+
</dependency>
7682
</dependencies>
7783
<build>
7884
<plugins>

src/main/java/com/example/ChatModel.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,18 @@ public ChatModel(NtfyConnection ntfyConnection) {
1616
public ObservableList<ChatMessage> getMessages() {
1717
return messages;
1818
}
19+
1920
public void sendMessage(String text) {
2021
ntfyConnection.send(text);
2122
}
22-
public void startReceiving() {
2323

24+
public void startReceiving() {
2425
ntfyConnection.receive(ntfyDto -> {
25-
26-
2726
ChatMessage chatMsg = new ChatMessage(ntfyDto.message(), ntfyDto.time());
2827

29-
3028
Platform.runLater(() -> {
3129
messages.add(chatMsg);
3230
});
3331
});
3432
}
35-
}
36-
37-
38-
33+
}
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package com.example;
22

3+
import java.util.concurrent.CompletableFuture;
34
import java.util.function.Consumer;
45

56
public interface NtfyConnection {
6-
7-
public boolean send(String message);
8-
9-
public void receive(Consumer<NtfyMessageDto> messageHandler);
10-
7+
CompletableFuture<Void> send(String message);
8+
void receive(Consumer<NtfyMessageDto> messageHandler);
119
}

src/main/java/com/example/NtfyConnectionImpl.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
import io.github.cdimascio.dotenv.Dotenv;
44
import tools.jackson.databind.ObjectMapper;
55

6-
import java.io.IOException;
76
import java.net.URI;
87
import java.net.http.HttpClient;
98
import java.net.http.HttpRequest;
109
import java.net.http.HttpResponse;
11-
import java.util.Objects;
10+
import java.util.concurrent.CompletableFuture;
1211
import java.util.function.Consumer;
1312

1413
public class NtfyConnectionImpl implements NtfyConnection {
@@ -40,13 +39,13 @@ public NtfyConnectionImpl(String hostName) {
4039
}
4140

4241
@Override
43-
public boolean send(String message) {
42+
public CompletableFuture<Void> send(String message) {
4443
HttpRequest httpRequest = HttpRequest.newBuilder()
4544
.POST(HttpRequest.BodyPublishers.ofString(message))
4645
.uri(URI.create(hostName + "/mytopic"))
4746
.build();
4847

49-
http.sendAsync(httpRequest, HttpResponse.BodyHandlers.discarding())
48+
return http.sendAsync(httpRequest, HttpResponse.BodyHandlers.discarding())
5049
.thenAccept(response -> {
5150
if (response.statusCode() >= 200 && response.statusCode() < 300) {
5251
System.out.println("Message sent successfully.");
@@ -58,8 +57,6 @@ public boolean send(String message) {
5857
System.err.println("Network issue: " + e.getMessage());
5958
return null;
6059
});
61-
62-
return true;
6360
}
6461

6562
@Override
@@ -71,9 +68,15 @@ public void receive(Consumer<NtfyMessageDto> messageHandler) {
7168

7269
http.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofLines())
7370
.thenAccept(response -> response.body()
74-
.map(s ->
75-
mapper.readValue(s, NtfyMessageDto.class))
76-
.filter(message -> message.event().equals("message"))
71+
.map(s -> {
72+
try {
73+
return mapper.readValue(s, NtfyMessageDto.class);
74+
} catch (Exception e) {
75+
System.err.println("Failed to parse message: " + e.getMessage());
76+
return null;
77+
}
78+
})
79+
.filter(messageDto -> messageDto != null && messageDto.event().equals("message"))
7780
.peek(System.out::println)
7881
.forEach(messageHandler));
7982
}
Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,86 @@
11
package com.example;
22

33

4+
import com.github.tomakehurst.wiremock.client.WireMock;
45
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo;
56
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
7+
import org.junit.jupiter.api.BeforeAll;
8+
import org.junit.jupiter.api.DisplayName;
69
import org.junit.jupiter.api.Test;
10+
import org.awaitility.Awaitility;
11+
import javafx.application.Platform;
12+
13+
import java.time.Duration;
714

815
import static com.github.tomakehurst.wiremock.client.WireMock.*;
916
import static org.assertj.core.api.Assertions.assertThat;
1017

11-
import static org.junit.jupiter.api.Assertions.assertEquals;
1218

1319
@WireMockTest
1420
class ChatModelTest {
15-
static {
21+
22+
@BeforeAll
23+
static void initJavaFX() {
1624
try {
17-
javafx.application.Platform.startup(() -> {
18-
});
25+
Platform.startup(() -> {});
26+
Platform.setImplicitExit(false);
1927
} catch (IllegalStateException e) {
20-
2128
}
2229
}
2330

2431

2532
@Test
26-
void sendMessage_callsConnectionWithCorrectMessage() {
27-
33+
void sendMessageCallsConnectionWithMessagesToSend() {
2834
var spy = new NtfyConnectionSpy();
29-
3035
var model = new ChatModel(spy);
31-
String messageToSend = "Hello Ntfy World!";
32-
36+
String messageToSend = "Test Message 123";
3337

3438
model.sendMessage(messageToSend);
3539

36-
37-
assertThat(spy.sentMessage).isEqualTo(messageToSend);
40+
assertThat(spy.message).isEqualTo(messageToSend);
3841
}
3942

40-
4143
@Test
44+
void sendMessageToFakeServer_viaNtfyConnectionImpl(WireMockRuntimeInfo wmRunTimeInfo) throws InterruptedException {
45+
var con = new NtfyConnectionImpl("http://localhost:" + wmRunTimeInfo.getHttpPort());
46+
var model = new ChatModel(con);
47+
String messageToSend = "Test Message 123";
4248

43-
void receiveMessage_addsToObservableList() throws Exception {
44-
45-
var spy = new NtfyConnectionSpy();
46-
var model = new ChatModel(spy);
47-
48-
model.startReceiving();
49+
stubFor(post("/mytopic").willReturn(ok()));
4950

50-
long testTimestamp = System.currentTimeMillis() / 1000;
51-
String receivedText = "Ett inkommande chattmeddelande";
51+
model.sendMessage(messageToSend);
5252

53-
spy.simulateMessageArrival(receivedText, testTimestamp);
53+
Thread.sleep(500);
5454

55+
WireMock.verify(postRequestedFor(urlEqualTo("/mytopic"))
56+
.withRequestBody(matching(messageToSend)));
57+
}
5558

56-
org.testfx.util.WaitForAsyncUtils.waitForFxEvents();
5759

58-
assertThat(model.getMessages()).hasSize(1);
59-
ChatMessage received = model.getMessages().get(0);
60+
@Test
61+
void checkReceivedMessagesAfterSendingAMessageToAFakeServer(WireMockRuntimeInfo wmRunTimeInfo) {
62+
var conImp = new NtfyConnectionImpl("http://localhost:" + wmRunTimeInfo.getHttpPort());
6063

61-
assertEquals(receivedText, received.content());
62-
assertEquals(testTimestamp, received.timestamp());
63-
}
64+
String expectedMessage = "Async Data Received";
65+
long expectedTimestamp = System.currentTimeMillis();
6466

65-
@Test
66-
void sendMessageToFakeServer_viaNtfyConnectionImpl(WireMockRuntimeInfo wmRuntimeInfo) throws InterruptedException {
67-
var con = new NtfyConnectionImpl("http://localhost:" + wmRuntimeInfo.getHttpPort());
68-
var model = new ChatModel(con);
69-
String messageToSend = "Test Body Content";
67+
stubFor(get("/mytopic/json")
68+
.willReturn(aResponse()
69+
.withHeader("Content-type", "application/json")
70+
.withBody("{\"event\": \"message\",\"message\": \"" + expectedMessage + "\", \"time\": \"" + expectedTimestamp + "\"}")));
7071

71-
stubFor(post("/mytopic").willReturn(ok()));
72+
var model = new ChatModel(conImp);
73+
model.startReceiving();
7274

73-
model.sendMessage(messageToSend);
75+
Awaitility.await()
76+
.atMost(Duration.ofSeconds(4))
77+
.pollInterval(Duration.ofMillis(100))
78+
.untilAsserted(() -> {
79+
assertThat(model.getMessages()).isNotEmpty();
7480

75-
Thread.sleep(500);
81+
assertThat(model.getMessages().getLast().content()).isEqualTo(expectedMessage);
7682

77-
verify(postRequestedFor(urlEqualTo("/mytopic"))
78-
.withRequestBody(matching(messageToSend)));
83+
assertThat(model.getMessages().getLast().timestamp()).isEqualTo(expectedTimestamp);
84+
});
7985
}
80-
}
86+
}
Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,28 @@
11
package com.example;
22

3+
import java.util.concurrent.CompletableFuture;
34
import java.util.function.Consumer;
45

56
public class NtfyConnectionSpy implements NtfyConnection {
67

8+
String message;
9+
private Consumer<NtfyMessageDto> messageHandler;
710

8-
public String sentMessage = null;
9-
10-
11-
public Consumer<NtfyMessageDto> receivedHandler = null;
1211

1312
@Override
14-
public boolean send(String message) {
15-
this.sentMessage = message; // Fångar meddelandet
16-
return true;
13+
public CompletableFuture<Void> send(String message) {
14+
this.message = message;
15+
return CompletableFuture.completedFuture(null);
1716
}
1817

1918
@Override
2019
public void receive(Consumer<NtfyMessageDto> messageHandler) {
21-
this.receivedHandler = messageHandler; // Fångar hanteringsfunktionen
20+
this.messageHandler = messageHandler;
2221
}
2322

2423

25-
public void simulateMessageArrival(String message, long timestamp) {
26-
if (receivedHandler != null) {
27-
// Skapa ett fejkat DTO och skicka det till den fångade hanteraren (Consumer)
28-
NtfyMessageDto fakeDto = new NtfyMessageDto(
29-
"fake-id", timestamp, "message", "mytopic", message
30-
);
31-
receivedHandler.accept(fakeDto);
32-
}
24+
public void simulateIncomingMessage(NtfyMessageDto messageDto){
25+
if (messageHandler != null)
26+
messageHandler.accept(messageDto);
3327
}
3428
}

0 commit comments

Comments
 (0)