/ src / modules / cmdpal / Tests / Microsoft.CmdPal.Ext.Bookmarks.UnitTests / BookmarksCommandProviderTests.cs
BookmarksCommandProviderTests.cs
  1  // Copyright (c) Microsoft Corporation
  2  // The Microsoft Corporation licenses this file to you under the MIT license.
  3  // See the LICENSE file in the project root for more information.
  4  
  5  using System.Linq;
  6  using System.Threading.Tasks;
  7  using Microsoft.CmdPal.Ext.Bookmarks.Persistence;
  8  using Microsoft.VisualStudio.TestTools.UnitTesting;
  9  
 10  namespace Microsoft.CmdPal.Ext.Bookmarks.UnitTests;
 11  
 12  [TestClass]
 13  public class BookmarksCommandProviderTests
 14  {
 15      [TestMethod]
 16      public void ProviderHasCorrectId()
 17      {
 18          // Setup
 19          var mockBookmarkManager = new MockBookmarkManager();
 20          var provider = new BookmarksCommandProvider(mockBookmarkManager);
 21  
 22          // Assert
 23          Assert.AreEqual("Bookmarks", provider.Id);
 24      }
 25  
 26      [TestMethod]
 27      public void ProviderHasDisplayName()
 28      {
 29          // Setup
 30          var mockBookmarkManager = new MockBookmarkManager();
 31          var provider = new BookmarksCommandProvider(mockBookmarkManager);
 32  
 33          // Assert
 34          Assert.IsNotNull(provider.DisplayName);
 35          Assert.IsTrue(provider.DisplayName.Length > 0);
 36      }
 37  
 38      [TestMethod]
 39      public void ProviderHasIcon()
 40      {
 41          // Setup
 42          var mockBookmarkManager = new MockBookmarkManager();
 43          var provider = new BookmarksCommandProvider(mockBookmarkManager);
 44  
 45          // Assert
 46          Assert.IsNotNull(provider.Icon);
 47      }
 48  
 49      [TestMethod]
 50      public void TopLevelCommandsNotEmpty()
 51      {
 52          // Setup
 53          var mockBookmarkManager = new MockBookmarkManager();
 54          var provider = new BookmarksCommandProvider(mockBookmarkManager);
 55  
 56          // Act
 57          var commands = provider.TopLevelCommands();
 58  
 59          // Assert
 60          Assert.IsNotNull(commands);
 61          Assert.IsTrue(commands.Length > 0);
 62      }
 63  
 64      [TestMethod]
 65      [Timeout(5000)]
 66      public async Task ProviderWithMockData_LoadsBookmarksCorrectly()
 67      {
 68          // Arrange
 69          var mockBookmarkManager = new MockBookmarkManager(
 70              new BookmarkData("Test Bookmark", "http://test.com"),
 71              new BookmarkData("Another Bookmark", "http://another.com"));
 72          var provider = new BookmarksCommandProvider(mockBookmarkManager);
 73  
 74          // Act
 75          var commands = provider.TopLevelCommands();
 76  
 77          // Assert
 78          Assert.IsNotNull(commands, "commands != null");
 79  
 80          // Should have three commands:Add + two custom bookmarks
 81          Assert.AreEqual(3, commands.Length);
 82  
 83          // Wait until all BookmarkListItem commands are initialized
 84          await Task.WhenAll(commands.OfType<Pages.BookmarkListItem>().Select(t => t.IsInitialized));
 85  
 86          var addCommand = commands.FirstOrDefault(c => c.Title.Contains("Add bookmark"));
 87          var testBookmark = commands.FirstOrDefault(c => c.Title.Contains("Test Bookmark"));
 88  
 89          Assert.IsNotNull(addCommand, "addCommand != null");
 90          Assert.IsNotNull(testBookmark, "testBookmark != null");
 91      }
 92  
 93      [TestMethod]
 94      public void ProviderWithEmptyData_HasOnlyAddCommand()
 95      {
 96          // Arrange
 97          var mockBookmarkManager = new MockBookmarkManager();
 98          var provider = new BookmarksCommandProvider(mockBookmarkManager);
 99  
100          // Act
101          var commands = provider.TopLevelCommands();
102  
103          // Assert
104          Assert.IsNotNull(commands);
105  
106          // Only have Add command
107          Assert.AreEqual(1, commands.Length);
108  
109          var addCommand = commands.FirstOrDefault(c => c.Title.Contains("Add bookmark"));
110          Assert.IsNotNull(addCommand);
111      }
112  
113      [TestMethod]
114      public void ProviderWithInvalidData_HandlesGracefully()
115      {
116          // Arrange
117          var dataSource = new MockBookmarkDataSource("invalid json");
118          var provider = new BookmarksCommandProvider(new MockBookmarkManager());
119  
120          // Act
121          var commands = provider.TopLevelCommands();
122  
123          // Assert
124          Assert.IsNotNull(commands);
125  
126          // Only have one command. Will ignore json parse error.
127          Assert.AreEqual(1, commands.Length);
128  
129          var addCommand = commands.FirstOrDefault(c => c.Title.Contains("Add bookmark"));
130          Assert.IsNotNull(addCommand);
131      }
132  }