@@ -300,4 +300,78 @@ def create_stubbed_video(overrides)
300300 assert_not article . video?
301301 assert_not article . video_cached?
302302 end
303+
304+ test "strip_tracking_params removes utm_* keys" do
305+ url = "https://example.com/page?utm_source=x&utm_medium=y&utm_campaign=z&kept=1"
306+ assert_equal "https://example.com/page?kept=1" , MediaItem . strip_tracking_params ( url )
307+ end
308+
309+ test "strip_tracking_params removes youtube si parameter" do
310+ url = "https://www.youtube.com/watch?v=abc123&si=AbCdEf"
311+ assert_equal "https://www.youtube.com/watch?v=abc123" , MediaItem . strip_tracking_params ( url )
312+ end
313+
314+ test "strip_tracking_params removes other known trackers" do
315+ %w[ fbclid gclid gbraid wbraid mc_cid mc_eid _hsenc _hsmi hsCtaTracking igshid yclid msclkid ] . each do |key |
316+ url = "https://example.com/page?#{ key } =value&kept=1"
317+ assert_equal "https://example.com/page?kept=1" , MediaItem . strip_tracking_params ( url ) ,
318+ "expected #{ key } to be stripped"
319+ end
320+ end
321+
322+ test "strip_tracking_params preserves non-tracking parameters" do
323+ url = "https://example.com/page?id=42&q=hello"
324+ assert_equal "https://example.com/page?id=42&q=hello" , MediaItem . strip_tracking_params ( url )
325+ end
326+
327+ test "strip_tracking_params returns url unchanged when query is empty" do
328+ url = "https://example.com/page"
329+ assert_equal "https://example.com/page" , MediaItem . strip_tracking_params ( url )
330+ end
331+
332+ test "strip_tracking_params drops the query string when all params are trackers" do
333+ url = "https://example.com/page?utm_source=a&fbclid=b"
334+ assert_equal "https://example.com/page" , MediaItem . strip_tracking_params ( url )
335+ end
336+
337+ test "strip_tracking_params preserves fragment after stripping all params" do
338+ url = "https://example.com/page?utm_source=a#section"
339+ assert_equal "https://example.com/page#section" , MediaItem . strip_tracking_params ( url )
340+ end
341+
342+ test "strip_tracking_params returns blank input unchanged" do
343+ assert_nil MediaItem . strip_tracking_params ( nil )
344+ assert_equal "" , MediaItem . strip_tracking_params ( "" )
345+ end
346+
347+ test "strip_tracking_params returns invalid url unchanged" do
348+ bad = "http://exa mple.com/?utm_source=x"
349+ assert_equal bad , MediaItem . strip_tracking_params ( bad )
350+ end
351+
352+ test "before_save strips tracking params from url" do
353+ feed = feeds ( :one )
354+ mi = feed . media_items . create! (
355+ url : "https://example.com/post?utm_source=newsletter&id=42" ,
356+ guid : "https://example.com/post-#{ SecureRandom . hex } " ,
357+ title : "T" ,
358+ description : "plain text" ,
359+ mime_type : MediaItem ::HTML_MIME_TYPE
360+ )
361+ assert_equal "https://example.com/post?id=42" , mi . url
362+ end
363+
364+ test "before_save strips tracking params from anchor hrefs in description" do
365+ feed = feeds ( :one )
366+ description = '<html><body><a href="https://www.youtube.com/watch?v=abc&si=tracker">v</a></body></html>'
367+ mi = feed . media_items . create! (
368+ url : "https://example.com/post" ,
369+ guid : "https://example.com/post-anchor-#{ SecureRandom . hex } " ,
370+ title : "T" ,
371+ description : description ,
372+ mime_type : MediaItem ::HTML_MIME_TYPE
373+ )
374+ assert_includes mi . description , 'href="https://www.youtube.com/watch?v=abc"'
375+ assert_not_includes mi . description , "si=tracker"
376+ end
303377end
0 commit comments