From 50ea002641dbe56cb9eca8c852145f83b672b56e Mon Sep 17 00:00:00 2001 From: Hunter Jackson Date: Wed, 20 Sep 2023 09:40:28 -0400 Subject: [PATCH 1/2] conversationId has a specific meaning for whatsapp --- src/main/java/com/meta/chatbridge/message/Message.java | 6 +++--- src/main/java/com/meta/chatbridge/message/MessageStack.java | 4 ++-- src/main/java/com/meta/chatbridge/store/MemoryStore.java | 2 +- src/test/java/com/meta/chatbridge/message/MessageTest.java | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/meta/chatbridge/message/Message.java b/src/main/java/com/meta/chatbridge/message/Message.java index cdebcb3..fd9e674 100644 --- a/src/main/java/com/meta/chatbridge/message/Message.java +++ b/src/main/java/com/meta/chatbridge/message/Message.java @@ -31,14 +31,14 @@ enum Role { SYSTEM } - static Identifier conversationId(Identifier id1, Identifier id2) { + static Identifier threadId(Identifier id1, Identifier id2) { if (id1.compareTo(id2) <= 0) { return Identifier.from(id1.toString() + '|' + id2); } return Identifier.from(id2.toString() + '|' + id1); } - default Identifier conversationId() { - return conversationId(senderId(), recipientId()); + default Identifier threadId() { + return threadId(senderId(), recipientId()); } } diff --git a/src/main/java/com/meta/chatbridge/message/MessageStack.java b/src/main/java/com/meta/chatbridge/message/MessageStack.java index ee4a801..3b38b89 100644 --- a/src/main/java/com/meta/chatbridge/message/MessageStack.java +++ b/src/main/java/com/meta/chatbridge/message/MessageStack.java @@ -32,8 +32,8 @@ private MessageStack(MessageStack old, T newMessage) { Objects.requireNonNull(newMessage); messageFactory = old.messageFactory; Preconditions.checkArgument( - old.tail().conversationId().equals(newMessage.conversationId()), - "all messages in a stack must have the same conversation id"); + old.tail().threadId().equals(newMessage.threadId()), + "all messages in a stack must have the same thread id"); List messages = old.messages; if (newMessage.timestamp().isBefore(old.tail().timestamp())) { this.messages = diff --git a/src/main/java/com/meta/chatbridge/store/MemoryStore.java b/src/main/java/com/meta/chatbridge/store/MemoryStore.java index d91704d..997fb30 100644 --- a/src/main/java/com/meta/chatbridge/store/MemoryStore.java +++ b/src/main/java/com/meta/chatbridge/store/MemoryStore.java @@ -34,7 +34,7 @@ public MessageStack add(T message) { return this.store .asMap() .compute( - message.conversationId(), + message.threadId(), (k, v) -> { if (v == null) { return MessageStack.of(message); diff --git a/src/test/java/com/meta/chatbridge/message/MessageTest.java b/src/test/java/com/meta/chatbridge/message/MessageTest.java index 775ef10..26ab876 100644 --- a/src/test/java/com/meta/chatbridge/message/MessageTest.java +++ b/src/test/java/com/meta/chatbridge/message/MessageTest.java @@ -17,14 +17,14 @@ class MessageTest { @Test - void conversationId() { + void threadId() { Instant timestamp = Instant.now(); Identifier id0 = Identifier.from("0"); Identifier id1 = Identifier.from("1"); Identifier id2 = Identifier.from("2"); Message message = new FBMessage(timestamp, id0, id1, id2, "", Message.Role.ASSISTANT); Message response = new FBMessage(timestamp, id0, id2, id1, "", Message.Role.ASSISTANT); - assertThat(message.conversationId()).isEqualTo(response.conversationId()); + assertThat(message.threadId()).isEqualTo(response.threadId()); message = new FBMessage( @@ -42,6 +42,6 @@ void conversationId() { Identifier.from("234"), "", Message.Role.ASSISTANT); - assertThat(message.conversationId()).isNotEqualTo(response.conversationId()); + assertThat(message.threadId()).isNotEqualTo(response.threadId()); } } From 975bd5fb0eda44aebe05d126f3f9706cfb805ba6 Mon Sep 17 00:00:00 2001 From: Hunter Jackson Date: Wed, 20 Sep 2023 09:47:28 -0400 Subject: [PATCH 2/2] rename MessageStack to ThreadState it very apparent this was a confusing name while presenting this code --- .../java/com/meta/chatbridge/Service.java | 10 ++--- .../com/meta/chatbridge/llm/LLMPlugin.java | 4 +- .../com/meta/chatbridge/llm/OpenAIPlugin.java | 12 +++--- .../{MessageStack.java => ThreadState.java} | 18 ++++----- .../com/meta/chatbridge/store/ChatStore.java | 4 +- .../meta/chatbridge/store/MemoryStore.java | 10 ++--- .../llm/DummyFBMessageLLMHandler.java | 24 ++++++------ .../meta/chatbridge/llm/OpenAIPluginTest.java | 38 +++++++++---------- .../message/FBMessageHandlerTest.java | 4 +- .../chatbridge/store/MemoryStoreTest.java | 12 +++--- ...ageStackTest.java => ThreadStateTest.java} | 18 ++++----- 11 files changed, 77 insertions(+), 77 deletions(-) rename src/main/java/com/meta/chatbridge/message/{MessageStack.java => ThreadState.java} (83%) rename src/test/java/com/meta/chatbridge/store/{MessageStackTest.java => ThreadStateTest.java} (91%) diff --git a/src/main/java/com/meta/chatbridge/Service.java b/src/main/java/com/meta/chatbridge/Service.java index 12bdf18..4883805 100644 --- a/src/main/java/com/meta/chatbridge/Service.java +++ b/src/main/java/com/meta/chatbridge/Service.java @@ -11,7 +11,7 @@ import com.meta.chatbridge.llm.LLMPlugin; import com.meta.chatbridge.message.Message; import com.meta.chatbridge.message.MessageHandler; -import com.meta.chatbridge.message.MessageStack; +import com.meta.chatbridge.message.ThreadState; import com.meta.chatbridge.store.ChatStore; import io.javalin.Javalin; import io.javalin.http.Context; @@ -44,8 +44,8 @@ void handle(Context ctx) { List messages = handler.processRequest(ctx); // TODO: once we have a non-volatile store, on startup send stored but not replied to messages for (T m : messages) { - MessageStack stack = store.add(m); - executorService.submit(() -> execute(stack)); + ThreadState thread = store.add(m); + executorService.submit(() -> execute(thread)); } } @@ -61,10 +61,10 @@ public MessageHandler messageHandler() { return this.handler; } - private void execute(MessageStack stack) { + private void execute(ThreadState thread) { T llmResponse; try { - llmResponse = llmPlugin.handle(stack); + llmResponse = llmPlugin.handle(thread); } catch (IOException e) { LOGGER.error("failed to communicate with LLM", e); return; diff --git a/src/main/java/com/meta/chatbridge/llm/LLMPlugin.java b/src/main/java/com/meta/chatbridge/llm/LLMPlugin.java index 1cb18c1..d102603 100644 --- a/src/main/java/com/meta/chatbridge/llm/LLMPlugin.java +++ b/src/main/java/com/meta/chatbridge/llm/LLMPlugin.java @@ -9,10 +9,10 @@ package com.meta.chatbridge.llm; import com.meta.chatbridge.message.Message; -import com.meta.chatbridge.message.MessageStack; +import com.meta.chatbridge.message.ThreadState; import java.io.IOException; public interface LLMPlugin { - T handle(MessageStack messageStack) throws IOException; + T handle(ThreadState threadState) throws IOException; } diff --git a/src/main/java/com/meta/chatbridge/llm/OpenAIPlugin.java b/src/main/java/com/meta/chatbridge/llm/OpenAIPlugin.java index 1600fb2..bda9f74 100644 --- a/src/main/java/com/meta/chatbridge/llm/OpenAIPlugin.java +++ b/src/main/java/com/meta/chatbridge/llm/OpenAIPlugin.java @@ -17,7 +17,7 @@ import com.knuddels.jtokkit.api.Encoding; import com.meta.chatbridge.message.Message; import com.meta.chatbridge.message.Message.Role; -import com.meta.chatbridge.message.MessageStack; +import com.meta.chatbridge.message.ThreadState; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -126,8 +126,8 @@ private Optional pruneMessages(ArrayNode messages, @Nullable JsonNode } @Override - public T handle(MessageStack messageStack) throws IOException { - T fromUser = messageStack.tail(); + public T handle(ThreadState threadState) throws IOException { + T fromUser = threadState.tail(); ObjectNode body = MAPPER.createObjectNode(); body.put("model", config.model().properties().name()) @@ -156,7 +156,7 @@ public T handle(MessageStack messageStack) throws IOException { .addObject() .put("role", Role.SYSTEM.toString().toLowerCase()) .put("content", m)); - for (T message : messageStack.messages()) { + for (T message : threadState.messages()) { messages .addObject() .put("role", message.role().toString().toLowerCase()) @@ -165,7 +165,7 @@ public T handle(MessageStack messageStack) throws IOException { Optional prunedMessages = pruneMessages(messages, null); if (prunedMessages.isEmpty()) { - return messageStack.newMessageFromBot( + return threadState.newMessageFromBot( Instant.now(), "I'm sorry but that request was too long for me."); } body.set("messages", prunedMessages.get()); @@ -186,6 +186,6 @@ public T handle(MessageStack messageStack) throws IOException { Instant timestamp = Instant.ofEpochSecond(responseBody.get("created").longValue()); JsonNode choice = responseBody.get("choices").get(0); String messageContent = choice.get("message").get("content").textValue(); - return messageStack.newMessageFromBot(timestamp, messageContent); + return threadState.newMessageFromBot(timestamp, messageContent); } } diff --git a/src/main/java/com/meta/chatbridge/message/MessageStack.java b/src/main/java/com/meta/chatbridge/message/ThreadState.java similarity index 83% rename from src/main/java/com/meta/chatbridge/message/MessageStack.java rename to src/main/java/com/meta/chatbridge/message/ThreadState.java index 3b38b89..355ba82 100644 --- a/src/main/java/com/meta/chatbridge/message/MessageStack.java +++ b/src/main/java/com/meta/chatbridge/message/ThreadState.java @@ -17,23 +17,23 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -public class MessageStack { +public class ThreadState { private final List messages; private final MessageFactory messageFactory; - private MessageStack(T message) { + private ThreadState(T message) { Objects.requireNonNull(message); this.messages = ImmutableList.of(message); messageFactory = MessageFactory.instance(message); } /** Constructor that exists to support the with method */ - private MessageStack(MessageStack old, T newMessage) { + private ThreadState(ThreadState old, T newMessage) { Objects.requireNonNull(newMessage); messageFactory = old.messageFactory; Preconditions.checkArgument( old.tail().threadId().equals(newMessage.threadId()), - "all messages in a stack must have the same thread id"); + "all messages in a thread must have the same thread id"); List messages = old.messages; if (newMessage.timestamp().isBefore(old.tail().timestamp())) { this.messages = @@ -46,11 +46,11 @@ private MessageStack(MessageStack old, T newMessage) { Preconditions.checkArgument( old.userId().equals(userId()) && old.botId().equals(botId()), - "userId and botId not consistent with this message stack"); + "userId and botId not consistent with this thread state"); } - public static MessageStack of(T message) { - return new MessageStack<>(message); + public static ThreadState of(T message) { + return new ThreadState<>(message); } public Identifier userId() { @@ -78,8 +78,8 @@ public T newMessageFromUser(Instant timestamp, String message, Identifier instan return messageFactory.newMessage(timestamp, message, userId(), botId(), instanceId, Role.USER); } - public MessageStack with(T message) { - return new MessageStack<>(this, message); + public ThreadState with(T message) { + return new ThreadState<>(this, message); } public List messages() { diff --git a/src/main/java/com/meta/chatbridge/store/ChatStore.java b/src/main/java/com/meta/chatbridge/store/ChatStore.java index 428c70a..f1ddf29 100644 --- a/src/main/java/com/meta/chatbridge/store/ChatStore.java +++ b/src/main/java/com/meta/chatbridge/store/ChatStore.java @@ -9,7 +9,7 @@ package com.meta.chatbridge.store; import com.meta.chatbridge.message.Message; -import com.meta.chatbridge.message.MessageStack; +import com.meta.chatbridge.message.ThreadState; /** * This class is in charge of both maintaining a chat history and managing a queue of conversations @@ -22,5 +22,5 @@ */ public interface ChatStore { - MessageStack add(T message); + ThreadState add(T message); } diff --git a/src/main/java/com/meta/chatbridge/store/MemoryStore.java b/src/main/java/com/meta/chatbridge/store/MemoryStore.java index 997fb30..17f16ae 100644 --- a/src/main/java/com/meta/chatbridge/store/MemoryStore.java +++ b/src/main/java/com/meta/chatbridge/store/MemoryStore.java @@ -12,32 +12,32 @@ import com.google.common.cache.CacheBuilder; import com.meta.chatbridge.Identifier; import com.meta.chatbridge.message.Message; -import com.meta.chatbridge.message.MessageStack; +import com.meta.chatbridge.message.ThreadState; import java.time.Duration; public class MemoryStore implements ChatStore { - private final Cache> store; + private final Cache> store; MemoryStore(MemoryStoreConfig config) { this.store = CacheBuilder.newBuilder() .expireAfterWrite(Duration.ofHours(config.storageDurationHours())) .maximumWeight((long) (config.storageCapacityMb() * Math.pow(2, 20))) // megabytes - .>weigher( + .>weigher( (k, v) -> v.messages().stream().map(m -> m.message().length()).reduce(0, Integer::sum)) .build(); } @Override - public MessageStack add(T message) { + public ThreadState add(T message) { return this.store .asMap() .compute( message.threadId(), (k, v) -> { if (v == null) { - return MessageStack.of(message); + return ThreadState.of(message); } return v.with(message); }); diff --git a/src/test/java/com/meta/chatbridge/llm/DummyFBMessageLLMHandler.java b/src/test/java/com/meta/chatbridge/llm/DummyFBMessageLLMHandler.java index 689d3fe..3189f39 100644 --- a/src/test/java/com/meta/chatbridge/llm/DummyFBMessageLLMHandler.java +++ b/src/test/java/com/meta/chatbridge/llm/DummyFBMessageLLMHandler.java @@ -11,7 +11,7 @@ import com.meta.chatbridge.Identifier; import com.meta.chatbridge.message.FBMessage; import com.meta.chatbridge.message.Message; -import com.meta.chatbridge.message.MessageStack; +import com.meta.chatbridge.message.ThreadState; import java.time.Instant; import java.util.concurrent.*; import org.checkerframework.checker.nullness.qual.Nullable; @@ -19,28 +19,28 @@ public class DummyFBMessageLLMHandler implements LLMPlugin { private final String dummyLLMResponse; - private final BlockingQueue> receivedMessageStacks = + private final BlockingQueue> receivedThreadStates = new LinkedBlockingDeque<>(); public DummyFBMessageLLMHandler(String dummyLLMResponse) { this.dummyLLMResponse = dummyLLMResponse; } - public MessageStack take(int waitMs) throws InterruptedException { - @Nullable MessageStack value = - receivedMessageStacks.poll(waitMs, TimeUnit.MILLISECONDS); + public ThreadState take(int waitMs) throws InterruptedException { + @Nullable ThreadState value = + receivedThreadStates.poll(waitMs, TimeUnit.MILLISECONDS); if (value == null) { throw new RuntimeException("unable to remove item form queue in under " + waitMs + "ms"); } return value; } - public MessageStack take() throws InterruptedException { - return receivedMessageStacks.take(); + public ThreadState take() throws InterruptedException { + return receivedThreadStates.take(); } - public @Nullable MessageStack poll() { - return receivedMessageStacks.poll(); + public @Nullable ThreadState poll() { + return receivedThreadStates.poll(); } public String dummyResponse() { @@ -48,10 +48,10 @@ public String dummyResponse() { } @Override - public FBMessage handle(MessageStack messageStack) { - receivedMessageStacks.add(messageStack); + public FBMessage handle(ThreadState threadState) { + receivedThreadStates.add(threadState); FBMessage inbound = - messageStack.messages().stream() + threadState.messages().stream() .filter(m -> m.role() == Message.Role.USER) .findAny() .orElseThrow(); diff --git a/src/test/java/com/meta/chatbridge/llm/OpenAIPluginTest.java b/src/test/java/com/meta/chatbridge/llm/OpenAIPluginTest.java index 8c1443f..68cc0ca 100644 --- a/src/test/java/com/meta/chatbridge/llm/OpenAIPluginTest.java +++ b/src/test/java/com/meta/chatbridge/llm/OpenAIPluginTest.java @@ -54,8 +54,8 @@ public class OpenAIPluginTest { public static final JsonNode SAMPLE_RESPONSE = MAPPER.createObjectNode(); private static final String PATH = "/"; private static final String TEST_MESSAGE = "this is a test message"; - private static final MessageStack STACK = - MessageStack.of( + private static final ThreadState THREAD = + ThreadState.of( MessageFactory.instance(FBMessage.class) .newMessage( Instant.now(), @@ -110,10 +110,10 @@ void sampleValid(OpenAIModel model) throws IOException, InterruptedException { String apiKey = UUID.randomUUID().toString(); OpenAIConfig config = OpenAIConfig.builder(model, apiKey).build(); OpenAIPlugin plugin = new OpenAIPlugin(config).endpoint(endpoint); - FBMessage message = plugin.handle(STACK); + FBMessage message = plugin.handle(THREAD); assertThat(message.message()).isEqualTo(TEST_MESSAGE); assertThat(message.role()).isSameAs(Role.ASSISTANT); - assertThatCode(() -> STACK.with(message)).doesNotThrowAnyException(); + assertThatCode(() -> THREAD.with(message)).doesNotThrowAnyException(); @Nullable OutboundRequest or = openAIRequests.poll(500, TimeUnit.MILLISECONDS); assertThat(or).isNotNull(); assertThat(or.headerMap().get("Authorization")).isNotNull().isEqualTo("Bearer " + apiKey); @@ -139,10 +139,10 @@ void validConfigValues(OpenAIConfigTest.ConfigItem configItem) OpenAIConfig config = ConfigurationUtils.jsonMapper().convertValue(minimalConfig, OpenAIConfig.class); OpenAIPlugin plugin = new OpenAIPlugin(config).endpoint(endpoint); - FBMessage message = plugin.handle(STACK); + FBMessage message = plugin.handle(THREAD); assertThat(message.message()).isEqualTo(TEST_MESSAGE); assertThat(message.role()).isSameAs(Role.ASSISTANT); - assertThatCode(() -> STACK.with(message)).doesNotThrowAnyException(); + assertThatCode(() -> THREAD.with(message)).doesNotThrowAnyException(); @Nullable OutboundRequest or = openAIRequests.poll(500, TimeUnit.MILLISECONDS); assertThat(or).isNotNull(); assertThat(or.headerMap().get("Authorization")) @@ -173,13 +173,13 @@ void contextTooBig() throws IOException { OpenAIConfig config = OpenAIConfig.builder(OpenAIModel.GPT35TURBO, "lkjasdlkjasdf").maxInputTokens(100).build(); OpenAIPlugin plugin = new OpenAIPlugin(config).endpoint(endpoint); - MessageStack stack = - STACK.with( - STACK.newMessageFromUser( + ThreadState thread = + THREAD.with( + THREAD.newMessageFromUser( Instant.now(), Stream.generate(() -> "0123456789").limit(100).collect(Collectors.joining()), Identifier.random())); - FBMessage response = plugin.handle(stack); + FBMessage response = plugin.handle(thread); assertThat(response.message()).isEqualTo("I'm sorry but that request was too long for me."); assertThat(openAIRequests).hasSize(0); } @@ -189,8 +189,8 @@ void orderedCorrectly() throws IOException, InterruptedException { OpenAIConfig config = OpenAIConfig.builder(OpenAIModel.GPT35TURBO, "lkjasdlkjasdf").maxInputTokens(100).build(); OpenAIPlugin plugin = new OpenAIPlugin(config).endpoint(endpoint); - MessageStack stack = - MessageStack.of( + ThreadState thread = + ThreadState.of( MessageFactory.instance(FBMessage.class) .newMessage( Instant.now(), @@ -199,20 +199,20 @@ void orderedCorrectly() throws IOException, InterruptedException { Identifier.random(), Identifier.random(), Role.SYSTEM)); - stack = stack.with(stack.newMessageFromUser(Instant.now(), "2", Identifier.from(2))); - stack = stack.with(stack.newMessageFromUser(Instant.now(), "3", Identifier.from(3))); - stack = stack.with(stack.newMessageFromUser(Instant.now(), "4", Identifier.from(4))); - plugin.handle(stack); + thread = thread.with(thread.newMessageFromUser(Instant.now(), "2", Identifier.from(2))); + thread = thread.with(thread.newMessageFromUser(Instant.now(), "3", Identifier.from(3))); + thread = thread.with(thread.newMessageFromUser(Instant.now(), "4", Identifier.from(4))); + plugin.handle(thread); @Nullable OutboundRequest or = openAIRequests.poll(500, TimeUnit.MILLISECONDS); assertThat(or).isNotNull(); JsonNode body = MAPPER.readTree(or.body()); - for (int i = 0; i < stack.messages().size(); i++) { - FBMessage stackMessage = stack.messages().get(i); + for (int i = 0; i < thread.messages().size(); i++) { + FBMessage threadMessage = thread.messages().get(i); JsonNode sentMessage = body.get("messages").get(i); assertSoftly( s -> - s.assertThat(stackMessage.message()) + s.assertThat(threadMessage.message()) .isEqualTo(sentMessage.get("content").textValue())); } } diff --git a/src/test/java/com/meta/chatbridge/message/FBMessageHandlerTest.java b/src/test/java/com/meta/chatbridge/message/FBMessageHandlerTest.java index b84d624..28c92cf 100644 --- a/src/test/java/com/meta/chatbridge/message/FBMessageHandlerTest.java +++ b/src/test/java/com/meta/chatbridge/message/FBMessageHandlerTest.java @@ -214,7 +214,7 @@ void invalidMessage( .isEqualTo(0); // make sure the message wasn't processed and stored assertThat(requests).hasSize(0); } else { - MessageStack stack = llmHandler.take(500); + ThreadState thread = llmHandler.take(500); JsonNode messageObject = PARSED_SAMPLE_MESSAGE.get("entry").get(0).get("messaging").get(0); String messageText = messageObject.get("message").get("text").textValue(); String mid = messageObject.get("message").get("mid").textValue(); @@ -222,7 +222,7 @@ void invalidMessage( Identifier.from(messageObject.get("recipient").get("id").textValue()); Identifier senderId = Identifier.from(messageObject.get("sender").get("id").textValue()); Instant timestamp = Instant.ofEpochMilli(messageObject.get("timestamp").longValue()); - assertThat(stack.messages()) + assertThat(thread.messages()) .hasSize(1) .allSatisfy(m -> assertThat(m.message()).isEqualTo(messageText)) .allSatisfy(m -> assertThat(m.instanceId().toString()).isEqualTo(mid)) diff --git a/src/test/java/com/meta/chatbridge/store/MemoryStoreTest.java b/src/test/java/com/meta/chatbridge/store/MemoryStoreTest.java index 13a5801..8484664 100644 --- a/src/test/java/com/meta/chatbridge/store/MemoryStoreTest.java +++ b/src/test/java/com/meta/chatbridge/store/MemoryStoreTest.java @@ -28,16 +28,16 @@ void test() { FBMessage message = messageFactory.newMessage( Instant.now(), "", senderId, recipientId, Identifier.random(), Message.Role.SYSTEM); - MessageStack stack = memoryStore.add(message); + ThreadState thread = memoryStore.add(message); assertThat(memoryStore.size()).isEqualTo(1); - assertThat(stack.messages()).hasSize(1).contains(message); + assertThat(thread.messages()).hasSize(1).contains(message); FBMessage message2 = messageFactory.newMessage( Instant.now(), "", recipientId, senderId, Identifier.random(), Message.Role.USER); - stack = memoryStore.add(message2); + thread = memoryStore.add(message2); assertThat(memoryStore.size()).isEqualTo(1); - assertThat(stack.messages()).hasSize(2).contains(message, message2); + assertThat(thread.messages()).hasSize(2).contains(message, message2); FBMessage message3 = messageFactory.newMessage( @@ -47,8 +47,8 @@ void test() { Identifier.random(), Identifier.random(), Message.Role.SYSTEM); - stack = memoryStore.add(message3); + thread = memoryStore.add(message3); assertThat(memoryStore.size()).isEqualTo(2); - assertThat(stack.messages()).hasSize(1).contains(message3); + assertThat(thread.messages()).hasSize(1).contains(message3); } } diff --git a/src/test/java/com/meta/chatbridge/store/MessageStackTest.java b/src/test/java/com/meta/chatbridge/store/ThreadStateTest.java similarity index 91% rename from src/test/java/com/meta/chatbridge/store/MessageStackTest.java rename to src/test/java/com/meta/chatbridge/store/ThreadStateTest.java index 429f823..2eab38e 100644 --- a/src/test/java/com/meta/chatbridge/store/MessageStackTest.java +++ b/src/test/java/com/meta/chatbridge/store/ThreadStateTest.java @@ -14,11 +14,11 @@ import com.meta.chatbridge.message.FBMessage; import com.meta.chatbridge.message.Message; import com.meta.chatbridge.message.MessageFactory; -import com.meta.chatbridge.message.MessageStack; +import com.meta.chatbridge.message.ThreadState; import java.time.Instant; import org.junit.jupiter.api.Test; -class MessageStackTest { +class ThreadStateTest { private static final MessageFactory FACTORY = MessageFactory.instance(FBMessage.class); @@ -34,14 +34,14 @@ void orderPreservation() { Identifier.random(), Message.Role.USER); - MessageStack ms = MessageStack.of(message1); + ThreadState ms = ThreadState.of(message1); FBMessage message2 = ms.newMessageFromBot(start.plusSeconds(1), "other sample message"); ms = ms.with(message2); assertThat(ms.messages()).hasSize(2); assertThat(ms.messages().get(0)).isSameAs(message1); assertThat(ms.messages().get(1)).isSameAs(message2); - ms = MessageStack.of(message1); + ms = ThreadState.of(message1); assertThat(ms.messages()).hasSize(1); ms = ms.with(message2); assertThat(ms.messages()).hasSize(2); @@ -60,7 +60,7 @@ void orderCorrection() { Identifier.random(), Identifier.random(), Message.Role.USER); - MessageStack ms = MessageStack.of(message2); + ThreadState ms = ThreadState.of(message2); FBMessage message1 = ms.newMessageFromBot(start.minusSeconds(1), "other sample message"); @@ -68,7 +68,7 @@ void orderCorrection() { assertThat(ms.messages().get(0)).isSameAs(message1); assertThat(ms.messages().get(1)).isSameAs(message2); - ms = MessageStack.of(message2); + ms = ThreadState.of(message2); assertThat(ms.messages()).hasSize(1); ms = ms.with(message1); assertThat(ms.messages()).hasSize(2); @@ -88,7 +88,7 @@ void botAndUserId() { Identifier.random(), Message.Role.USER); - MessageStack ms = MessageStack.of(message1); + ThreadState ms = ThreadState.of(message1); FBMessage message2 = FACTORY.newMessage( start, @@ -98,7 +98,7 @@ void botAndUserId() { Identifier.random(), Message.Role.ASSISTANT); - final MessageStack finalMs = ms; + final ThreadState finalMs = ms; assertThatCode(() -> finalMs.with(message2)).doesNotThrowAnyException(); assertThatCode(() -> finalMs.with(finalMs.newMessageFromBot(start, ""))) .doesNotThrowAnyException(); @@ -116,7 +116,7 @@ void botAndUserId() { Identifier.random(), Message.Role.USER); - MessageStack finalMs1 = ms; + ThreadState finalMs1 = ms; assertThatThrownBy(() -> finalMs1.with(mDifferentSenderId)) .isInstanceOf(IllegalArgumentException.class);