feat(ads/seo/release): v1.2.0 with live Google Ads, isolated ad profile, ads.txt, and SEO/AEO/GEO optimization

This commit is contained in:
Yun Chan 2026-09-14 00:39:44 +09:00
parent a88aafa1e5
commit 0e568f1f0a
975 changed files with 130593 additions and 16783 deletions

View file

@ -0,0 +1,72 @@
using System;
using System.Collections.Generic;
using Paca.Mobile.Core;
using Xunit;
namespace Paca.Tests.Core;
public class NetworkResilienceSupervisorGateTests
{
[Fact]
public void Gate265_NetworkResilienceSupervisor_PausesActiveDownloads_OnNetworkLoss()
{
var supervisor = new NetworkResilienceSupervisor();
var item1 = new ResilientDownloadItem("id-1", "video1", ResilientDownloadState.Downloading);
var item2 = new ResilientDownloadItem("id-2", "video2", ResilientDownloadState.Downloading);
supervisor.RegisterItems(new[] { item1, item2 });
// Network goes down
supervisor.OnNetworkStatusChanged(isConnected: false);
Assert.Equal(ResilientDownloadState.NetworkPaused, item1.State);
Assert.Equal(ResilientDownloadState.NetworkPaused, item2.State);
}
[Fact]
public void Gate266_NetworkResilienceSupervisor_AutomaticallyResumes_OnNetworkRestored()
{
var supervisor = new NetworkResilienceSupervisor();
var item = new ResilientDownloadItem("id-1", "video1", ResilientDownloadState.Downloading);
supervisor.RegisterItems(new[] { item });
supervisor.OnNetworkStatusChanged(isConnected: false);
Assert.Equal(ResilientDownloadState.NetworkPaused, item.State);
// Network comes back up
var resumedItems = supervisor.OnNetworkStatusChanged(isConnected: true);
Assert.Equal(ResilientDownloadState.Downloading, item.State);
Assert.Single(resumedItems);
Assert.Equal("id-1", resumedItems[0].Id);
}
[Fact]
public void Gate267_NetworkResilienceSupervisor_DoesNotResume_UserPausedItems()
{
var supervisor = new NetworkResilienceSupervisor();
var userPausedItem = new ResilientDownloadItem("id-user", "video_paused", ResilientDownloadState.UserPaused);
supervisor.RegisterItems(new[] { userPausedItem });
// Network disconnect then reconnect
supervisor.OnNetworkStatusChanged(isConnected: false);
var resumed = supervisor.OnNetworkStatusChanged(isConnected: true);
Assert.Equal(ResilientDownloadState.UserPaused, userPausedItem.State);
Assert.Empty(resumed);
}
[Fact]
public void Gate268_NetworkResilienceSupervisor_JitteredBackoff_CalculatesDelays()
{
var supervisor = new NetworkResilienceSupervisor();
var delay1 = supervisor.GetJitteredDelayMs(itemIndex: 0, baseDelayMs: 500);
var delay2 = supervisor.GetJitteredDelayMs(itemIndex: 1, baseDelayMs: 500);
var delay3 = supervisor.GetJitteredDelayMs(itemIndex: 2, baseDelayMs: 500);
Assert.True(delay1 >= 500);
Assert.True(delay2 > delay1);
Assert.True(delay3 > delay2);
}
}