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,84 @@
using System;
using Paca.Mobile.Core;
using Xunit;
namespace Paca.Tests.Core;
public class DataUsageQuotaTrackerGateTests
{
[Fact]
public void Gate333_DataUsageQuotaTracker_AccumulatesWifiAndCellularSeparately()
{
var tracker = new DataUsageQuotaTracker();
tracker.RecordUsage(bytes: 500 * 1024 * 1024, isCellular: false); // 500 MB Wifi
tracker.RecordUsage(bytes: 300 * 1024 * 1024, isCellular: false); // 300 MB Wifi
tracker.RecordUsage(bytes: 200 * 1024 * 1024, isCellular: true); // 200 MB Cellular
Assert.Equal(800 * 1024 * 1024L, tracker.TotalWifiBytes);
Assert.Equal(200 * 1024 * 1024L, tracker.TotalCellularBytes);
Assert.Equal(1000 * 1024 * 1024L, tracker.TotalBytes);
}
[Fact]
public void Gate334_DataUsageQuotaTracker_TriggersWarningAt80Percent()
{
var settings = new QuotaSettings(
MonthlyCellularQuotaBytes: 10L * 1024 * 1024 * 1024, // 10 GB
WarningThresholdPercent: 80.0,
AutoPauseOnQuotaExceeded: true
);
// 8.2 GB consumed (82%)
var currentBytes = (long)(8.2 * 1024 * 1024 * 1024);
var status = DataUsageQuotaTracker.EvaluateQuota(currentBytes, settings);
Assert.True(status.IsWarning);
Assert.False(status.IsExceeded);
Assert.False(status.ShouldPauseDownload);
Assert.True(status.UsagePercent >= 80.0 && status.UsagePercent < 100.0);
}
[Fact]
public void Gate335_DataUsageQuotaTracker_AutoPausesWhen100PercentExceeded()
{
var settings = new QuotaSettings(
MonthlyCellularQuotaBytes: 5L * 1024 * 1024 * 1024, // 5 GB
WarningThresholdPercent: 80.0,
AutoPauseOnQuotaExceeded: true
);
// 5.1 GB consumed (102%)
var currentBytes = (long)(5.1 * 1024 * 1024 * 1024);
var status = DataUsageQuotaTracker.EvaluateQuota(currentBytes, settings);
Assert.True(status.IsWarning);
Assert.True(status.IsExceeded);
Assert.True(status.ShouldPauseDownload);
}
[Fact]
public void Gate336_DataUsageQuotaTracker_PassesGracefully_WhenUnlimitedOrAutoPauseDisabled()
{
var unlimitedSettings = new QuotaSettings(
MonthlyCellularQuotaBytes: 0, // 0 = Unlimited
WarningThresholdPercent: 80.0,
AutoPauseOnQuotaExceeded: true
);
var statusUnlimited = DataUsageQuotaTracker.EvaluateQuota(100L * 1024 * 1024 * 1024, unlimitedSettings);
Assert.False(statusUnlimited.IsWarning);
Assert.False(statusUnlimited.IsExceeded);
Assert.False(statusUnlimited.ShouldPauseDownload);
var noAutoPause = new QuotaSettings(
MonthlyCellularQuotaBytes: 1L * 1024 * 1024 * 1024,
WarningThresholdPercent: 80.0,
AutoPauseOnQuotaExceeded: false // Auto pause disabled
);
var statusNoPause = DataUsageQuotaTracker.EvaluateQuota(2L * 1024 * 1024 * 1024, noAutoPause);
Assert.True(statusNoPause.IsExceeded);
Assert.False(statusNoPause.ShouldPauseDownload); // Allowed because auto pause is disabled
}
}