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,52 @@
using System;
using Paca.Mobile.Core;
using Xunit;
namespace Paca.Tests.Core;
public class BandwidthRateLimiterGateTests
{
[Fact]
public void Gate277_BandwidthRateLimiter_UnlimitedPreset_AllowsFullSpeed()
{
var limiter = new BandwidthRateLimiter(BandwidthLimitPreset.Unlimited);
var delay = limiter.ComputeThrottleDelayMs(chunkBytes: 10_000_000, elapsedMs: 10);
Assert.Equal(0, delay);
}
[Fact]
public void Gate278_BandwidthRateLimiter_TokenBucket_EnforcesByteCap()
{
// 1 MB/s = 1,000,000 bytes/sec
var limiter = new BandwidthRateLimiter(bytesPerSecond: 1_000_000);
// Downloaded 1MB in 200ms -> should throttle ~800ms
var delay = limiter.ComputeThrottleDelayMs(chunkBytes: 1_000_000, elapsedMs: 200);
Assert.InRange(delay, 750, 850);
}
[Fact]
public void Gate279_BandwidthRateLimiter_Presets_FormatLabelsCleanly()
{
Assert.Equal("무제한", BandwidthRateLimiter.GetPresetLabel(BandwidthLimitPreset.Unlimited));
Assert.Equal("10 MB/s (고속)", BandwidthRateLimiter.GetPresetLabel(BandwidthLimitPreset.Fast10MB));
Assert.Equal("5 MB/s (일반)", BandwidthRateLimiter.GetPresetLabel(BandwidthLimitPreset.Medium5MB));
Assert.Equal("1 MB/s (절약)", BandwidthRateLimiter.GetPresetLabel(BandwidthLimitPreset.Low1MB));
}
[Fact]
public void Gate280_BandwidthRateLimiter_DynamicRateChange_TakesEffectImmediately()
{
var limiter = new BandwidthRateLimiter(bytesPerSecond: 1_000_000);
Assert.Equal(1_000_000, limiter.BytesPerSecond);
// Update mid-stream
limiter.SetRate(5_000_000);
Assert.Equal(5_000_000, limiter.BytesPerSecond);
// Now 1MB at 5MB/s expects 200ms total time, elapsed 100ms -> delay ~100ms
var delay = limiter.ComputeThrottleDelayMs(chunkBytes: 1_000_000, elapsedMs: 100);
Assert.InRange(delay, 80, 120);
}
}