Skip to content

Commit 6d7dca3

Browse files
committed
add assistant chat test
Signed-off-by: alperozturk <[email protected]>
1 parent ca1b36b commit 6d7dca3

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
/*
2+
* Nextcloud Android Library
3+
*
4+
* SPDX-FileCopyrightText: 2025 Alper Ozturk <[email protected]>
5+
* SPDX-License-Identifier: MIT
6+
*/
7+
8+
package com.owncloud.android.lib.resources.assistant.chat
9+
10+
import com.owncloud.android.AbstractIT
11+
import com.owncloud.android.lib.resources.assistant.chat.model.ChatMessageRequest
12+
import com.owncloud.android.lib.resources.assistant.v2.GetTaskTypesRemoteOperationV2
13+
import com.owncloud.android.lib.resources.status.NextcloudVersion
14+
import junit.framework.TestCase.assertEquals
15+
import junit.framework.TestCase.assertTrue
16+
import org.junit.Assert.assertNotNull
17+
import org.junit.Before
18+
import org.junit.Test
19+
20+
class AssistantChatTests : AbstractIT() {
21+
private lateinit var sessionId: String
22+
23+
@Before
24+
fun before() {
25+
testOnlyOnServer(NextcloudVersion.nextcloud_30)
26+
sessionId = "test-session-${System.currentTimeMillis()}"
27+
}
28+
29+
@Test
30+
fun testCreateAndGetMessages() {
31+
val messageRequest =
32+
ChatMessageRequest(
33+
sessionId = sessionId,
34+
role = "human",
35+
content = "Hello assistant!",
36+
timestamp = System.currentTimeMillis()
37+
)
38+
39+
val createResult = CreateMessageRemoteOperation(messageRequest).execute(nextcloudClient)
40+
assertTrue(createResult.isSuccess)
41+
42+
val createdMessage = createResult.resultData!!
43+
assertEquals("Hello assistant!", createdMessage.content)
44+
assertEquals("human", createdMessage.role)
45+
assertEquals(sessionId.toLongOrNull(), createdMessage.sessionId)
46+
47+
// Get messages for session
48+
val getResult = GetMessagesRemoteOperation(sessionId).execute(nextcloudClient)
49+
assertTrue(getResult.isSuccess)
50+
51+
val messages = getResult.resultData
52+
assertTrue(messages.isNotEmpty())
53+
assertTrue(messages.any { it.id == createdMessage.id })
54+
}
55+
56+
@Test
57+
fun testDeleteMessage() {
58+
val messageRequest =
59+
ChatMessageRequest(
60+
sessionId = sessionId,
61+
role = "human",
62+
content = "Message to delete",
63+
timestamp = System.currentTimeMillis()
64+
)
65+
val createResult = CreateMessageRemoteOperation(messageRequest).execute(nextcloudClient)
66+
assertTrue(createResult.isSuccess)
67+
68+
val messageId = createResult.resultData!!.id.toString()
69+
70+
// Delete the message
71+
val deleteResult = DeleteMessageRemoteOperation(messageId, sessionId).execute(nextcloudClient)
72+
assertTrue(deleteResult.isSuccess)
73+
74+
// Ensure the message is gone
75+
val getResult = GetMessagesRemoteOperation(sessionId).execute(nextcloudClient)
76+
assertTrue(getResult.isSuccess)
77+
assertTrue(getResult.resultData!!.none { it.id.toString() == messageId })
78+
}
79+
80+
@Test
81+
fun testGetAndDeleteConversations() {
82+
// Create a message to have a session
83+
val messageRequest =
84+
ChatMessageRequest(
85+
sessionId = sessionId,
86+
role = "human",
87+
content = "Starting conversation",
88+
timestamp = System.currentTimeMillis()
89+
)
90+
CreateMessageRemoteOperation(messageRequest).execute(nextcloudClient)
91+
92+
// Get list of conversations
93+
val getConversationsResult = GetConversationListRemoteOperation().execute(nextcloudClient)
94+
assertTrue(getConversationsResult.isSuccess)
95+
96+
val conversations = getConversationsResult.resultData
97+
assertTrue(conversations.any { it.id.toString() == sessionId })
98+
99+
// Delete conversation
100+
val deleteResult = DeleteConversationRemoteOperation(sessionId).execute(nextcloudClient)
101+
assertTrue(deleteResult.isSuccess)
102+
103+
// Ensure conversation is gone
104+
val getAfterDelete = GetConversationListRemoteOperation().execute(nextcloudClient)
105+
assertTrue(getAfterDelete.isSuccess)
106+
assertTrue(getAfterDelete.resultData!!.none { it.id.toString() == sessionId })
107+
}
108+
109+
@Test
110+
fun testGetTaskTypesAndVerifyChatAndSorting() {
111+
val result = GetTaskTypesRemoteOperationV2().execute(nextcloudClient)
112+
113+
assertTrue("Request must succeed", result.isSuccess)
114+
val types = result.resultData
115+
assertNotNull("Task types must not be null", types)
116+
assertTrue("Task types list must not be empty", types!!.isNotEmpty())
117+
118+
val firstElementIsChat = types.first().isChat()
119+
assertTrue(
120+
"The first task type must be a chat type (sorted by isChat descending)",
121+
firstElementIsChat
122+
)
123+
124+
val chatTypes = types.filter { it.isChat() }
125+
assertTrue("There must be at least one chat-type task", chatTypes.isNotEmpty())
126+
127+
val nonChat = types.filterNot { it.isChat() }
128+
assertTrue(
129+
"There must be at least one non-chat task with single text input/output",
130+
nonChat.isNotEmpty()
131+
)
132+
133+
val indexOfFirstNonChat = types.indexOfFirst { !it.isChat() }
134+
if (indexOfFirstNonChat > 0) {
135+
val anyChatAfterNonChat = types.drop(indexOfFirstNonChat).any { it.isChat() }
136+
assertTrue(
137+
"Chat types must appear before non-chat types in the list",
138+
!anyChatAfterNonChat
139+
)
140+
}
141+
142+
types.forEach { tt ->
143+
assertNotNull("Each task type must have an ID assigned", tt.id)
144+
}
145+
}
146+
}

0 commit comments

Comments
 (0)