@tellescope/sdk 1.237.0 → 1.237.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/sdk.d.ts +1 -0
- package/lib/cjs/sdk.d.ts.map +1 -1
- package/lib/cjs/sdk.js +1 -0
- package/lib/cjs/sdk.js.map +1 -1
- package/lib/cjs/tests/api_tests/inbox_thread_assignment_updates.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/inbox_thread_assignment_updates.test.js +227 -64
- package/lib/cjs/tests/api_tests/inbox_thread_assignment_updates.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/inbox_thread_draft_scheduled.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/inbox_thread_draft_scheduled.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/inbox_thread_draft_scheduled.test.js +717 -0
- package/lib/cjs/tests/api_tests/inbox_thread_draft_scheduled.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/inbox_thread_mdb_filter.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/inbox_thread_mdb_filter.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/inbox_thread_mdb_filter.test.js +372 -0
- package/lib/cjs/tests/api_tests/inbox_thread_mdb_filter.test.js.map +1 -0
- package/lib/cjs/tests/tests.d.ts.map +1 -1
- package/lib/cjs/tests/tests.js +575 -105
- package/lib/cjs/tests/tests.js.map +1 -1
- package/lib/esm/sdk.d.ts +1 -0
- package/lib/esm/sdk.d.ts.map +1 -1
- package/lib/esm/sdk.js +1 -0
- package/lib/esm/sdk.js.map +1 -1
- package/lib/esm/tests/api_tests/inbox_thread_assignment_updates.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/inbox_thread_assignment_updates.test.js +227 -64
- package/lib/esm/tests/api_tests/inbox_thread_assignment_updates.test.js.map +1 -1
- package/lib/esm/tests/api_tests/inbox_thread_draft_scheduled.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/inbox_thread_draft_scheduled.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/inbox_thread_draft_scheduled.test.js +713 -0
- package/lib/esm/tests/api_tests/inbox_thread_draft_scheduled.test.js.map +1 -0
- package/lib/esm/tests/api_tests/inbox_thread_mdb_filter.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/inbox_thread_mdb_filter.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/inbox_thread_mdb_filter.test.js +368 -0
- package/lib/esm/tests/api_tests/inbox_thread_mdb_filter.test.js.map +1 -0
- package/lib/esm/tests/tests.d.ts.map +1 -1
- package/lib/esm/tests/tests.js +575 -105
- package/lib/esm/tests/tests.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/sdk.ts +4 -0
- package/src/tests/api_tests/inbox_thread_assignment_updates.test.ts +149 -0
- package/src/tests/api_tests/inbox_thread_draft_scheduled.test.ts +625 -0
- package/src/tests/tests.ts +401 -1
- package/test_generated.pdf +0 -0
package/src/tests/tests.ts
CHANGED
|
@@ -38,6 +38,7 @@ import { Session, APIQuery, EnduserSession } from "../sdk"
|
|
|
38
38
|
import { enduser_observations_acknowledge_tests } from "./api_tests/enduser_observations_acknowledge.test"
|
|
39
39
|
import { create_user_notifications_trigger_tests } from "./api_tests/create_user_notifications_trigger.test"
|
|
40
40
|
import { inbox_thread_assignment_updates_tests } from "./api_tests/inbox_thread_assignment_updates.test"
|
|
41
|
+
import { inbox_thread_draft_scheduled_tests } from "./api_tests/inbox_thread_draft_scheduled.test"
|
|
41
42
|
import { appointment_completed_trigger_tests } from "./api_tests/appointment_completed_trigger.test"
|
|
42
43
|
import { purchase_made_trigger_tests } from "./api_tests/purchase_made_trigger.test"
|
|
43
44
|
import { appointment_rescheduled_trigger_tests } from "./api_tests/appointment_rescheduled_trigger.test"
|
|
@@ -12911,6 +12912,403 @@ const inbox_threads_loading_tests = async () => {
|
|
|
12911
12912
|
])
|
|
12912
12913
|
}
|
|
12913
12914
|
|
|
12915
|
+
const inbox_threads_new_fields_tests = async () => {
|
|
12916
|
+
log_header("Inbox Thread New Fields Tests (archivedAt, trashedAt, senderIds)")
|
|
12917
|
+
|
|
12918
|
+
const e = await sdk.api.endusers.createOne({ fname: 'Test', lname: 'NewFields' })
|
|
12919
|
+
|
|
12920
|
+
// Use the new reset_threads endpoint for full resets (delete threads + reset dates)
|
|
12921
|
+
const resetThreadsAndDates = () => sdk.api.inbox_threads.reset_threads()
|
|
12922
|
+
|
|
12923
|
+
// Keep separate helper for just resetting dates - needed for merge tests
|
|
12924
|
+
// where we want to keep existing threads but allow rebuild
|
|
12925
|
+
let i = 0
|
|
12926
|
+
const start = new Date()
|
|
12927
|
+
const resetThreadBuildingDates = () => (
|
|
12928
|
+
sdk.api.organizations.updateOne(businessId, { // Uses global businessId constant
|
|
12929
|
+
inboxThreadsBuiltFrom: new Date(start.getTime() + (i++)),
|
|
12930
|
+
inboxThreadsBuiltTo: new Date(start.getTime() + (i++))
|
|
12931
|
+
})
|
|
12932
|
+
)
|
|
12933
|
+
// Start with clean state
|
|
12934
|
+
await resetThreadsAndDates()
|
|
12935
|
+
const from = new Date(start.getTime() - 10000)
|
|
12936
|
+
|
|
12937
|
+
// Test 1: Sender ID Tests - Email
|
|
12938
|
+
log_header("Sender ID Tests - Email")
|
|
12939
|
+
await sdk.api.emails.createOne({
|
|
12940
|
+
logOnly: true,
|
|
12941
|
+
subject: 'Test Email Inbound',
|
|
12942
|
+
textContent: 'Inbound email',
|
|
12943
|
+
enduserId: e.id,
|
|
12944
|
+
inbound: true,
|
|
12945
|
+
userId: sdk.userInfo.id,
|
|
12946
|
+
})
|
|
12947
|
+
await sdk.api.emails.createOne({
|
|
12948
|
+
logOnly: true,
|
|
12949
|
+
subject: 'Test Email Inbound', // Same subject to be same thread
|
|
12950
|
+
textContent: 'Outbound email',
|
|
12951
|
+
enduserId: e.id,
|
|
12952
|
+
inbound: false,
|
|
12953
|
+
userId: sdk.userInfo.id,
|
|
12954
|
+
})
|
|
12955
|
+
|
|
12956
|
+
await async_test(
|
|
12957
|
+
'build email threads with sender IDs',
|
|
12958
|
+
() => sdk.api.inbox_threads.build_threads({ from, to: new Date() }),
|
|
12959
|
+
{ onResult: ({ alreadyBuilt }) => !alreadyBuilt }
|
|
12960
|
+
)
|
|
12961
|
+
await async_test(
|
|
12962
|
+
'verify email thread has correct sender IDs',
|
|
12963
|
+
() => sdk.api.inbox_threads.load_threads({ }),
|
|
12964
|
+
{ onResult: ({ threads }) => {
|
|
12965
|
+
const emailThread = threads.find(t => t.type === 'Email')
|
|
12966
|
+
return !!emailThread
|
|
12967
|
+
&& emailThread.recentOutboundUserId === sdk.userInfo.id
|
|
12968
|
+
&& emailThread.recentInboundEnduserId === e.id
|
|
12969
|
+
}}
|
|
12970
|
+
)
|
|
12971
|
+
|
|
12972
|
+
// Test 2: Sender ID Tests - SMS
|
|
12973
|
+
log_header("Sender ID Tests - SMS")
|
|
12974
|
+
await resetThreadsAndDates()
|
|
12975
|
+
await sdk.api.sms_messages.createOne({
|
|
12976
|
+
logOnly: true,
|
|
12977
|
+
inbound: true,
|
|
12978
|
+
enduserId: e.id,
|
|
12979
|
+
message: 'Inbound SMS',
|
|
12980
|
+
userId: sdk.userInfo.id,
|
|
12981
|
+
phoneNumber: '+15555555555',
|
|
12982
|
+
enduserPhoneNumber: '+15555555556',
|
|
12983
|
+
})
|
|
12984
|
+
await sdk.api.sms_messages.createOne({
|
|
12985
|
+
logOnly: true,
|
|
12986
|
+
inbound: false,
|
|
12987
|
+
enduserId: e.id,
|
|
12988
|
+
message: 'Outbound SMS',
|
|
12989
|
+
userId: sdk.userInfo.id,
|
|
12990
|
+
phoneNumber: '+15555555555',
|
|
12991
|
+
enduserPhoneNumber: '+15555555556',
|
|
12992
|
+
})
|
|
12993
|
+
|
|
12994
|
+
await async_test(
|
|
12995
|
+
'build SMS threads with sender IDs',
|
|
12996
|
+
() => sdk.api.inbox_threads.build_threads({ from, to: new Date() }),
|
|
12997
|
+
{ onResult: ({ alreadyBuilt }) => !alreadyBuilt }
|
|
12998
|
+
)
|
|
12999
|
+
await async_test(
|
|
13000
|
+
'verify SMS thread has correct sender IDs',
|
|
13001
|
+
() => sdk.api.inbox_threads.load_threads({ }),
|
|
13002
|
+
{ onResult: ({ threads }) => {
|
|
13003
|
+
const smsThread = threads.find(t => t.type === 'SMS')
|
|
13004
|
+
return !!smsThread
|
|
13005
|
+
&& smsThread.recentOutboundUserId === sdk.userInfo.id
|
|
13006
|
+
&& smsThread.recentInboundEnduserId === e.id
|
|
13007
|
+
}}
|
|
13008
|
+
)
|
|
13009
|
+
|
|
13010
|
+
// Test 3: Sender ID Tests - ChatRoom
|
|
13011
|
+
log_header("Sender ID Tests - ChatRoom")
|
|
13012
|
+
await resetThreadsAndDates()
|
|
13013
|
+
const chatRoom = await sdk.api.chat_rooms.createOne({
|
|
13014
|
+
title: 'Test Chat Room',
|
|
13015
|
+
userIds: [sdk.userInfo.id],
|
|
13016
|
+
enduserIds: [e.id],
|
|
13017
|
+
})
|
|
13018
|
+
// First message from user (outbound)
|
|
13019
|
+
await sdk.api.chats.createOne({ roomId: chatRoom.id, message: 'User message', senderId: sdk.userInfo.id })
|
|
13020
|
+
await wait(undefined, 500)
|
|
13021
|
+
|
|
13022
|
+
await async_test(
|
|
13023
|
+
'build chat threads after user message',
|
|
13024
|
+
() => sdk.api.inbox_threads.build_threads({ from, to: new Date() }),
|
|
13025
|
+
{ onResult: ({ alreadyBuilt }) => !alreadyBuilt }
|
|
13026
|
+
)
|
|
13027
|
+
await async_test(
|
|
13028
|
+
'verify chat thread has outbound userId only',
|
|
13029
|
+
() => sdk.api.inbox_threads.load_threads({ }),
|
|
13030
|
+
{ onResult: ({ threads }) => {
|
|
13031
|
+
const chatThread = threads.find(t => t.type === 'Chat')
|
|
13032
|
+
return !!chatThread
|
|
13033
|
+
&& chatThread.recentOutboundUserId === sdk.userInfo.id
|
|
13034
|
+
&& !chatThread.recentInboundEnduserId
|
|
13035
|
+
}}
|
|
13036
|
+
)
|
|
13037
|
+
|
|
13038
|
+
// Now enduser sends a message (becomes recentSender, but merge preserves previous outbound userId)
|
|
13039
|
+
await sdk.api.chats.createOne({ roomId: chatRoom.id, message: 'Enduser message', enduserId: e.id, senderId: e.id })
|
|
13040
|
+
await wait(undefined, 500)
|
|
13041
|
+
await resetThreadBuildingDates() // Only reset dates, keep existing thread for merge test
|
|
13042
|
+
|
|
13043
|
+
await async_test(
|
|
13044
|
+
'rebuild chat threads after enduser message',
|
|
13045
|
+
() => sdk.api.inbox_threads.build_threads({ from, to: new Date() }),
|
|
13046
|
+
{ onResult: ({ alreadyBuilt }) => !alreadyBuilt }
|
|
13047
|
+
)
|
|
13048
|
+
await async_test(
|
|
13049
|
+
'verify chat thread has both sender IDs (merge preserves previous)',
|
|
13050
|
+
() => sdk.api.inbox_threads.load_threads({ }),
|
|
13051
|
+
{ onResult: ({ threads }) => {
|
|
13052
|
+
const chatThread = threads.find(t => t.type === 'Chat')
|
|
13053
|
+
// ChatRoom only tracks one recentSender at a time, but merge preserves both IDs
|
|
13054
|
+
return !!chatThread
|
|
13055
|
+
&& chatThread.recentOutboundUserId === sdk.userInfo.id // preserved from previous build
|
|
13056
|
+
&& chatThread.recentInboundEnduserId === e.id // from current build
|
|
13057
|
+
}}
|
|
13058
|
+
)
|
|
13059
|
+
|
|
13060
|
+
// Test 4: Sender ID Tests - GroupMMS
|
|
13061
|
+
log_header("Sender ID Tests - GroupMMS")
|
|
13062
|
+
await resetThreadsAndDates()
|
|
13063
|
+
const groupMMS = await sdk.api.group_mms_conversations.createOne({
|
|
13064
|
+
enduserIds: [e.id],
|
|
13065
|
+
userIds: [sdk.userInfo.id],
|
|
13066
|
+
userStates: [],
|
|
13067
|
+
messages: [
|
|
13068
|
+
{ message: 'Inbound message', sender: e.id, timestamp: Date.now() - 1000, logOnly: true },
|
|
13069
|
+
{ message: 'Outbound message', sender: sdk.userInfo.id, timestamp: Date.now(), logOnly: true },
|
|
13070
|
+
],
|
|
13071
|
+
})
|
|
13072
|
+
|
|
13073
|
+
await async_test(
|
|
13074
|
+
'build GroupMMS threads with sender IDs',
|
|
13075
|
+
() => sdk.api.inbox_threads.build_threads({ from, to: new Date() }),
|
|
13076
|
+
{ onResult: ({ alreadyBuilt }) => !alreadyBuilt }
|
|
13077
|
+
)
|
|
13078
|
+
await async_test(
|
|
13079
|
+
'verify GroupMMS thread has correct sender IDs',
|
|
13080
|
+
() => sdk.api.inbox_threads.load_threads({ }),
|
|
13081
|
+
{ onResult: ({ threads }) => {
|
|
13082
|
+
const groupMMSThread = threads.find(t => t.type === 'GroupMMS')
|
|
13083
|
+
return !!groupMMSThread
|
|
13084
|
+
&& groupMMSThread.recentOutboundUserId === sdk.userInfo.id
|
|
13085
|
+
&& groupMMSThread.recentInboundEnduserId === e.id
|
|
13086
|
+
}}
|
|
13087
|
+
)
|
|
13088
|
+
|
|
13089
|
+
// Test 5: Sender ID Tests - PhoneCall
|
|
13090
|
+
log_header("Sender ID Tests - PhoneCall")
|
|
13091
|
+
await resetThreadsAndDates()
|
|
13092
|
+
const inboundCall = await sdk.api.phone_calls.createOne({
|
|
13093
|
+
enduserId: e.id,
|
|
13094
|
+
inbound: true,
|
|
13095
|
+
to: '+15555555555',
|
|
13096
|
+
from: '+15555555556',
|
|
13097
|
+
userId: sdk.userInfo.id,
|
|
13098
|
+
})
|
|
13099
|
+
|
|
13100
|
+
await async_test(
|
|
13101
|
+
'build phone call threads (inbound)',
|
|
13102
|
+
() => sdk.api.inbox_threads.build_threads({ from, to: new Date() }),
|
|
13103
|
+
{ onResult: ({ alreadyBuilt }) => !alreadyBuilt }
|
|
13104
|
+
)
|
|
13105
|
+
await async_test(
|
|
13106
|
+
'verify inbound phone call thread has enduserId',
|
|
13107
|
+
() => sdk.api.inbox_threads.load_threads({ }),
|
|
13108
|
+
{ onResult: ({ threads }) => {
|
|
13109
|
+
const callThread = threads.find(t => t.type === 'Phone' && t.threadId === inboundCall.id)
|
|
13110
|
+
return !!callThread
|
|
13111
|
+
&& !callThread.recentOutboundUserId
|
|
13112
|
+
&& callThread.recentInboundEnduserId === e.id
|
|
13113
|
+
}}
|
|
13114
|
+
)
|
|
13115
|
+
|
|
13116
|
+
// Test outbound call separately to avoid date range issues
|
|
13117
|
+
await resetThreadsAndDates()
|
|
13118
|
+
const outboundCall = await sdk.api.phone_calls.createOne({
|
|
13119
|
+
enduserId: e.id,
|
|
13120
|
+
inbound: false,
|
|
13121
|
+
to: '+15555555556',
|
|
13122
|
+
from: '+15555555555',
|
|
13123
|
+
userId: sdk.userInfo.id,
|
|
13124
|
+
})
|
|
13125
|
+
|
|
13126
|
+
await async_test(
|
|
13127
|
+
'build phone call threads (outbound)',
|
|
13128
|
+
() => sdk.api.inbox_threads.build_threads({ from, to: new Date() }),
|
|
13129
|
+
{ onResult: ({ alreadyBuilt }) => !alreadyBuilt }
|
|
13130
|
+
)
|
|
13131
|
+
await async_test(
|
|
13132
|
+
'verify outbound phone call thread has userId',
|
|
13133
|
+
() => sdk.api.inbox_threads.load_threads({ }),
|
|
13134
|
+
{ onResult: ({ threads }) => {
|
|
13135
|
+
const callThread = threads.find(t => t.type === 'Phone' && t.threadId === outboundCall.id)
|
|
13136
|
+
return !!callThread
|
|
13137
|
+
&& callThread.recentOutboundUserId === sdk.userInfo.id
|
|
13138
|
+
&& !callThread.recentInboundEnduserId
|
|
13139
|
+
}}
|
|
13140
|
+
)
|
|
13141
|
+
|
|
13142
|
+
// Test 6: Archive/Trash Tests - Propagation
|
|
13143
|
+
log_header("Archive/Trash Tests - Propagation")
|
|
13144
|
+
await resetThreadsAndDates()
|
|
13145
|
+
const archivedDate = new Date()
|
|
13146
|
+
await sdk.api.emails.createOne({
|
|
13147
|
+
logOnly: true,
|
|
13148
|
+
subject: 'Archived Email',
|
|
13149
|
+
textContent: 'This email is archived',
|
|
13150
|
+
enduserId: e.id,
|
|
13151
|
+
inbound: true,
|
|
13152
|
+
userId: sdk.userInfo.id,
|
|
13153
|
+
archivedAt: archivedDate,
|
|
13154
|
+
})
|
|
13155
|
+
|
|
13156
|
+
await async_test(
|
|
13157
|
+
'build threads with archived email',
|
|
13158
|
+
() => sdk.api.inbox_threads.build_threads({ from, to: new Date() }),
|
|
13159
|
+
{ onResult: ({ alreadyBuilt }) => !alreadyBuilt }
|
|
13160
|
+
)
|
|
13161
|
+
await async_test(
|
|
13162
|
+
'verify thread has archivedAt populated',
|
|
13163
|
+
() => sdk.api.inbox_threads.load_threads({ }),
|
|
13164
|
+
{ onResult: ({ threads }) => {
|
|
13165
|
+
const emailThread = threads.find(t => t.type === 'Email')
|
|
13166
|
+
return !!emailThread
|
|
13167
|
+
&& !!emailThread.archivedAt
|
|
13168
|
+
&& new Date(emailThread.archivedAt).getTime() === archivedDate.getTime()
|
|
13169
|
+
}}
|
|
13170
|
+
)
|
|
13171
|
+
|
|
13172
|
+
// Test 7: Archive/Trash Tests - Clearing (new message clears archived status)
|
|
13173
|
+
log_header("Archive/Trash Tests - Clearing")
|
|
13174
|
+
await sdk.api.emails.createOne({
|
|
13175
|
+
logOnly: true,
|
|
13176
|
+
subject: 'Archived Email', // Same subject = same thread
|
|
13177
|
+
textContent: 'This email is NOT archived',
|
|
13178
|
+
enduserId: e.id,
|
|
13179
|
+
inbound: true,
|
|
13180
|
+
userId: sdk.userInfo.id,
|
|
13181
|
+
// No archivedAt
|
|
13182
|
+
})
|
|
13183
|
+
await resetThreadBuildingDates() // Only reset dates, keep existing thread for merge test
|
|
13184
|
+
|
|
13185
|
+
await async_test(
|
|
13186
|
+
'rebuild threads after non-archived message',
|
|
13187
|
+
() => sdk.api.inbox_threads.build_threads({ from, to: new Date() }),
|
|
13188
|
+
{ onResult: ({ alreadyBuilt }) => !alreadyBuilt }
|
|
13189
|
+
)
|
|
13190
|
+
await async_test(
|
|
13191
|
+
'verify thread archivedAt is cleared',
|
|
13192
|
+
() => sdk.api.inbox_threads.load_threads({ }),
|
|
13193
|
+
{ onResult: ({ threads }) => {
|
|
13194
|
+
const emailThread = threads.find(t => t.type === 'Email')
|
|
13195
|
+
return !!emailThread && emailThread.archivedAt === ''
|
|
13196
|
+
}}
|
|
13197
|
+
)
|
|
13198
|
+
|
|
13199
|
+
// Test 8: Archive/Trash Tests - trashedAt propagation
|
|
13200
|
+
log_header("Archive/Trash Tests - Trashed Propagation")
|
|
13201
|
+
await resetThreadsAndDates()
|
|
13202
|
+
const trashedDate = new Date()
|
|
13203
|
+
await sdk.api.sms_messages.createOne({
|
|
13204
|
+
logOnly: true,
|
|
13205
|
+
inbound: true,
|
|
13206
|
+
enduserId: e.id,
|
|
13207
|
+
message: 'Trashed SMS',
|
|
13208
|
+
userId: sdk.userInfo.id,
|
|
13209
|
+
phoneNumber: '+15555555557',
|
|
13210
|
+
enduserPhoneNumber: '+15555555558',
|
|
13211
|
+
trashedAt: trashedDate,
|
|
13212
|
+
})
|
|
13213
|
+
|
|
13214
|
+
await async_test(
|
|
13215
|
+
'build threads with trashed SMS',
|
|
13216
|
+
() => sdk.api.inbox_threads.build_threads({ from, to: new Date() }),
|
|
13217
|
+
{ onResult: ({ alreadyBuilt }) => !alreadyBuilt }
|
|
13218
|
+
)
|
|
13219
|
+
await async_test(
|
|
13220
|
+
'verify thread has trashedAt populated',
|
|
13221
|
+
() => sdk.api.inbox_threads.load_threads({ }),
|
|
13222
|
+
{ onResult: ({ threads }) => {
|
|
13223
|
+
const smsThread = threads.find(t => t.type === 'SMS' && t.phoneNumber === '+15555555557')
|
|
13224
|
+
return !!smsThread
|
|
13225
|
+
&& !!smsThread.trashedAt
|
|
13226
|
+
&& new Date(smsThread.trashedAt).getTime() === trashedDate.getTime()
|
|
13227
|
+
}}
|
|
13228
|
+
)
|
|
13229
|
+
|
|
13230
|
+
// Test 9: Archive/Trash Tests - Most Recent Archived, Older Not
|
|
13231
|
+
log_header("Archive/Trash Tests - Most Recent Archived, Older Not")
|
|
13232
|
+
await resetThreadsAndDates()
|
|
13233
|
+
// Create non-archived message first (older)
|
|
13234
|
+
await sdk.api.emails.createOne({
|
|
13235
|
+
logOnly: true,
|
|
13236
|
+
subject: 'Archive Order Test',
|
|
13237
|
+
textContent: 'Older non-archived email',
|
|
13238
|
+
enduserId: e.id,
|
|
13239
|
+
inbound: true,
|
|
13240
|
+
userId: sdk.userInfo.id,
|
|
13241
|
+
// No archivedAt
|
|
13242
|
+
})
|
|
13243
|
+
|
|
13244
|
+
await wait(undefined, 100) // Small delay to ensure ordering
|
|
13245
|
+
|
|
13246
|
+
// Create archived message second (newer = most recent)
|
|
13247
|
+
await sdk.api.emails.createOne({
|
|
13248
|
+
logOnly: true,
|
|
13249
|
+
subject: 'Archive Order Test', // Same subject = same thread
|
|
13250
|
+
textContent: 'Newer archived email',
|
|
13251
|
+
enduserId: e.id,
|
|
13252
|
+
inbound: true,
|
|
13253
|
+
userId: sdk.userInfo.id,
|
|
13254
|
+
archivedAt: new Date(),
|
|
13255
|
+
})
|
|
13256
|
+
|
|
13257
|
+
await async_test(
|
|
13258
|
+
'build threads for archive order test',
|
|
13259
|
+
() => sdk.api.inbox_threads.build_threads({ from, to: new Date() }),
|
|
13260
|
+
{ onResult: ({ alreadyBuilt }) => !alreadyBuilt }
|
|
13261
|
+
)
|
|
13262
|
+
await async_test(
|
|
13263
|
+
'verify thread archivedAt follows most recent message (IS archived)',
|
|
13264
|
+
() => sdk.api.inbox_threads.load_threads({ }),
|
|
13265
|
+
{ onResult: ({ threads }) => {
|
|
13266
|
+
const emailThread = threads.find(t => t.type === 'Email')
|
|
13267
|
+
// Most recent message is archived, so thread should be archived
|
|
13268
|
+
return !!emailThread && !!emailThread.archivedAt
|
|
13269
|
+
}}
|
|
13270
|
+
)
|
|
13271
|
+
|
|
13272
|
+
// Test 10: Reset Threads Endpoint - Comprehensive Coverage
|
|
13273
|
+
log_header("Reset Threads Endpoint Test")
|
|
13274
|
+
|
|
13275
|
+
// Test 10a: Verify threads are deleted and count returned
|
|
13276
|
+
const beforeReset = await sdk.api.inbox_threads.load_threads({})
|
|
13277
|
+
assert(beforeReset.threads.length > 0, 'no threads before reset test', 'threads exist before reset test')
|
|
13278
|
+
|
|
13279
|
+
const resetResult = await sdk.api.inbox_threads.reset_threads()
|
|
13280
|
+
assert(resetResult.deletedCount > 0, 'no threads deleted by reset', 'reset_threads deleted threads')
|
|
13281
|
+
|
|
13282
|
+
const afterReset = await sdk.api.inbox_threads.load_threads({})
|
|
13283
|
+
assert(afterReset.threads.length === 0, 'threads remain after reset', 'all threads deleted after reset')
|
|
13284
|
+
|
|
13285
|
+
// Test 10b: Verify organization dates are reset to epoch
|
|
13286
|
+
const org = await sdk.api.organizations.getOne(businessId)
|
|
13287
|
+
const epochTime = new Date(0).getTime()
|
|
13288
|
+
assert(
|
|
13289
|
+
new Date(org.inboxThreadsBuiltFrom ?? 0).getTime() === epochTime,
|
|
13290
|
+
'inboxThreadsBuiltFrom not reset to epoch',
|
|
13291
|
+
'organization inboxThreadsBuiltFrom reset to epoch'
|
|
13292
|
+
)
|
|
13293
|
+
assert(
|
|
13294
|
+
new Date(org.inboxThreadsBuiltTo ?? 0).getTime() === epochTime,
|
|
13295
|
+
'inboxThreadsBuiltTo not reset to epoch',
|
|
13296
|
+
'organization inboxThreadsBuiltTo reset to epoch'
|
|
13297
|
+
)
|
|
13298
|
+
|
|
13299
|
+
// Test 10c: Verify reset with no threads returns deletedCount: 0
|
|
13300
|
+
const emptyResetResult = await sdk.api.inbox_threads.reset_threads()
|
|
13301
|
+
assert(emptyResetResult.deletedCount === 0, 'deletedCount should be 0 when no threads', 'reset with no threads returns 0')
|
|
13302
|
+
|
|
13303
|
+
// Cleanup
|
|
13304
|
+
await Promise.all([
|
|
13305
|
+
sdk.api.endusers.deleteOne(e.id),
|
|
13306
|
+
sdk.api.chat_rooms.deleteOne(chatRoom.id).catch(() => {}),
|
|
13307
|
+
sdk.api.group_mms_conversations.deleteOne(groupMMS.id).catch(() => {}),
|
|
13308
|
+
resetThreadsAndDates(), // Use the new endpoint for cleanup
|
|
13309
|
+
])
|
|
13310
|
+
}
|
|
13311
|
+
|
|
12914
13312
|
const get_next_reminder_timestamp_tests = () => {
|
|
12915
13313
|
log_header("Get Next Reminder Timestamp Tests")
|
|
12916
13314
|
|
|
@@ -13173,6 +13571,9 @@ const ip_address_form_tests = async () => {
|
|
|
13173
13571
|
await replace_enduser_template_values_tests()
|
|
13174
13572
|
await mfa_tests()
|
|
13175
13573
|
await setup_tests(sdk, sdkNonAdmin)
|
|
13574
|
+
await inbox_thread_assignment_updates_tests({ sdk, sdkNonAdmin })
|
|
13575
|
+
await inbox_thread_draft_scheduled_tests({ sdk, sdkNonAdmin })
|
|
13576
|
+
await inbox_threads_new_fields_tests()
|
|
13176
13577
|
await auto_merge_form_submission_tests({ sdk, sdkNonAdmin })
|
|
13177
13578
|
await threadKeyTests()
|
|
13178
13579
|
await automation_trigger_tests()
|
|
@@ -13187,7 +13588,6 @@ const ip_address_form_tests = async () => {
|
|
|
13187
13588
|
await test_ticket_automation_assignment_and_optimization()
|
|
13188
13589
|
await monthly_availability_restrictions_tests({ sdk, sdkNonAdmin })
|
|
13189
13590
|
await journey_error_branching_tests({ sdk, sdkNonAdmin })
|
|
13190
|
-
await inbox_thread_assignment_updates_tests({ sdk, sdkNonAdmin })
|
|
13191
13591
|
await message_assignment_trigger_tests({ sdk })
|
|
13192
13592
|
await inbox_threads_building_tests()
|
|
13193
13593
|
await inbox_threads_loading_tests()
|
package/test_generated.pdf
CHANGED
|
Binary file
|