Files
RedHotRoast-ios/Assets/TCJPLYRM1xJTSDK/ThirdParty/com.unity.mobile.notifications@2.3.2/Tests/Unified/UnifiedNotificationsSendingTests.cs
T
2026-07-14 09:49:24 +08:00

264 lines
9.2 KiB
C#

using System;
using System.Collections;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
using Unity.Notifications;
class UnifiedNotificationsSendingTests
{
[OneTimeSetUp]
public void BeforeTests()
{
var args = NotificationCenterArgs.Default;
args.AndroidChannelId = "Unified";
args.AndroidChannelName = "Unified";
args.AndroidChannelDescription = "Unified notifications";
NotificationCenter.Initialize(args);
NotificationCenter.OnNotificationReceived += OnNotificationReceived;
}
[OneTimeTearDown]
public void AfterAllTests()
{
NotificationCenter.CancelAllScheduledNotifications();
}
[SetUp]
public void BeforeEachTest()
{
NotificationCenter.CancelAllScheduledNotifications();
receivedNotificationCount = 0;
lastNotification = null;
}
uint receivedNotificationCount = 0;
Notification? lastNotification;
void OnNotificationReceived(Notification notification)
{
++receivedNotificationCount;
lastNotification = notification;
}
IEnumerator WaitForNotification(float timeout)
{
var startCount = receivedNotificationCount;
float timePassed = 0;
while (receivedNotificationCount == startCount && timePassed < timeout)
{
yield return null;
timePassed += Time.deltaTime;
}
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.Android, RuntimePlatform.IPhonePlayer })]
public IEnumerator SendNotificationAllOptionsRoundtrip()
{
var notification = new Notification()
{
Identifier = 15,
Title = "Test",
Text = "Testing",
Data = "TestData",
Badge = 2,
};
NotificationCenter.ScheduleNotification(notification, new NotificationIntervalSchedule(TimeSpan.FromSeconds(2)));
yield return new WaitForSeconds(0.5f); // test notification is trully delayed
yield return WaitForNotification(60.0f);
Assert.AreEqual(1, receivedNotificationCount);
Assert.IsTrue(lastNotification.HasValue);
var n = lastNotification.Value;
Assert.AreEqual(15, n.Identifier);
Assert.AreEqual("Test", n.Title);
Assert.AreEqual("Testing", n.Text);
Assert.AreEqual("TestData", n.Data);
Assert.AreEqual(2, n.Badge);
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.Android, RuntimePlatform.IPhonePlayer })]
public IEnumerator ScheduleNotificationAtSpecificTime()
{
var notification = new Notification()
{
Title = "AtTime",
Text = "AtSpecificTime",
};
NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(2)));
yield return new WaitForSeconds(0.5f); // test notification is trully delayed
yield return WaitForNotification(60.0f);
Assert.AreEqual(1, receivedNotificationCount);
Assert.IsTrue(lastNotification.HasValue);
var n = lastNotification.Value;
Assert.AreEqual("AtTime", n.Title);
Assert.AreEqual("AtSpecificTime", n.Text);
Assert.AreNotEqual(0, n.Identifier); // ID should be auto-generated
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.Android, RuntimePlatform.IPhonePlayer })]
public IEnumerator ScheduleAndCancelNotification_DoesNotArrive()
{
var notification = new Notification()
{
Title = "Cancel",
Text = "To be cancelled",
};
int id = NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(3)));
yield return new WaitForSeconds(0.5f);
NotificationCenter.CancelScheduledNotification(id);
yield return WaitForNotification(6.0f);
Assert.AreEqual(0, receivedNotificationCount);
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.Android })]
public IEnumerator ScheduleNotification_WithExplicitCategory_UsesAndroidChannel()
{
#if UNITY_ANDROID
const string category = "the_category";
Unity.Notifications.Android.AndroidNotificationCenter.RegisterNotificationChannel(
new Unity.Notifications.Android.AndroidNotificationChannel()
{
Id = category,
Name = "Category",
Description = "For category testing",
Importance = Unity.Notifications.Android.Importance.Default,
}
);
Unity.Notifications.Android.AndroidNotificationCenter.OnNotificationReceived += OnAndroidNotification;
yield return ScheduleNotification_WithExplicitCategory(category);
Unity.Notifications.Android.AndroidNotificationCenter.OnNotificationReceived -= OnAndroidNotification;
Assert.IsNotNull(lastAndroidNotification);
Assert.AreEqual(category, lastAndroidNotification.Channel);
#else
yield break;
#endif
}
#if UNITY_ANDROID
Unity.Notifications.Android.AndroidNotificationIntentData lastAndroidNotification;
void OnAndroidNotification(Unity.Notifications.Android.AndroidNotificationIntentData intentData)
{
lastAndroidNotification = intentData;
}
#endif
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.IPhonePlayer })]
public IEnumerator ScheduleNotification_WithExplicitCategory_UsesiOSCategory()
{
#if UNITY_IOS
const string category = "the_category";
yield return ScheduleNotification_WithExplicitCategory(category);
var notification = (Unity.Notifications.iOS.iOSNotification)lastNotification.Value;
Assert.AreEqual(category, notification.CategoryIdentifier);
#else
yield break;
#endif
}
public IEnumerator ScheduleNotification_WithExplicitCategory(string category)
{
var notification = new Notification()
{
Title = "With category",
Text = "Sent to category",
};
NotificationCenter.ScheduleNotification(notification, category, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(3)));
yield return WaitForNotification(60.0f);
Assert.AreEqual(1, receivedNotificationCount);
Assert.IsTrue(lastNotification.HasValue);
var n = lastNotification.Value;
Assert.AreEqual("With category", n.Title);
Assert.AreEqual("Sent to category", n.Text);
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.IPhonePlayer })]
public IEnumerator ScheduleNotification_WithoutCategory_UsesNoiOSCategory()
{
var notification = new Notification()
{
Title = "Without category",
Text = "Sent to no category",
};
NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(3)));
yield return WaitForNotification(60.0f);
Assert.AreEqual(1, receivedNotificationCount);
Assert.IsTrue(lastNotification.HasValue);
var n = lastNotification.Value;
Assert.AreEqual("Without category", n.Title);
Assert.AreEqual("Sent to no category", n.Text);
#if UNITY_IOS
var iosNotification = (Unity.Notifications.iOS.iOSNotification)n;
Assert.IsNull(iosNotification.CategoryIdentifier);
#endif
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.Android, RuntimePlatform.IPhonePlayer })]
public IEnumerator ScheduleWithSameID_ReplacesNotification()
{
var notification = new Notification()
{
Identifier = 123,
Title = "Replace",
Text = "To be replaced",
};
NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(2)));
yield return null;
notification.Text = "Replacement text";
NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(3)));
yield return WaitForNotification(60.0f);
yield return new WaitForSeconds(5); // wait a bit more in case the second notification does arrive
Assert.AreEqual(1, receivedNotificationCount);
Assert.IsTrue(lastNotification.HasValue);
var n = lastNotification.Value;
Assert.AreEqual(123, n.Identifier.Value);
Assert.AreEqual("Replace", n.Title);
Assert.AreEqual("Replacement text", n.Text);
}
[UnityTest]
[UnityPlatform(new[] { RuntimePlatform.Android, RuntimePlatform.IPhonePlayer })]
public IEnumerator ScheduleWithoutIDTwice_DeliversTwo()
{
var notification = new Notification()
{
Title = "No replace",
Text = "Not replaced",
};
var id1 = NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(2)));
yield return null;
var id2 = NotificationCenter.ScheduleNotification(notification, new NotificationDateTimeSchedule(DateTime.Now.AddSeconds(3)));
Assert.AreNotEqual(id1, id2);
yield return WaitForNotification(60.0f);
// Both could be batched
if (receivedNotificationCount < 2)
yield return WaitForNotification(60.0f);
Assert.AreEqual(2, receivedNotificationCount);
}
}