-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlists.test.ts
More file actions
206 lines (178 loc) · 5.87 KB
/
lists.test.ts
File metadata and controls
206 lines (178 loc) · 5.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
import { afterAll, beforeAll, describe, expect, it } from "@jest/globals";
import { IterableClient } from "../../src/client";
import {
cleanupTestUser,
createTestIdentifiers,
retryOnInvalidListId,
uniqueId,
waitForListMembership,
withTimeout,
} from "../utils/test-helpers";
describe("List Management Integration Tests", () => {
let client: IterableClient;
const { testUserEmail, testUserId } = createTestIdentifiers();
beforeAll(async () => {
client = new IterableClient();
});
afterAll(async () => {
await cleanupTestUser(client, testUserEmail);
client.destroy();
});
it("should retrieve lists", async () => {
const response = await withTimeout(client.getLists());
expect(response).toHaveProperty("lists");
expect(Array.isArray(response.lists)).toBe(true);
});
it("should create, manage, and delete a list", async () => {
const listName = uniqueId("MCP-Test-List");
// Create a list
const createResponse = await withTimeout(
client.createList({
name: listName,
description: "Integration test list created by MCP server tests",
})
);
expect(createResponse).toHaveProperty("listId");
const listId = createResponse.listId;
try {
// Ensure user exists (avoid 400s on subscribe due to unknown user)
await withTimeout(
client.updateUser({
email: testUserEmail,
userId: testUserId,
dataFields: { subscriptionSource: "mcp-test" },
})
);
// Subscribe a user to the list (handle transient invalidListId error)
await retryOnInvalidListId(
() =>
withTimeout(
client.subscribeUserToList({
listId,
subscribers: [{ email: testUserEmail }],
})
),
"Subscribe user to list"
);
// ✅ VERIFY: User is actually subscribed to the list
await waitForListMembership(client, listId, testUserEmail, true);
// Get list users
const usersResponse = await withTimeout(
client.getListUsers({
listId,
maxResults: 10,
})
);
expect(usersResponse).toHaveProperty("users");
expect(Array.isArray(usersResponse.users)).toBe(true);
// Don't require specific users due to eventual consistency
// Unsubscribe user from the list
// Unsubscribe user - success indicated by no exception
await withTimeout(
client.unsubscribeUserFromList({
listId,
subscribers: [{ email: testUserEmail }],
})
);
// ✅ VERIFY: User is actually unsubscribed from the list
await waitForListMembership(client, listId, testUserEmail, false);
} finally {
// Cleanup - delete the list (success indicated by no exception)
await withTimeout(client.deleteList({ listId }));
}
}, 120000);
it("should get list size", async () => {
const testListName = uniqueId("Size-Test-List");
let testListId: number;
try {
// Create a test list
const createResult = await withTimeout(
client.createList({
name: testListName,
description: "List for testing list size endpoint",
})
);
testListId = createResult.listId;
// Add a test user to the list (handle transient invalidListId error)
await retryOnInvalidListId(
() =>
withTimeout(
client.subscribeUserToList({
listId: testListId,
subscribers: [
{
email: testUserEmail,
userId: testUserId,
dataFields: { sizeTest: true },
},
],
})
),
"Subscribe user to list for size test"
);
// Wait for list membership to propagate
await waitForListMembership(client, testListId, testUserEmail, true);
const result = await withTimeout(
client.getListSize({ listId: testListId })
);
expect(result).toBeDefined();
expect(result.size).toBeDefined();
expect(typeof result.size).toBe("number");
// List size might be 0 if membership hasn't fully propagated
expect(result.size).toBeGreaterThanOrEqual(0);
} finally {
// Clean up test list
if (testListId!) {
await withTimeout(client.deleteList({ listId: testListId }));
}
}
}, 120000);
it("should preview users in list", async () => {
const testListName = uniqueId("Preview-Test-List");
let testListId: number;
try {
// Create a test list
const createResult = await withTimeout(
client.createList({
name: testListName,
description: "List for testing list preview endpoint",
})
);
testListId = createResult.listId;
// Add a test user to the list (handle transient invalidListId error)
await retryOnInvalidListId(
() =>
withTimeout(
client.subscribeUserToList({
listId: testListId,
subscribers: [
{
email: testUserEmail,
userId: testUserId,
dataFields: { previewTest: true },
},
],
})
),
"Subscribe user to list for preview test"
);
// Wait for list membership to propagate
await waitForListMembership(client, testListId, testUserEmail, true);
const result = await withTimeout(
client.getListPreviewUsers({
listId: testListId,
size: 10,
})
);
expect(result).toBeDefined();
expect(result.users).toBeDefined();
expect(Array.isArray(result.users)).toBe(true);
expect(result.users.length).toBeGreaterThanOrEqual(1);
} finally {
// Clean up test list
if (testListId!) {
await withTimeout(client.deleteList({ listId: testListId }));
}
}
}, 120000);
});