Пример #1
0
        public V3DetailControlModelTestBase(GlobalServiceProvider sp, V3PackageSearchMetadataFixture testData)
        {
            sp.Reset();
            _testData = testData;

            // The versions pre-baked into the view model provide data for the first step of metadata extraction
            // which fails (null) in a V3 scenario--they need to be extracted using a metadata provider (below)
            var testVersion  = new NuGetVersion(0, 0, 1);
            var testVersions = new List <VersionInfoContextInfo>()
            {
                new VersionInfoContextInfo(new NuGetVersion(0, 0, 1)),
                new VersionInfoContextInfo(new NuGetVersion(0, 0, 2))
            };

            _testViewModel = new PackageItemViewModel()
            {
                Id               = "nuget.psm",
                Version          = testVersion,
                Versions         = new Lazy <Task <IReadOnlyCollection <VersionInfoContextInfo> > >(() => Task.FromResult <IReadOnlyCollection <VersionInfoContextInfo> >(testVersions)),
                InstalledVersion = testVersion,
                Sources          = new List <PackageSourceContextInfo> {
                    new PackageSourceContextInfo("nuget.psm.test")
                },
            };
        }
        public async Task IconUrl_WithLocalPathAndColorProfile_LoadsImage()
        {
            // Prepare
            using (var testDir = TestDirectory.Create())
            {
                byte[]   bytes;
                Assembly testAssembly = typeof(PackageItemViewModelTests).Assembly;

                using (Stream sourceStream = testAssembly.GetManifestResourceStream("NuGet.PackageManagement.UI.Test.Resources.grayicc.png"))
                    using (var memoryStream = new MemoryStream())
                    {
                        sourceStream.CopyTo(memoryStream);
                        bytes = memoryStream.ToArray();
                    }

                string grayiccImagePath = Path.Combine(testDir, "grayicc.png");
                File.WriteAllBytes(grayiccImagePath, bytes);

                var packageItemViewModel = new PackageItemViewModel()
                {
                    Id                 = "PackageId.IconUrl_WithLocalPathAndColorProfile_LoadsImage",
                    Version            = new NuGetVersion("1.0.0"),
                    IconUrl            = new Uri(grayiccImagePath, UriKind.Absolute),
                    PackageFileService = _packageFileService,
                };

                // Act
                BitmapSource result = await GetFinalIconBitmapAsync(packageItemViewModel);

                // Assert
                VerifyImageResult(result, packageItemViewModel.BitmapStatus);
                Assert.Equal(IconBitmapStatus.FetchedIcon, packageItemViewModel.BitmapStatus);
            }
        }
        public async Task IconUrl_EmbeddedIcon_RelativeParentPath_ReturnsDefault(string separator)
        {
            using (var testDir = TestDirectory.Create())
            {
                // Create decoy nuget package
                var zipPath = Path.Combine(testDir.Path, "file.nupkg");
                CreateDummyPackage(zipPath);

                // prepare test
                var builder = new UriBuilder(new Uri(zipPath, UriKind.Absolute))
                {
                    Fragment = $"..{separator}icon.png"
                };

                var packageItemViewModel = new PackageItemViewModel()
                {
                    Id                 = "PackageId.IconUrl_EmbeddedIcon_RelativeParentPath_ReturnsDefault",
                    Version            = new NuGetVersion("1.0.0"),
                    IconUrl            = builder.Uri,
                    PackagePath        = zipPath,
                    PackageFileService = _packageFileService,
                };

                // Act
                BitmapSource result = await GetFinalIconBitmapAsync(packageItemViewModel);

                // Assert
                VerifyImageResult(result, packageItemViewModel.BitmapStatus);
                Assert.Equal(IconBitmapStatus.DefaultIconDueToNullStream, packageItemViewModel.BitmapStatus);
            }
        }
Пример #4
0
        /// <summary>
        /// Reads an Icon from test assembly resource
        /// </summary>
        /// <param name="imageFile">Relative path to the resource in test assembly</param>
        /// <returns>An awitable Task</returns>
        private async Task ReadIconFromEmbeddedResourceAsync(string imageFile)
        {
            // Prepare
            using (var testDir = TestDirectory.Create())
            {
                byte[]   bytes;
                Assembly testAssembly = typeof(PackageItemViewModelTests).Assembly;

                using (Stream sourceStream = testAssembly.GetManifestResourceStream($"NuGet.PackageManagement.UI.Test.Resources.{imageFile}"))
                    using (var memoryStream = new MemoryStream())
                    {
                        sourceStream.CopyTo(memoryStream);
                        bytes = memoryStream.ToArray();
                    }

                string imageFilePath = Path.Combine(testDir, imageFile);
                File.WriteAllBytes(imageFilePath, bytes);

                var packageItemViewModel = new PackageItemViewModel(_searchService.Object)
                {
                    Id                 = "TestPackageId",
                    Version            = new NuGetVersion("1.0.0"),
                    IconUrl            = new Uri(imageFilePath, UriKind.Absolute),
                    PackageFileService = _packageFileService,
                };

                // Act
                BitmapSource result = await GetFinalIconBitmapAsync(packageItemViewModel);

                // Assert
                VerifyImageResult(result, packageItemViewModel.BitmapStatus);
                Assert.Equal(IconBitmapStatus.FetchedIcon, packageItemViewModel.BitmapStatus);
            }
        }
        public PackageItemViewModelTests(
            GlobalServiceProvider globalServiceProvider,
            ITestOutputHelper output,
            LocalPackageSearchMetadataFixture testData)
            : base(globalServiceProvider)
        {
            globalServiceProvider.Reset();
            _serviceBroker.Setup(
#pragma warning disable ISB001 // Dispose of proxies
                x => x.GetProxyAsync <INuGetPackageFileService>(
                    It.Is <ServiceJsonRpcDescriptor>(d => d.Moniker == NuGetServices.PackageFileService.Moniker),
                    It.IsAny <ServiceActivationOptions>(),
                    It.IsAny <CancellationToken>()))
#pragma warning restore ISB001 // Dispose of proxies
            .Returns(new ValueTask <INuGetPackageFileService>(new NuGetPackageFileService(_serviceBroker.Object, _telemetryProvider.Object)));

            _packageFileService = new NuGetPackageFileService(_serviceBroker.Object, _telemetryProvider.Object);

            _testData     = testData;
            _testInstance = new PackageItemViewModel()
            {
                PackagePath        = _testData.TestData.PackagePath,
                PackageFileService = _packageFileService,
            };
            _output = output;
        }
        public async Task IconUrl_WithMalformedUrlScheme_ReturnsDefaultInitallyAndFinally()
        {
            var iconUrl = new Uri("httphttphttp://fake.test/image.png");

            var packageItemViewModel = new PackageItemViewModel()
            {
                Id                 = "PackageId.IconUrl_WithMalformedUrlScheme_ReturnsDefaultInitallyAndFinally",
                Version            = new NuGetVersion("1.0.0"),
                IconUrl            = iconUrl,
                PackageFileService = _packageFileService,
            };

            var packageIdentity = new PackageIdentity(packageItemViewModel.Id, packageItemViewModel.Version);

            NuGetPackageFileService.AddIconToCache(packageIdentity, packageItemViewModel.IconUrl);

            // initial result should be fetching and defaultpackageicon
            BitmapSource initialResult = packageItemViewModel.IconBitmap;

            Assert.Same(initialResult, Images.DefaultPackageIcon);

            BitmapSource result = await GetFinalIconBitmapAsync(packageItemViewModel, addIconToCache : false);

            VerifyImageResult(result, packageItemViewModel.BitmapStatus);
            Assert.Equal(IconBitmapStatus.DefaultIconDueToNullStream, packageItemViewModel.BitmapStatus);
        }
        public async Task SetCurrentPackageAsync_ClearVersions_Always()
        {
            // Arrange
            var installedVersion = NuGetVersion.Parse("1.0.0");

            var testVersions = new List <VersionInfoContextInfo>()
            {
                new VersionInfoContextInfo(new NuGetVersion("1.0.0")),
                new VersionInfoContextInfo(new NuGetVersion("1.0.1")),
            };

            var mockPropertyChangedEventHandler = new Mock <IPropertyChangedEventHandler>();
            var wasVersionsListCleared          = false;

            var searchService = new Mock <IReconnectingNuGetSearchService>();

            searchService.Setup(s => s.GetPackageVersionsAsync(It.IsAny <PackageIdentity>(), It.IsAny <IReadOnlyCollection <PackageSourceContextInfo> >(),
                                                               It.IsAny <bool>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(testVersions);
            var vm = new PackageItemViewModel(searchService.Object);

            vm.Id               = "a";
            vm.Sources          = new ReadOnlyCollection <PackageSourceContextInfo>(new List <PackageSourceContextInfo>());
            vm.InstalledVersion = installedVersion;
            vm.Version          = installedVersion;

            // Test Setup already selected a package.
            int previousVersionListCount = _testInstance.Versions.Count;

            mockPropertyChangedEventHandler.Setup(x => x.PropertyChanged(
                                                      It.IsAny <object>(),
                                                      It.IsAny <PropertyChangedEventArgs>()
                                                      ))
            .Callback <object, PropertyChangedEventArgs>((d, p) =>
            {
                DetailControlModel detail = d as DetailControlModel;
                if (detail != null &&
                    detail.Versions.Count == 0 &&
                    p.PropertyName == nameof(DetailControlModel.Versions))
                {
                    wasVersionsListCleared = true;
                }
            });

            _testInstance.PropertyChanged += mockPropertyChangedEventHandler.Object.PropertyChanged;

            // Act

            //Select a different VM which should clear the Versions list from the previous selection.
            await _testInstance.SetCurrentPackageAsync(
                vm,
                ItemFilter.All,
                () => vm);

            // Assert

            Assert.True(previousVersionListCount > 0, "Test setup did not pre-populate versions list.");
            Assert.True(wasVersionsListCleared, "Versions list was not cleared.");
        }
Пример #8
0
        public async Task SetCurrentPackageAsync_SortsVersions_ByNuGetVersionDesc()
        {
            // Arrange
            NuGetVersion installedVersion = NuGetVersion.Parse("1.0.0");

            var testVersions = new List <VersionInfoContextInfo>()
            {
                new VersionInfoContextInfo(new NuGetVersion("2.10.1-dev-01248")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.1-dev-01249")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.1-dev-01256")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.1-dev-01265")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.0-dev-01187")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.0-dev-01191")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.0-dev-01211")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.0")),
            };

            var searchService = new Mock <IReconnectingNuGetSearchService>();

            searchService.Setup(ss => ss.GetPackageVersionsAsync(It.IsAny <PackageIdentity>(), It.IsAny <IReadOnlyCollection <PackageSourceContextInfo> >(), It.IsAny <bool>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(testVersions);

            var vm = new PackageItemViewModel(searchService.Object)
            {
                Id = "package",
                InstalledVersion = installedVersion,
                Version          = installedVersion,
            };

            // Act

            await _testInstance.SetCurrentPackageAsync(
                vm,
                ItemFilter.All,
                () => vm);

            // Assert
            var expectedAdditionalInfo = string.Empty;

            // Remove any added `null` separators, and any Additional Info entries (eg, "Latest Prerelease", "Latest Stable").
            List <DisplayVersion> actualVersions = _testInstance.Versions
                                                   .Where(v => v != null && v.AdditionalInfo == expectedAdditionalInfo).ToList();

            var expectedVersions = new List <DisplayVersion>()
            {
                new DisplayVersion(version: new NuGetVersion("2.10.1-dev-01265"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.1-dev-01256"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.1-dev-01249"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.1-dev-01248"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.0"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.0-dev-01211"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.0-dev-01191"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.0-dev-01187"), additionalInfo: expectedAdditionalInfo),
            };

            Assert.Equal(expectedVersions, actualVersions);
        }
Пример #9
0
        public async Task SetCurrentPackageAsync_SortsVersions_ByNuGetVersionDesc()
        {
            // Arrange
            NuGetVersion installedVersion = NuGetVersion.Parse("1.0.0");

            var testVersions = new List <VersionInfoContextInfo>()
            {
                new VersionInfoContextInfo(new NuGetVersion("2.10.1-dev-01248")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.1-dev-01249")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.1-dev-01256")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.1-dev-01265")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.0-dev-01187")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.0-dev-01191")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.0-dev-01211")),
                new VersionInfoContextInfo(new NuGetVersion("2.10.0")),
            };

            var vm = new PackageItemViewModel()
            {
                InstalledVersion = installedVersion,
                Version          = installedVersion,
                Versions         = new Lazy <Task <IReadOnlyCollection <VersionInfoContextInfo> > >(() => Task.FromResult <IReadOnlyCollection <VersionInfoContextInfo> >(testVersions)),
            };

            // Act

            await _testInstance.SetCurrentPackageAsync(
                vm,
                ItemFilter.All,
                () => vm);

            // Assert
            var expectedAdditionalInfo = string.Empty;

            // Remove any added `null` separators, and any Additional Info entries (eg, "Latest Prerelease", "Latest Stable").
            List <DisplayVersion> actualVersions = _testInstance.Versions
                                                   .Where(v => v != null && v.AdditionalInfo == expectedAdditionalInfo).ToList();

            var expectedVersions = new List <DisplayVersion>()
            {
                new DisplayVersion(version: new NuGetVersion("2.10.1-dev-01265"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.1-dev-01256"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.1-dev-01249"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.1-dev-01248"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.0"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.0-dev-01211"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.0-dev-01191"), additionalInfo: expectedAdditionalInfo),
                new DisplayVersion(version: new NuGetVersion("2.10.0-dev-01187"), additionalInfo: expectedAdditionalInfo),
            };

            Assert.Equal(expectedVersions, actualVersions);
        }
Пример #10
0
        public LocalDetailControlModelTestBase(GlobalServiceProvider sp, LocalPackageSearchMetadataFixture testData)
        {
            sp.Reset();
            _testData = testData;
            var testVersion = new NuGetVersion(0, 0, 1);

            _testViewModel = new PackageItemViewModel()
            {
                PackagePath      = _testData.TestData.PackagePath,
                Version          = testVersion,
                InstalledVersion = testVersion,
            };
        }
        public async Task IconUrl_EmbeddedIcon_NotAnIcon_ReturnsDefault(
            string iconElement,
            string iconFileLocation,
            string fileSourceElement,
            string fileTargetElement)
        {
            using (var testDir = TestDirectory.Create())
            {
                // Create decoy nuget package
                var zipPath = Path.Combine(testDir.Path, "file.nupkg");
                CreateDummyPackage(
                    zipPath: zipPath,
                    iconName: iconElement,
                    iconFile: iconFileLocation,
                    iconFileSourceElement: fileSourceElement,
                    iconFileTargetElement: fileTargetElement,
                    isRealImage: false);

                // prepare test
                UriBuilder builder = new UriBuilder(new Uri(zipPath, UriKind.Absolute))
                {
                    Fragment = iconElement
                };

                var packageItemViewModel = new PackageItemViewModel()
                {
                    Id                 = "PackageId.IconUrl_FileUri_LoadsImage" + iconElement,
                    Version            = new NuGetVersion("1.0.0"),
                    IconUrl            = builder.Uri,
                    PackagePath        = zipPath,
                    PackageFileService = _packageFileService,
                };

                _output.WriteLine($"ZipPath {zipPath}");
                _output.WriteLine($"File Exists {File.Exists(zipPath)}");
                _output.WriteLine($"Url {builder.Uri}");

                // Act
                BitmapSource result = await GetFinalIconBitmapAsync(packageItemViewModel);

                VerifyImageResult(result, packageItemViewModel.BitmapStatus);

                _output.WriteLine($"result {result}");
                string resultFormat = result != null?result.Format.ToString() : "";

                _output.WriteLine($"Pixel format: {resultFormat}");

                // Assert
                Assert.Equal(IconBitmapStatus.DefaultIconDueToDecodingError, packageItemViewModel.BitmapStatus);
            }
        }
Пример #12
0
        public LocalDetailControlModelTestBase(GlobalServiceProvider sp, LocalPackageSearchMetadataFixture testData)
        {
            sp.Reset();
            _testData = testData;
            var testVersion   = new NuGetVersion(0, 0, 1);
            var searchService = new Mock <IReconnectingNuGetSearchService>();

            _testViewModel = new PackageItemViewModel(searchService.Object)
            {
                Id               = "package",
                PackagePath      = _testData.TestData.PackagePath,
                Version          = testVersion,
                InstalledVersion = testVersion,
            };
        }
        public async Task IconUrl_RelativeUri_ReturnsDefault()
        {
            // relative URIs are not supported in viewmodel.
            var iconUrl = new Uri("resources/testpackageicon.png", UriKind.Relative);
            var packageItemViewModel = new PackageItemViewModel()
            {
                Id                 = "PackageId.IconUrl_RelativeUri_ReturnsDefault",
                Version            = new NuGetVersion("1.0.0"),
                IconUrl            = iconUrl,
                PackageFileService = _packageFileService,
            };

            BitmapSource result = await GetFinalIconBitmapAsync(packageItemViewModel);

            VerifyImageResult(result, packageItemViewModel.BitmapStatus);
            Assert.Equal(IconBitmapStatus.DefaultIconDueToRelativeUri, packageItemViewModel.BitmapStatus);
        }
        public async Task IconUrl_EmbeddedIcon_HappyPath_LoadsImage(
            string iconElement,
            string iconFileLocation,
            string fileSourceElement,
            string fileTargetElement)
        {
            using (var testDir = TestDirectory.Create())
            {
                // Create decoy nuget package
                var zipPath = Path.Combine(testDir.Path, "file.nupkg");
                CreateDummyPackage(
                    zipPath: zipPath,
                    iconName: iconElement,
                    iconFile: iconFileLocation,
                    iconFileSourceElement: fileSourceElement,
                    iconFileTargetElement: fileTargetElement,
                    isRealImage: true);

                // prepare test
                var builder = new UriBuilder(new Uri(zipPath, UriKind.Absolute))
                {
                    Fragment = iconElement
                };

                var packageItemViewModel = new PackageItemViewModel()
                {
                    Id                 = "PackageId.IconUrl_EmbeddedIcon_HappyPath_LoadsImage",
                    Version            = new NuGetVersion("1.0.0"),
                    IconUrl            = builder.Uri,
                    PackagePath        = zipPath,
                    PackageFileService = _packageFileService,
                };

                _output.WriteLine($"ZipPath {zipPath}");
                _output.WriteLine($"File Exists {File.Exists(zipPath)}");
                _output.WriteLine($"Url {builder.Uri}");

                // Act
                BitmapSource result = await GetFinalIconBitmapAsync(packageItemViewModel);

                // Assert
                _output.WriteLine($"result {result}");
                Assert.Equal(IconBitmapStatus.FetchedIcon, packageItemViewModel.BitmapStatus);
                VerifyImageResult(result, packageItemViewModel.BitmapStatus);
            }
        }
        public async Task IconUrl_WithValidImageUrl_FailsDownloadsImage_ReturnsDefault()
        {
            var iconUrl = new Uri("http://fake.test/image.png");

            var packageItemViewModel = new PackageItemViewModel()
            {
                Id                 = "PackageId.IconUrl_WithValidImageUrl_FailsDownloadsImage_ReturnsDefault",
                Version            = new NuGetVersion("1.0.0"),
                IconUrl            = iconUrl,
                PackageFileService = _packageFileService,
            };

            BitmapSource result = await GetFinalIconBitmapAsync(packageItemViewModel);

            VerifyImageResult(result, packageItemViewModel.BitmapStatus);
            Assert.Equal(IconBitmapStatus.DefaultIconDueToNullStream, packageItemViewModel.BitmapStatus);
        }
        public async Task IconUrl_WhenFileNotFound_ReturnsDefault()
        {
            var iconUrl = new Uri(@"C:\path\to\image.png");

            var packageItemViewModel = new PackageItemViewModel()
            {
                Id                 = "PackageId.IconUrl_WhenFileNotFound_ReturnsDefault",
                Version            = new NuGetVersion("1.0.0"),
                IconUrl            = iconUrl,
                PackageFileService = _packageFileService,
            };

            BitmapSource result = await GetFinalIconBitmapAsync(packageItemViewModel);

            VerifyImageResult(result, packageItemViewModel.BitmapStatus);
            Assert.Equal(IconBitmapStatus.DefaultIconDueToNullStream, packageItemViewModel.BitmapStatus);
        }
        /// <summary>
        /// Tests the final bitmap returned by the view model, by waiting for the BitmapStatus to be "complete".
        /// </summary>
        private static async Task <BitmapSource> GetFinalIconBitmapAsync(PackageItemViewModel packageItemViewModel, bool addIconToCache = true)
        {
            if (addIconToCache)
            {
                var packageIdentity = new PackageIdentity(packageItemViewModel.Id, packageItemViewModel.Version);
                NuGetPackageFileService.AddIconToCache(packageIdentity, packageItemViewModel.IconUrl);
            }

            BitmapSource result             = packageItemViewModel.IconBitmap;
            int          millisecondsToWait = 3000;

            while (!IconBitmapStatusUtility.GetIsCompleted(packageItemViewModel.BitmapStatus) && millisecondsToWait >= 0)
            {
                await Task.Delay(250);

                millisecondsToWait -= 250;
            }

            result = packageItemViewModel.IconBitmap;
            return(result);
        }
        public async Task IconUrl_FileUri_LoadsImage()
        {
            // Prepare
            using (var testDir = TestDirectory.Create())
            {
                var imagePath = Path.Combine(testDir, "image.png");
                CreateNoisePngImage(path: imagePath);
                var packageItemViewModel = new PackageItemViewModel()
                {
                    Id                 = "PackageId.IconUrl_FileUri_LoadsImage",
                    Version            = new NuGetVersion("1.0.0"),
                    IconUrl            = new Uri(imagePath, UriKind.Absolute),
                    PackageFileService = _packageFileService,
                };

                // Act
                BitmapSource result = await GetFinalIconBitmapAsync(packageItemViewModel);

                // Assert
                VerifyImageResult(result, packageItemViewModel.BitmapStatus);
                Assert.Equal(IconBitmapStatus.FetchedIcon, packageItemViewModel.BitmapStatus);
            }
        }
 public PackageItemLeafViewModel(CustomNodeDefinition def, PackageItemViewModel parent) : base(def, parent)
 {
 }
Пример #20
0
 public PackageItemLeafViewModel(CustomNodeDefinition def, PackageItemViewModel parent) : base(def, parent)
 {
 }