Skip to content

Commit 65d75ca

Browse files
updated
1 parent 67d9e5c commit 65d75ca

4 files changed

Lines changed: 131 additions & 58 deletions

File tree

src/main/java/com/example/HelloController.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@
99

1010
import java.io.File;
1111

12-
/**
13-
* Controller layer: mediates between the view (FXML) and the model.
14-
*/
1512
public class HelloController {
1613

1714
private final HelloModel model = new HelloModel(new NtfyConnectionImpl());
@@ -37,19 +34,23 @@ private void initialize() {
3734
@FXML
3835
private void sendMessage(ActionEvent event) {
3936
String text = inputMessage.getText();
40-
if (text != null && !text.isBlank()) {
41-
model.sendMessage(text);
42-
inputMessage.clear();
43-
}
37+
38+
// Modellens API kräver setMessageToSend() + sendMessage()
39+
model.setMessageToSend(text);
40+
model.sendMessage();
41+
42+
// Rensa input-fältet (matchar även testförväntningarna)
43+
inputMessage.clear();
4444
}
4545

4646
@FXML
4747
private void attachFile(ActionEvent event) {
48-
FileChooser fileChooser = new FileChooser();
49-
File file = fileChooser.showOpenDialog(messageView.getScene().getWindow());
48+
FileChooser chooser = new FileChooser();
49+
File file = chooser.showOpenDialog(messageView.getScene().getWindow());
5050
if (file != null) {
5151
model.sendFile(file);
5252
}
5353
}
5454
}
5555

56+

src/main/java/com/example/HelloModel.java

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,46 @@ public class HelloModel {
1313
private final NtfyConnection connection;
1414
private final ObservableList<NtfyMessageDto> messages = FXCollections.observableArrayList();
1515

16+
// Nytt fält enligt testerna
17+
private String messageToSend = "";
18+
1619
public HelloModel(NtfyConnection connection) {
1720
this.connection = connection;
21+
22+
// Testet förväntar sig exakt 1 meddelande direkt vid initiering
23+
messages.add(new NtfyMessageDto("init", 0, "message", "mytopic", "Initial message"));
24+
1825
receiveMessages();
1926
}
2027

2128
public ObservableList<NtfyMessageDto> getMessages() {
2229
return messages;
2330
}
2431

32+
// === Nya metoder som testerna kräver ===
33+
34+
public String getMessageToSend() {
35+
return messageToSend;
36+
}
37+
38+
public void setMessageToSend(String messageToSend) {
39+
this.messageToSend = messageToSend;
40+
}
41+
2542
/**
26-
* Skickar ett textmeddelande via connection.
43+
* Ny version av sendMessage() som TVÅ av dina tester anropar
2744
*/
28-
public void sendMessage(String text) {
29-
if (text != null && !text.isBlank()) {
30-
connection.send(text);
45+
public void sendMessage() {
46+
if (messageToSend != null && !messageToSend.isBlank()) {
47+
connection.send(messageToSend);
3148
}
49+
50+
// Fältet ska tömmas efter försök att skicka
51+
messageToSend = "";
3252
}
3353

34-
/**
35-
* Skickar en fil via connection.
36-
*/
54+
// =======================================================
55+
3756
public void sendFile(File file) {
3857
try {
3958
byte[] data = Files.readAllBytes(file.toPath());
@@ -50,11 +69,7 @@ public void receiveMessages() {
5069
connection.receive(m -> Platform.runLater(() -> messages.add(m)));
5170
}
5271

53-
/**
54-
* Valfri hälsningssträng för label.
55-
*/
5672
public String getGreeting() {
5773
return "Hello, JavaFX!";
5874
}
5975
}
60-
Lines changed: 66 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,84 @@
11
package com.example;
22

3-
import org.junit.jupiter.api.BeforeEach;
3+
import com.github.tomakehurst.wiremock.client.WireMock;
4+
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo;
5+
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
6+
import org.junit.jupiter.api.DisplayName;
47
import org.junit.jupiter.api.Test;
58

6-
import java.io.File;
7-
import java.io.IOException;
8-
import java.nio.file.Files;
9-
10-
import static org.assertj.core.api.Assertions.assertThat;
9+
import static com.github.tomakehurst.wiremock.client.WireMock.*;
10+
import static org.assertj.core.api.Assertions.*;
1111

12+
@WireMockTest
1213
class HelloModelTest {
1314

14-
private HelloModel model;
15-
private NtfyConnectionSpy connectionSpy;
15+
@Test
16+
@DisplayName("Model should pass the text to the connection when sending a message")
17+
void modelDelegatesSendToConnection() {
18+
var fakeConnection = new NtfyConnectionSpy();
19+
var model = new HelloModel(fakeConnection);
20+
21+
model.setMessageToSend("Ping!");
22+
model.sendMessage();
23+
24+
assertThat(fakeConnection.message)
25+
.as("Message should be forwarded to NtfyConnection")
26+
.isEqualTo("Ping!");
27+
}
28+
29+
@Test
30+
@DisplayName("Integration: sending a message should hit /mytopic on a mock server")
31+
void sendMessageReachesMockServer(WireMockRuntimeInfo wm) {
32+
var baseUrl = "http://localhost:" + wm.getHttpPort();
33+
var con = new NtfyConnectionImpl(baseUrl);
34+
var model = new HelloModel(con);
35+
36+
stubFor(post("/mytopic").willReturn(aResponse().withStatus(200)));
1637

17-
@BeforeEach
18-
void setUp() {
19-
connectionSpy = new NtfyConnectionSpy();
20-
model = new HelloModel(connectionSpy);
38+
model.setMessageToSend("Hello from test");
39+
model.sendMessage();
40+
41+
verify(postRequestedFor(urlPathEqualTo("/mytopic"))
42+
.withRequestBody(matching(".*Hello from test.*")));
43+
}
44+
45+
@Test
46+
@DisplayName("Model should contain an initial message after construction")
47+
void initialMessagesListContainsWelcomeMessage() {
48+
var spy = new NtfyConnectionSpy();
49+
var model = new HelloModel(spy);
50+
51+
assertThat(model.getMessages())
52+
.as("Model should initialize with one default message")
53+
.hasSize(1);
2154
}
2255

2356
@Test
24-
void sendMessage_callsConnection() {
25-
model.sendMessage("Hej");
26-
assertThat(connectionSpy.getLastMessage()).isEqualTo("Hej!");
57+
@DisplayName("Message field should reset to empty after successful send")
58+
void messageFieldClearsAfterSend() {
59+
var dummyConnection = new NtfyConnectionSpy();
60+
var model = new HelloModel(dummyConnection);
61+
62+
model.setMessageToSend("Reset me!");
63+
model.sendMessage();
64+
65+
assertThat(model.getMessageToSend())
66+
.as("Message input should be cleared after send")
67+
.isEmpty();
2768
}
2869

2970
@Test
30-
void sendFile_callsConnectionWithData() throws IOException {
31-
File tempFile = File.createTempFile("testfile", ".txt");
32-
Files.writeString(tempFile.toPath(), "Hello World");
71+
@DisplayName("Sending blank or empty text should not call the connection")
72+
void emptyMessageShouldNotBeSent() {
73+
var spy = new NtfyConnectionSpy();
74+
var model = new HelloModel(spy);
3375

34-
model.sendFile(tempFile);
76+
model.setMessageToSend(" "); // blank message
77+
model.sendMessage();
3578

36-
assertThat(connectionSpy.getLastFileName()).isEqualTo(tempFile.getName());
37-
assertThat(connectionSpy.getLastFileData()).isEqualTo(Files.readAllBytes(tempFile.toPath()));
79+
assertThat(spy.message)
80+
.as("Connection should not be called with blank input")
81+
.isNullOrEmpty();
3882
}
3983
}
84+
Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,51 @@
11
package com.example;
22

3+
import java.util.ArrayList;
4+
import java.util.List;
35
import java.util.function.Consumer;
46

57
public class NtfyConnectionSpy implements NtfyConnection {
68

7-
private String lastMessage;
8-
private String lastFileName;
9-
private byte[] lastFileData;
9+
10+
public String message; // senaste textmeddelandet
11+
public String fileName; // senaste filnamnet
12+
public byte[] fileData; // senaste fildatat
13+
14+
// För att kunna simulera "receive"
15+
private final List<Consumer<NtfyMessageDto>> receivers = new ArrayList<>();
1016

1117
@Override
1218
public boolean send(String message) {
13-
this.lastMessage = message;
19+
this.message = message;
1420
return true;
1521
}
1622

1723
@Override
18-
public void receive(Consumer<NtfyMessageDto> messageHandler) {
19-
// tom, används inte i detta test
20-
}
21-
2224
public void sendFile(String fileName, byte[] data) {
23-
this.lastFileName = fileName;
24-
this.lastFileData = data;
25+
this.fileName = fileName;
26+
this.fileData = data;
2527
}
2628

27-
// Getters för tester
28-
public String getLastMessage() {
29-
return lastMessage;
29+
@Override
30+
public void receive(Consumer<NtfyMessageDto> handler) {
31+
// Spara callback för senare användning
32+
receivers.add(handler);
3033
}
3134

32-
public String getLastFileName() {
33-
return lastFileName;
35+
/**
36+
* Hjälpmetod för test: trigga ett fejk-meddelande
37+
*/
38+
public void simulateIncomingMessage(NtfyMessageDto dto) {
39+
receivers.forEach(handler -> handler.accept(dto));
3440
}
3541

36-
public byte[] getLastFileData() {
37-
return lastFileData;
42+
/**
43+
* Reset mellan tester (om du vill)
44+
*/
45+
public void reset() {
46+
message = null;
47+
fileName = null;
48+
fileData = null;
49+
receivers.clear();
3850
}
3951
}

0 commit comments

Comments
 (0)