using System; using Paca.Mobile.Core; using Xunit; namespace Paca.Tests.Core; public class RemoteClipboardBridgeGateTests { [Fact] public void Gate309_RemoteClipboardBridge_SanitizesAndBlocksDangerousSchemes() { // Allowed HTTP / HTTPS var validHttps = "https://www.youtube.com/watch?v=remote123"; Assert.True(RemoteClipboardBridge.IsValidMediaUrl(validHttps, out var cleanUrl1)); Assert.Equal(validHttps, cleanUrl1); // Block javascript: injection var dangerous1 = "javascript:alert(1)"; Assert.False(RemoteClipboardBridge.IsValidMediaUrl(dangerous1, out _)); // Block local file scheme var dangerous2 = "file:///C:/Windows/System32/calc.exe"; Assert.False(RemoteClipboardBridge.IsValidMediaUrl(dangerous2, out _)); } [Fact] public void Gate310_RemoteClipboardBridge_SerializesAndDeserializes_Correctly() { var payload = new RemoteClipboardPayload( Url: "https://instagram.com/reel/abc999", SourceDeviceName: "Galaxy S24", TargetDeviceName: "Paca Desktop", AutoStartDownload: true, SentAt: new DateTime(2026, 9, 4, 20, 30, 0, DateTimeKind.Utc) ); var json = RemoteClipboardBridge.Serialize(payload); Assert.Contains("instagram.com", json); Assert.Contains("Galaxy S24", json); var restored = RemoteClipboardBridge.Deserialize(json); Assert.NotNull(restored); Assert.Equal(payload.Url, restored!.Url); Assert.Equal(payload.SourceDeviceName, restored.SourceDeviceName); Assert.True(restored.AutoStartDownload); } [Fact] public void Gate311_RemoteClipboardBridge_BuildsPushRequest_WithGatewayEndpoint() { var payload = new RemoteClipboardPayload( Url: "https://tiktok.com/@creator/video/111", SourceDeviceName: "iPhone 15", TargetDeviceName: "Office PC", AutoStartDownload: true, SentAt: DateTime.UtcNow ); var targetGateway = "http://192.168.1.100:52100"; var pairingToken = "PACA-SEC-998877"; var (requestUri, bodyJson, authHeader) = RemoteClipboardBridge.BuildPushRequest( payload, targetGateway, pairingToken); Assert.Equal("http://192.168.1.100:52100/api/remote-clipboard", requestUri); Assert.Equal("Bearer PACA-SEC-998877", authHeader); Assert.Contains("tiktok.com", bodyJson); } [Fact] public void Gate312_RemoteClipboardBridge_HandlesIncomingPayload_AndDeterminesAutoDownload() { var payload = new RemoteClipboardPayload( Url: "https://www.youtube.com/watch?v=goodvideo", SourceDeviceName: "Mobile", TargetDeviceName: "Desktop", AutoStartDownload: true, SentAt: DateTime.UtcNow ); var result = RemoteClipboardBridge.ProcessIncomingPayload(payload); Assert.True(result.Success); Assert.True(result.ShouldTriggerDownload); Assert.Equal("https://www.youtube.com/watch?v=goodvideo", result.MediaUrl); Assert.Equal("Mobile 기기에서 보낸 링크를 즉시 다운로드합니다.", result.UserStatusMessage); } }