264 lines
9.2 KiB
C#
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);
|
|
}
|
|
}
|