You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
8.2 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine.Experimental.UIElements;
  5. using NUnit.Framework;
  6. namespace UnityEditor.PackageManager.UI.Tests
  7. {
  8. internal class PackageManagerWindowTests : UITests<PackageManagerWindow>
  9. {
  10. // Filter change shows correct result
  11. private Action<IEnumerable<Package>> onPackageChangedEvent; // TODO: We need to have a discussion on event de-registration
  12. private bool showPreviewPackagesPreviousValue;
  13. [SetUp]
  14. public void Setup()
  15. {
  16. showPreviewPackagesPreviousValue = PackageManagerPrefs.ShowPreviewPackages;
  17. PackageManagerPrefs.ShowPreviewPackages = true;
  18. PackageCollection.Instance.SetFilter(PackageFilter.Local);
  19. SetListPackages(Enumerable.Empty<PackageInfo>());
  20. SetSearchPackages(Enumerable.Empty<PackageInfo>());
  21. Factory.ResetOperations();
  22. }
  23. [TearDown]
  24. public void TearDown()
  25. {
  26. PackageCollection.Instance.OnPackagesChanged -= onPackageChangedEvent;
  27. PackageManagerPrefs.ShowPreviewPackages = showPreviewPackagesPreviousValue;
  28. }
  29. [Test]
  30. public void When_Default_FirstPackageUIElement_HasSelectedClass()
  31. {
  32. onPackageChangedEvent = packages =>
  33. {
  34. var package = Container.Query(null, "package").First();
  35. Assert.NotNull(package);
  36. Assert.IsTrue(package.ClassListContains(PackageItem.SelectedClassName));
  37. };
  38. PackageCollection.Instance.OnPackagesChanged += onPackageChangedEvent;
  39. SetListPackages(PackageSets.Instance.Many(5, true));
  40. }
  41. [Test]
  42. public void When_PackageCollection_Updates_PackageList_Updates()
  43. {
  44. var packages = PackageSets.Instance.Outdated();
  45. var current = packages.ToList().First();
  46. var latest = packages.ToList().Last();
  47. SetListPackages(packages);
  48. Factory.AddOperation = new MockAddOperation(Factory, latest);
  49. var package = PackageCollection.Instance.GetPackageByName(current.Name);
  50. onPackageChangedEvent = newpackages =>
  51. {
  52. package = PackageCollection.Instance.GetPackageByName(current.Name);
  53. Assert.IsTrue(package.Current.PackageId == latest.PackageId);
  54. var packageItem = Container.Query(null, "package").Build().First();
  55. var label = packageItem.Q<Label>("packageName");
  56. var version = packageItem.Q<Label>("packageVersion");
  57. var state = packageItem.Q<Label>("packageState");
  58. var hasOutdatedClass = state.ClassListContains(PackageItem.GetIconStateId(PackageState.Outdated));
  59. Assert.IsTrue(latest.Name == string.Format("com.unity.{0}", label.text));
  60. Assert.IsTrue(latest.Version == version.text);
  61. Assert.IsFalse(hasOutdatedClass);
  62. };
  63. package.AddSignal.OnOperation += operation =>
  64. {
  65. operation.OnOperationSuccess += packageInfo =>
  66. {
  67. PackageCollection.Instance.OnPackagesChanged += onPackageChangedEvent;
  68. };
  69. };
  70. package.Update();
  71. }
  72. [Test]
  73. public void When_PackageCollection_Update_Fails_Package_Stay_Current()
  74. {
  75. var packages = PackageSets.Instance.Outdated();
  76. var current = packages.ToList().First();
  77. var latest = packages.ToList().Last();
  78. SetListPackages(packages);
  79. var error = MakeError(ErrorCode.Unknown, "Fake error");
  80. Factory.AddOperation = new MockAddOperation(Factory, latest);
  81. Factory.AddOperation.ForceError = error;
  82. var package = PackageCollection.Instance.GetPackageByName(current.Name);
  83. package.AddSignal.OnOperation += operation =>
  84. {
  85. operation.OnOperationError += operationError => { Assert.IsTrue(error == operationError); };
  86. operation.OnOperationFinalized += () =>
  87. {
  88. Assert.IsTrue(package.Current.PackageId ==
  89. current.PackageId); // Make sure package hasn't been upgraded
  90. var packageItem = Container.Query(null, "package").Build().First();
  91. var label = packageItem.Q<Label>("packageName");
  92. var version = packageItem.Q<Label>("packageVersion");
  93. var state = packageItem.Q<Label>("packageState");
  94. var hasErrorClass = state.ClassListContains(PackageItem.GetIconStateId(PackageState.Error));
  95. Assert.IsTrue(current.Name == string.Format("com.unity.{0}", label.text));
  96. Assert.IsTrue(current.Version == version.text);
  97. Assert.IsTrue(hasErrorClass);
  98. };
  99. };
  100. package.Update();
  101. }
  102. [Test]
  103. public void When_PackageCollection_Remove_PackageLists_Updated()
  104. {
  105. var packages = PackageSets.Instance.Many(5);
  106. var current = packages.ToList().First();
  107. SetListPackages(packages);
  108. var package = PackageCollection.Instance.GetPackageByName(current.Name);
  109. Assert.IsNotNull(package);
  110. onPackageChangedEvent = allPackages =>
  111. {
  112. package = PackageCollection.Instance.GetPackageByName(current.Name);
  113. Assert.IsNull(package);
  114. };
  115. PackageCollection.Instance.OnPackagesChanged += onPackageChangedEvent;
  116. package.Remove();
  117. PackageCollection.Instance.FetchListOfflineCache(true);
  118. }
  119. [Test]
  120. public void When_PackageCollection_Remove_Fails_PackageLists_NotUpdated()
  121. {
  122. var packages = PackageSets.Instance.Many(5);
  123. var current = packages.ToList().First();
  124. var error = MakeError(ErrorCode.Unknown, "Fake error");
  125. Factory.RemoveOperation = new MockRemoveOperation(Factory) {ForceError = error};
  126. SetListPackages(packages);
  127. var package = PackageCollection.Instance.GetPackageByName(current.Name);
  128. Assert.IsNotNull(package);
  129. package.RemoveSignal.OnOperation += operation =>
  130. {
  131. operation.OnOperationError += operationError => { Assert.AreEqual(error, operationError); };
  132. operation.OnOperationFinalized += () =>
  133. {
  134. package = PackageCollection.Instance.GetPackageByName(current.Name);
  135. Assert.IsNotNull(package);
  136. };
  137. };
  138. package.Remove();
  139. }
  140. [Test]
  141. public void When_Filter_Changes_Shows_Correct_List()
  142. {
  143. var packagesLocal = PackageSets.Instance.Many(2);
  144. var packagesAll = PackageSets.Instance.Many(5);
  145. SetListPackages(packagesLocal);
  146. SetSearchPackages(packagesAll);
  147. onPackageChangedEvent = packages =>
  148. {
  149. foreach (var package in packagesAll)
  150. {
  151. Assert.IsTrue(packages.Any(updatePackage => updatePackage.Current == package));
  152. }
  153. };
  154. PackageCollection.Instance.OnPackagesChanged += onPackageChangedEvent;
  155. PackageCollection.Instance.SetFilter(PackageFilter.All);
  156. }
  157. [Test]
  158. public void ListPackages_UsesCache()
  159. {
  160. PackageCollection.Instance.SetFilter(PackageFilter.Local); // Set filter to use list
  161. SetListPackages(PackageSets.Instance.Many(2));
  162. Assert.IsTrue(PackageCollection.Instance.LatestListPackages.Any()); // Make sure packages are cached
  163. }
  164. [Test]
  165. public void SearchPackages_UsesCache()
  166. {
  167. PackageCollection.Instance.SetFilter(PackageFilter.All); // Set filter to use search
  168. SetSearchPackages(PackageSets.Instance.Many(2));
  169. Assert.IsTrue(PackageCollection.Instance.LatestSearchPackages.Any()); // Make sure packages are cached
  170. }
  171. }
  172. }