public void GetPackageSourceNamespaces_WithOneConfig_ReturnsCorrectNamespaces()
        {
            // Arrange
            using var mockBaseDirectory = TestDirectory.Create();
            var configPath1 = Path.Combine(mockBaseDirectory, "NuGet.Config");

            SettingsTestUtils.CreateConfigurationFile(configPath1, @"<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
    <packageNamespaces>
        <packageSource key=""nuget.org"">
            <namespace id=""stuff"" />
        </packageSource>
    </packageNamespaces>
</configuration>");

            var settings = Settings.LoadSettingsGivenConfigPaths(new string[] { configPath1 });

            // Act & Assert
            var namespaceProvider = new PackageNamespacesProvider(settings);
            IReadOnlyList <PackageNamespacesSourceItem> packageSourceNamespaces = namespaceProvider.GetPackageSourceNamespaces();

            packageSourceNamespaces.Should().HaveCount(1);
            var packageSourceNamespace = packageSourceNamespaces.First();

            packageSourceNamespace.Key.Should().Be("nuget.org");
            packageSourceNamespace.Namespaces.Should().HaveCount(1);
            packageSourceNamespace.Namespaces.First().Id.Should().Be("stuff");
        }
        public void Remove_WithElementNotInConfig_DoesntChangeConfig()
        {
            // Arrange
            using var mockBaseDirectory = TestDirectory.Create();
            var configPath1   = Path.Combine(mockBaseDirectory, "NuGet.Config");
            var configContent = @"<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
    <packageNamespaces>
        <packageSource key=""nuget.org"">
            <namespace id=""stuff"" />
        </packageSource>
        <packageSource key=""contoso"">
            <namespace id=""stuff2"" />
        </packageSource>
    </packageNamespaces>
</configuration>";

            SettingsTestUtils.CreateConfigurationFile(configPath1, configContent);
            var settings = Settings.LoadSettingsGivenConfigPaths(new string[] { configPath1 });

            var namespaceProvider = new PackageNamespacesProvider(settings);
            IReadOnlyList <PackageNamespacesSourceItem> packageSourceNamespaces = namespaceProvider.GetPackageSourceNamespaces();

            packageSourceNamespaces.Should().HaveCount(2);

            // Act & Assert
            namespaceProvider.Remove(new PackageNamespacesSourceItem[] { new PackageNamespacesSourceItem("localConfig", new NamespaceItem[] { new NamespaceItem("item") }) });


            File.ReadAllText(configPath1).Replace("\r\n", "\n")
            .Should().BeEquivalentTo(configContent.Replace("\r\n", "\n"));
        }
        public void AddOrUpdatePackageSourceNamespace_WithAClearItem_WithANewNamespace_AddInFurthestMatchingConfig()
        {
            // Arrange
            using var mockBaseDirectory = TestDirectory.Create();
            var configPath1 = Path.Combine(mockBaseDirectory, "NuGet.Config");

            SettingsTestUtils.CreateConfigurationFile(configPath1, @"<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
    <packageNamespaces>
        <clear />
        <packageSource key=""nuget.org"">
            <namespace id=""stuff"" />
        </packageSource>
    </packageNamespaces>
</configuration>");
            var configPath2 = Path.Combine(mockBaseDirectory, "NuGet.Config.2");

            SettingsTestUtils.CreateConfigurationFile(configPath2, @"<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
    <packageNamespaces>
        <packageSource key=""contoso"">
            <namespace id=""stuff2"" />
        </packageSource>
    </packageNamespaces>
</configuration>");
            var settings = Settings.LoadSettingsGivenConfigPaths(new string[] { configPath1, configPath2 });

            // Act & Assert
            var namespaceProvider = new PackageNamespacesProvider(settings);
            var namespaceToAdd    = new PackageNamespacesSourceItem("localSource", new NamespaceItem[] { new NamespaceItem("added") });

            namespaceProvider.AddOrUpdatePackageSourceNamespace(namespaceToAdd);

            var result = @"<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
    <packageNamespaces>
        <clear />
        <packageSource key=""nuget.org"">
            <namespace id=""stuff"" />
        </packageSource>
        <packageSource key=""localSource"">
            <namespace id=""added"" />
        </packageSource>
    </packageNamespaces>
</configuration>";

            result.Replace("\r\n", "\n")
            .Should().BeEquivalentTo(
                File.ReadAllText(configPath1).Replace("\r\n", "\n"));
        }
        public void Remove_WithOneConfig_RemovesElementOfInterest()
        {
            // Arrange
            using var mockBaseDirectory = TestDirectory.Create();
            var configPath1 = Path.Combine(mockBaseDirectory, "NuGet.Config");

            SettingsTestUtils.CreateConfigurationFile(configPath1, @"<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
    <packageNamespaces>
        <packageSource key=""nuget.org"">
            <namespace id=""stuff"" />
        </packageSource>
        <packageSource key=""contoso"">
            <namespace id=""stuff2"" />
        </packageSource>
    </packageNamespaces>
</configuration>");
            var settings = Settings.LoadSettingsGivenConfigPaths(new string[] { configPath1 });

            var namespaceProvider = new PackageNamespacesProvider(settings);
            IReadOnlyList <PackageNamespacesSourceItem> packageSourceNamespaces = namespaceProvider.GetPackageSourceNamespaces();

            packageSourceNamespaces.Should().HaveCount(2);
            var contosoNamespace = packageSourceNamespaces.First(e => e.Key.Equals("contoso"));

            // Act & Assert
            namespaceProvider.Remove(new PackageNamespacesSourceItem[] { contosoNamespace });
            var result = @"<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
    <packageNamespaces>
        <packageSource key=""nuget.org"">
            <namespace id=""stuff"" />
        </packageSource>
    </packageNamespaces>
</configuration>";

            result.Replace("\r\n", "\n")
            .Should().BeEquivalentTo(
                File.ReadAllText(configPath1).Replace("\r\n", "\n"));
        }
        public void Remove_WithMultipleConfigs_ChangesOriginConfig()
        {
            // Arrange
            using var mockBaseDirectory = TestDirectory.Create();
            var configPath1 = Path.Combine(mockBaseDirectory, "NuGet.Config");

            SettingsTestUtils.CreateConfigurationFile(configPath1, @"<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
    <packageNamespaces>
        <packageSource key=""nuget.org"">
            <namespace id=""stuff"" />
        </packageSource>
    </packageNamespaces>
</configuration>");
            var configPath2 = Path.Combine(mockBaseDirectory, "NuGet.Config.2");

            SettingsTestUtils.CreateConfigurationFile(configPath2, @"<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
    <packageNamespaces>
        <packageSource key=""contoso"">
            <namespace id=""stuff2"" />
        </packageSource>
    </packageNamespaces>
</configuration>");
            var settings = Settings.LoadSettingsGivenConfigPaths(new string[] { configPath1, configPath2 });

            // Act & Assert
            var namespaceProvider = new PackageNamespacesProvider(settings);
            IReadOnlyList <PackageNamespacesSourceItem> packageSourceNamespaces = namespaceProvider.GetPackageSourceNamespaces();

            namespaceProvider.Remove(new PackageNamespacesSourceItem[] { packageSourceNamespaces.Last() });
            var result = @"<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
</configuration>";

            result.Replace("\r\n", "\n")
            .Should().BeEquivalentTo(
                File.ReadAllText(configPath1).Replace("\r\n", "\n"));
        }