@@ -6,8 +6,11 @@ import {
6
6
DraftResponse ,
7
7
LinkPreviewsManagerConfig ,
8
8
MessageComposer ,
9
+ MessageComposerConfig ,
9
10
StreamChat ,
10
11
} from '../../../src' ;
12
+ import { DeepPartial } from '../../../src/types.utility' ;
13
+ import { mergeWith } from '../../../src/utils/mergeWith' ;
11
14
12
15
const existingLinkUrl = 'https://existing.com' ;
13
16
const linkUrl = 'https://example.com' ;
@@ -63,12 +66,19 @@ const enrichURLReturnValue = {
63
66
duration : 1000 ,
64
67
} ;
65
68
69
+ const DEFAULT_CONFIG : DeepPartial < MessageComposerConfig > = {
70
+ linkPreviews : {
71
+ debounceURLEnrichmentMs : 0 ,
72
+ enabled : true ,
73
+ } ,
74
+ } ;
75
+
66
76
const setup = ( {
67
77
composition,
68
78
config,
69
79
} : {
70
80
composition ?: DraftResponse | LocalMessage ;
71
- config ?: Partial < LinkPreviewsManagerConfig > ;
81
+ config ?: Partial < LinkPreviewsManagerConfig > | null ;
72
82
message ?: DraftMessage | LocalMessage ;
73
83
} = { } ) => {
74
84
// Reset mocks
@@ -79,11 +89,12 @@ const setup = ({
79
89
mockClient . enrichURL = vi . fn ( ) . mockResolvedValue ( enrichURLReturnValue ) ;
80
90
81
91
const mockChannel = mockClient . channel ( 'channelType' , 'channelId' ) ;
92
+ mockChannel . getConfig = vi . fn ( ) . mockImplementation ( ( ) => ( { url_enrichment : true } ) ) ;
82
93
const messageComposer = new MessageComposer ( {
83
94
client : mockClient ,
84
95
composition,
85
96
compositionContext : mockChannel ,
86
- config : { linkPreviews : config } ,
97
+ config : config === null ? { } : mergeWith ( DEFAULT_CONFIG , { linkPreviews : config } ) ,
87
98
} ) ;
88
99
return { mockClient, mockChannel, messageComposer } ;
89
100
} ;
@@ -97,7 +108,7 @@ describe('LinkPreviewsManager', () => {
97
108
it ( 'should initialize with default config' , ( ) => {
98
109
const {
99
110
messageComposer : { linkPreviewsManager } ,
100
- } = setup ( ) ;
111
+ } = setup ( { config : null } ) ;
101
112
expect ( linkPreviewsManager . config . enabled ) . toBe ( true ) ;
102
113
expect ( linkPreviewsManager . config . debounceURLEnrichmentMs ) . toBe (
103
114
DEFAULT_LINK_PREVIEW_MANAGER_CONFIG . debounceURLEnrichmentMs ,
@@ -143,16 +154,40 @@ describe('LinkPreviewsManager', () => {
143
154
expect ( linkPreviewsManager . previews . size ) . toBe ( 1 ) ;
144
155
expect ( linkPreviewsManager . previews . get ( linkUrl ) ) . toBeDefined ( ) ;
145
156
} ) ;
157
+
158
+ it ( 'should not initialize with message containing link previews if disabled' , ( ) => {
159
+ const composition : LocalMessage = {
160
+ id : 'test-message-id' ,
161
+ text : '' ,
162
+ type : 'regular' ,
163
+ created_at : new Date ( ) ,
164
+ deleted_at : null ,
165
+ pinned_at : null ,
166
+ status : 'pending' ,
167
+ updated_at : new Date ( ) ,
168
+ attachments : [
169
+ {
170
+ og_scrape_url : linkUrl ,
171
+ title : 'Example Title' ,
172
+ type : 'link' ,
173
+ } ,
174
+ ] ,
175
+ } ;
176
+
177
+ const {
178
+ messageComposer : { linkPreviewsManager } ,
179
+ } = setup ( { composition, config : { enabled : false } } ) ;
180
+
181
+ expect ( linkPreviewsManager . previews . size ) . toBe ( 0 ) ;
182
+ } ) ;
146
183
} ) ;
147
184
148
185
describe ( 'getters' , ( ) => {
149
186
it ( 'should return loadingPreviews correctly' , async ( ) => {
150
187
const {
151
188
messageComposer : { linkPreviewsManager } ,
152
189
mockClient,
153
- } = setup ( {
154
- config : { debounceURLEnrichmentMs : 0 , enabled : true } ,
155
- } ) ;
190
+ } = setup ( ) ;
156
191
157
192
// Mock the enrichURL to never resolve
158
193
mockClient . enrichURL = vi . fn ( ) . mockImplementation ( ( ) => new Promise ( ( ) => { } ) ) ;
@@ -174,10 +209,7 @@ describe('LinkPreviewsManager', () => {
174
209
it ( 'should return loadedPreviews correctly' , async ( ) => {
175
210
const {
176
211
messageComposer : { linkPreviewsManager } ,
177
- mockClient,
178
- } = setup ( {
179
- config : { debounceURLEnrichmentMs : 0 , enabled : true } ,
180
- } ) ;
212
+ } = setup ( ) ;
181
213
182
214
// Add a loaded preview
183
215
linkPreviewsManager . findAndEnrichUrls ( 'Check out https://example.com' ) ;
@@ -348,22 +380,51 @@ describe('LinkPreviewsManager', () => {
348
380
} ) ;
349
381
350
382
describe ( 'findAndEnrichUrls' , ( ) => {
351
- it ( 'should not process URLs if disabled' , async ( ) => {
383
+ it ( 'should not process URLs if disabled back-end url_enrichment' , async ( ) => {
384
+ const {
385
+ messageComposer : { linkPreviewsManager } ,
386
+ mockChannel,
387
+ mockClient,
388
+ } = setup ( ) ;
389
+ mockChannel . getConfig . mockReturnValueOnce ( { url_enrichment : false } ) ;
390
+ linkPreviewsManager . findAndEnrichUrls ( 'Check out https://example.com' ) ;
391
+ let enrichPromiseResolve ;
392
+ mockClient . enrichURL = vi . fn ( ) . mockImplementation ( ( ) => {
393
+ return new Promise ( ( resolve ) => {
394
+ enrichPromiseResolve = resolve ;
395
+ } ) ;
396
+ } ) ;
397
+ linkPreviewsManager . findAndEnrichUrls ( 'Check out https://example.com' ) ;
398
+ // Wait for the debounced function to be called
399
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 0 ) ) ;
400
+ expect ( mockClient . enrichURL ) . not . toHaveBeenCalled ( ) ;
401
+ expect ( linkPreviewsManager . previews . size ) . toBe ( 0 ) ;
402
+ } ) ;
403
+
404
+ it ( 'should not process URLs if disabled via the manager config' , async ( ) => {
352
405
const {
353
406
messageComposer : { linkPreviewsManager } ,
354
407
mockClient,
355
408
} = setup ( { config : { enabled : false } } ) ;
356
409
linkPreviewsManager . findAndEnrichUrls ( 'Check out https://example.com' ) ;
410
+ let enrichPromiseResolve ;
411
+ mockClient . enrichURL = vi . fn ( ) . mockImplementation ( ( ) => {
412
+ return new Promise ( ( resolve ) => {
413
+ enrichPromiseResolve = resolve ;
414
+ } ) ;
415
+ } ) ;
416
+ linkPreviewsManager . findAndEnrichUrls ( 'Check out https://example.com' ) ;
417
+ // Wait for the debounced function to be called
418
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 0 ) ) ;
357
419
expect ( mockClient . enrichURL ) . not . toHaveBeenCalled ( ) ;
420
+ expect ( linkPreviewsManager . previews . size ) . toBe ( 0 ) ;
358
421
} ) ;
359
422
360
423
it ( 'should process URLs and create link previews' , async ( ) => {
361
424
const {
362
425
messageComposer : { linkPreviewsManager } ,
363
426
mockClient,
364
- } = setup ( {
365
- config : { debounceURLEnrichmentMs : 0 , enabled : true } ,
366
- } ) ;
427
+ } = setup ( ) ;
367
428
let enrichPromiseResolve ;
368
429
mockClient . enrichURL = vi . fn ( ) . mockImplementation ( ( ) => {
369
430
return new Promise ( ( resolve ) => {
@@ -385,9 +446,7 @@ describe('LinkPreviewsManager', () => {
385
446
it ( 'should update link preview status to LOADED when enrichment succeeds' , async ( ) => {
386
447
const {
387
448
messageComposer : { linkPreviewsManager } ,
388
- } = setup ( {
389
- config : { debounceURLEnrichmentMs : 0 , enabled : true } ,
390
- } ) ;
449
+ } = setup ( ) ;
391
450
linkPreviewsManager . findAndEnrichUrls ( 'Check out https://example.com' ) ;
392
451
393
452
// Wait for the debounced function to be called and the promise to resolve
@@ -402,9 +461,7 @@ describe('LinkPreviewsManager', () => {
402
461
const {
403
462
messageComposer : { linkPreviewsManager } ,
404
463
mockClient,
405
- } = setup ( {
406
- config : { debounceURLEnrichmentMs : 0 , enabled : true } ,
407
- } ) ;
464
+ } = setup ( ) ;
408
465
mockClient . enrichURL . mockRejectedValueOnce ( new Error ( 'Enrichment failed' ) ) ;
409
466
410
467
linkPreviewsManager . findAndEnrichUrls ( 'Check out https://example.com' ) ;
@@ -420,9 +477,7 @@ describe('LinkPreviewsManager', () => {
420
477
const {
421
478
messageComposer : { linkPreviewsManager } ,
422
479
mockClient,
423
- } = setup ( {
424
- config : { debounceURLEnrichmentMs : 0 , enabled : true } ,
425
- } ) ;
480
+ } = setup ( ) ;
426
481
linkPreviewsManager . findAndEnrichUrls ( 'Check out https://example.com' ) ;
427
482
428
483
// Wait for the debounced function to be called
@@ -440,9 +495,7 @@ describe('LinkPreviewsManager', () => {
440
495
it ( 'should not keep existing link previews if source string does not include them anymore' , async ( ) => {
441
496
const {
442
497
messageComposer : { linkPreviewsManager } ,
443
- } = setup ( {
444
- config : { debounceURLEnrichmentMs : 0 , enabled : true } ,
445
- } ) ;
498
+ } = setup ( ) ;
446
499
const existingPreview = {
447
500
og_scrape_url : 'https://existing.com ' ,
448
501
status : LinkPreviewStatus . LOADED ,
@@ -467,9 +520,7 @@ describe('LinkPreviewsManager', () => {
467
520
it ( 'should keep existing link previews' , async ( ) => {
468
521
const {
469
522
messageComposer : { linkPreviewsManager } ,
470
- } = setup ( {
471
- config : { debounceURLEnrichmentMs : 0 , enabled : true } ,
472
- } ) ;
523
+ } = setup ( ) ;
473
524
const existingPreview = {
474
525
og_scrape_url : 'https://existing.com' ,
475
526
status : LinkPreviewStatus . LOADED ,
0 commit comments