-
Notifications
You must be signed in to change notification settings - Fork 48
Expand file tree
/
Copy pathFlatFeedTest.java
More file actions
323 lines (274 loc) · 11.7 KB
/
FlatFeedTest.java
File metadata and controls
323 lines (274 loc) · 11.7 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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
package io.getstream.client;
import io.getstream.client.entities.FootballMatch;
import io.getstream.client.entities.Match;
import io.getstream.client.entities.VolleyballMatch;
import io.getstream.core.http.OKHTTPClientAdapter;
import io.getstream.core.models.Activity;
import io.getstream.core.models.Data;
import io.getstream.core.models.EnrichedActivity;
import io.getstream.core.options.DiscardActors;
import io.getstream.core.options.EnrichmentFlags;
import io.getstream.core.options.Filter;
import io.getstream.core.options.Limit;
import io.getstream.core.options.Offset;
import java.util.Collections;
import java.util.List;
import java8.util.concurrent.CompletionException;
import okhttp3.OkHttpClient;
import org.junit.Test;
import java.util.concurrent.atomic.AtomicReference;
public class FlatFeedTest {
private static final String apiKey =
System.getenv("STREAM_KEY") != null
? System.getenv("STREAM_KEY")
: System.getProperty("STREAM_KEY");
private static final String secret =
System.getenv("STREAM_SECRET") != null
? System.getenv("STREAM_SECRET")
: System.getProperty("STREAM_SECRET");
@Test
public void getActivities() throws Exception {
Client client =
Client.builder(apiKey, secret)
.httpClient(new OKHTTPClientAdapter(new OkHttpClient()))
.build();
int takeId = 1;
FlatFeed feed = client.flatFeed("flat", "1");
List<Activity> result = feed.getActivities().join();
}
@Test
public void getEnrichedActivities() throws Exception {
Client client =
Client.builder(apiKey, secret)
.httpClient(new OKHTTPClientAdapter(new OkHttpClient()))
.build();
Data user = client.user("john-doe").getOrCreate(new Data().set("hey", "now")).join();
FlatFeed feed = client.flatFeed("flat", "rich");
List<EnrichedActivity> result =
feed.getEnrichedActivities(
new EnrichmentFlags()
.withOwnChildren()
.withUserReactions("some-user")
.withReactionCounts()
.withRecentReactions())
.join();
Collections.sort(
result,
(a, b) -> {
Number aValue = a.getReactionCounts().get("like");
Number bValue = b.getReactionCounts().get("like");
int aLikes = aValue == null ? 0 : aValue.intValue();
int bLikes = bValue == null ? 0 : bValue.intValue();
return aLikes - bLikes;
});
}
@Test
public void getCustomActivities() throws Exception {
Client client =
Client.builder(apiKey, secret)
.httpClient(new OKHTTPClientAdapter(new OkHttpClient()))
.build();
FlatFeed feed = client.flatFeed("flat", "333");
VolleyballMatch volley = new VolleyballMatch();
volley.actor = "Me";
volley.object = "Message";
volley.verb = "verb";
volley.setNrOfBlocked(1);
volley.setNrOfServed(1);
feed.addCustomActivity(volley).join();
FootballMatch football = new FootballMatch();
football.actor = "Me";
football.object = "Message";
football.verb = "verb";
football.setNrOfPenalty(2);
football.setNrOfScore(3);
feed.addCustomActivity(football).join();
List<Match> result = feed.getCustomActivities(Match.class).join();
}
@Test(expected = CompletionException.class)
public void invalidFeedType() throws Exception {
Client client =
Client.builder(apiKey, secret)
.httpClient(new OKHTTPClientAdapter(new OkHttpClient()))
.build();
FlatFeed feed = client.flatFeed("aggregated", "1");
feed.getActivities().join();
}
@Test
public void testDiscardActorsOptions() {
// Test DiscardActors with array
DiscardActors discardActors1 = new DiscardActors("user1", "user2", "user3");
// Test DiscardActors with List
List<String> actors = java.util.Arrays.asList("user4", "user5");
DiscardActors discardActors2 = new DiscardActors(actors);
// Test DiscardActors with custom separator
DiscardActors discardActors3 = new DiscardActors(new String[]{"user6", "user7"}, ";");
// Test DiscardActors with List and custom separator
DiscardActors discardActors4 = new DiscardActors(actors, "|");
// Basic validation that objects were created
assert discardActors1 != null;
assert discardActors2 != null;
assert discardActors3 != null;
assert discardActors4 != null;
}
@Test
public void testGetActivitiesWithRequestOptions() throws Exception {
Client client =
Client.builder(apiKey, secret)
.httpClient(new OKHTTPClientAdapter(new OkHttpClient()))
.build();
FlatFeed feed = client.flatFeed("flat", "test-request-options");
// Test with just DiscardActors
DiscardActors discardActors = new DiscardActors("actor1", "actor2", "actor3");
List<Activity> result1 = feed.getActivities(discardActors).join();
assert result1 != null;
// Test with DiscardActors + Limit + Filter
List<String> actors = java.util.Arrays.asList("actor4", "actor5");
DiscardActors discardActors2 = new DiscardActors(actors);
Filter filter = new Filter().refresh();
List<Activity> result2 = feed.getActivities(new Limit(10), filter, discardActors2).join();
assert result2 != null;
// Test with all parameters
List<Activity> result3 = feed.getActivities(
new Limit(20),
new Offset(5),
new Filter().refresh(),
new DiscardActors("actor6", "actor7")
).join();
assert result3 != null;
}
@Test
public void testGetActivitiesUrlParameters() throws Exception {
// Create a mock HTTP client that captures the request URL
AtomicReference<String> capturedUrl = new AtomicReference<>();
// Create a custom OkHttpClient that intercepts requests
OkHttpClient mockClient = new OkHttpClient.Builder()
.addInterceptor(chain -> {
capturedUrl.set(chain.request().url().toString());
// Return a mock response
return new okhttp3.Response.Builder()
.request(chain.request())
.protocol(okhttp3.Protocol.HTTP_1_1)
.code(200)
.message("OK")
.body(okhttp3.ResponseBody.create(
okhttp3.MediaType.parse("application/json"),
"{\"results\":[],\"next\":\"\",\"duration\":\"0ms\"}"
))
.build();
})
.build();
Client client = Client.builder("test-key", "test-secret")
.httpClient(new OKHTTPClientAdapter(mockClient))
.build();
FlatFeed feed = client.flatFeed("flat", "test-url-params");
// Test with multiple RequestOptions
feed.getActivities(
new Limit(20),
new Offset(5),
new Filter().refresh(),
new DiscardActors("actor1", "actor2", "actor3")
).join();
String url = capturedUrl.get();
assert url != null;
// Verify URL contains expected parameters
assert url.contains("limit=20") : "URL should contain limit=20, got: " + url;
assert url.contains("offset=5") : "URL should contain offset=5, got: " + url;
assert url.contains("refresh=1") : "URL should contain refresh=1, got: " + url;
assert url.contains("discard_actors=actor1,actor2,actor3") : "URL should contain discard_actors, got: " + url;
// Test with custom separator
capturedUrl.set(null);
feed.getActivities(
new DiscardActors(new String[]{"actor4", "actor5"}, "|")
).join();
url = capturedUrl.get();
assert url != null;
assert url.contains("discard_actors=actor4%7Cactor5") : "URL should contain pipe-separated actors, got: " + url;
assert url.contains("discard_actors_sep=%7C") : "URL should contain discard_actors_sep, got: " + url;
}
@Test
public void testGetEnrichedActivitiesWithDiscardActors() throws Exception {
if (apiKey == null || secret == null) {
System.out.println("Skipping testGetEnrichedActivitiesWithDiscardActors - API credentials not set");
return;
}
Client client =
Client.builder(apiKey, secret)
.httpClient(new OKHTTPClientAdapter(new OkHttpClient()))
.build();
FlatFeed feed = client.flatFeed("flat", "test-enriched-discard");
// Test with just DiscardActors on enriched activities
DiscardActors discardActors = new DiscardActors("actor1", "actor2", "actor3");
List<EnrichedActivity> result1 = feed.getEnrichedActivities(discardActors).join();
assert result1 != null;
// Test with DiscardActors + Limit + EnrichmentFlags
List<String> actors = java.util.Arrays.asList("actor4", "actor5");
DiscardActors discardActors2 = new DiscardActors(actors);
EnrichmentFlags flags = new EnrichmentFlags().withOwnReactions().withReactionCounts();
List<EnrichedActivity> result2 = feed.getEnrichedActivities(
new Limit(10),
flags,
discardActors2
).join();
assert result2 != null;
// Test with all parameters including custom separator
List<EnrichedActivity> result3 = feed.getEnrichedActivities(
new Limit(20),
new Offset(5),
new Filter().refresh(),
new EnrichmentFlags().withRecentReactions(),
new DiscardActors(new String[]{"actor6", "actor7"}, "|")
).join();
assert result3 != null;
}
@Test
public void testGetEnrichedActivitiesUrlParameters() throws Exception {
// Create a mock HTTP client that captures the request URL
AtomicReference<String> capturedUrl = new AtomicReference<>();
// Create a custom OkHttpClient that intercepts requests
OkHttpClient mockClient = new OkHttpClient.Builder()
.addInterceptor(chain -> {
capturedUrl.set(chain.request().url().toString());
// Return a mock response for enriched activities
return new okhttp3.Response.Builder()
.request(chain.request())
.protocol(okhttp3.Protocol.HTTP_1_1)
.code(200)
.message("OK")
.body(okhttp3.ResponseBody.create(
okhttp3.MediaType.parse("application/json"),
"{\"results\":[],\"next\":\"\",\"duration\":\"0ms\"}"
))
.build();
})
.build();
Client client = Client.builder("test-key", "test-secret")
.httpClient(new OKHTTPClientAdapter(mockClient))
.build();
FlatFeed feed = client.flatFeed("flat", "test-enriched-url");
// Test enriched activities with discard_actors
feed.getEnrichedActivities(
new Limit(15),
new EnrichmentFlags().withOwnReactions(),
new DiscardActors("user1", "user2")
).join();
String url = capturedUrl.get();
assert url != null;
// Verify URL contains expected parameters
assert url.contains("limit=15") : "URL should contain limit=15, got: " + url;
assert url.contains("discard_actors=user1,user2") : "URL should contain discard_actors, got: " + url;
assert url.contains("with_own_reactions=true") : "URL should contain enrichment flags, got: " + url;
// Test with custom separator on enriched activities
capturedUrl.set(null);
feed.getEnrichedActivities(
new DiscardActors(new String[]{"userA", "userB", "userC"}, ";")
).join();
url = capturedUrl.get();
assert url != null;
// Note: The semicolon may or may not be URL-encoded depending on the HTTP client
assert (url.contains("discard_actors=userA%3BuserB%3BuserC") || url.contains("discard_actors=userA;userB;userC"))
: "URL should contain semicolon-separated actors, got: " + url;
assert (url.contains("discard_actors_sep=%3B") || url.contains("discard_actors_sep=;"))
: "URL should contain discard_actors_sep, got: " + url;
}
}