From 871dba824c0979afe60d976d795c4f77d22a9338 Mon Sep 17 00:00:00 2001 From: kcamp Date: Wed, 26 Jul 2017 14:27:57 -0400 Subject: [PATCH] (GH-1537) - Refactor XmlPeek alias to use XPathNavigator to handle retrieval of element values; add supporting tests --- .../Fixtures/XmlPeekAliasesFixture.cs | 5 ++++ .../Properties/Resources.Designer.cs | 8 ++++++ .../Properties/Resources.resx | 15 ++++++++++ .../Unit/XML/XmlPeekAliasesTests.cs | 28 +++++++++++++++++++ src/Cake.Common/Xml/XmlPeekAliases.cs | 7 +++-- 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/Cake.Common.Tests/Fixtures/XmlPeekAliasesFixture.cs b/src/Cake.Common.Tests/Fixtures/XmlPeekAliasesFixture.cs index 5362c005e2..177f43e0eb 100644 --- a/src/Cake.Common.Tests/Fixtures/XmlPeekAliasesFixture.cs +++ b/src/Cake.Common.Tests/Fixtures/XmlPeekAliasesFixture.cs @@ -43,6 +43,11 @@ public XmlPeekAliasesFixture(bool xmlExists = true, bool xmlWithDtd = false, boo Context.Log.Returns(FakeLog); } + public void SetContent(string xml) + { + var file = ((FakeFileSystem) FileSystem).GetFile(XmlPath).SetContent(xml); + } + public string Peek(string xpath) { return XmlPeekAliases.XmlPeek(Context, XmlPath, xpath, Settings); diff --git a/src/Cake.Common.Tests/Properties/Resources.Designer.cs b/src/Cake.Common.Tests/Properties/Resources.Designer.cs index d0ee9e1b89..f9000921a8 100644 --- a/src/Cake.Common.Tests/Properties/Resources.Designer.cs +++ b/src/Cake.Common.Tests/Properties/Resources.Designer.cs @@ -582,6 +582,14 @@ public static string XmlPeek_Xml { } } + public static string XmlPeek_Xml_With_Namespace + { + get + { + return ResourceManager.GetString("XmlPeek_Xml_With_Namespace", resourceCulture); + } + } + /// /// Looks up a localized string similar to <?xml version="1.0" encoding="UTF-8"?> ///<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> diff --git a/src/Cake.Common.Tests/Properties/Resources.resx b/src/Cake.Common.Tests/Properties/Resources.resx index 4ee6ffba79..8e676a676a 100644 --- a/src/Cake.Common.Tests/Properties/Resources.resx +++ b/src/Cake.Common.Tests/Properties/Resources.resx @@ -1006,4 +1006,19 @@ Imports System.Runtime.CompilerServices; '<Assembly: AssemblyDelaySign(false)> '<Assembly: AssemblyKeyFile("")> + + <?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <WebPublishMethod>FileSystem</WebPublishMethod> + <LastUsedBuildConfiguration>DeploymentTemplate</LastUsedBuildConfiguration> + <LastUsedPlatform>Any CPU</LastUsedPlatform> + <SiteUrlToLaunchAfterPublish /> + <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish> + <ExcludeApp_Data>False</ExcludeApp_Data> + <publishUrl>C:\Deployment\DeploymentTemplate\WebApi</publishUrl> + <DeleteExistingFiles>False</DeleteExistingFiles> + </PropertyGroup> +</Project> + \ No newline at end of file diff --git a/src/Cake.Common.Tests/Unit/XML/XmlPeekAliasesTests.cs b/src/Cake.Common.Tests/Unit/XML/XmlPeekAliasesTests.cs index b0aa000a60..455bef8c14 100644 --- a/src/Cake.Common.Tests/Unit/XML/XmlPeekAliasesTests.cs +++ b/src/Cake.Common.Tests/Unit/XML/XmlPeekAliasesTests.cs @@ -95,6 +95,34 @@ public void Should_Get_Node_Value() Assert.Equal("test value", result); } + [Fact] + public void Should_Get_Element_Value() + { + // Given + var fixture = new XmlPeekAliasesFixture(); + + // When + var result = fixture.Peek("/configuration/test"); + + // Then + Assert.Equal("test value", result); + } + + [Fact] + public void Should_Get_Element_Value_With_Namespace() + { + // Given + var fixture = new XmlPeekAliasesFixture(); + fixture.SetContent(Properties.Resources.XmlPeek_Xml_With_Namespace); + fixture.Settings.Namespaces.Add("msbuild", "http://schemas.microsoft.com/developer/msbuild/2003"); + + // When + var result = fixture.Peek("/msbuild:Project/msbuild:PropertyGroup/msbuild:publishUrl"); + + // Then + Assert.Equal("C:\\Deployment\\DeploymentTemplate\\WebApi", result); + } + [Fact] public void Should_Get_Node_Value_From_File_With_Dtd() { diff --git a/src/Cake.Common/Xml/XmlPeekAliases.cs b/src/Cake.Common/Xml/XmlPeekAliases.cs index e259c81e12..d0fb6d9c8a 100644 --- a/src/Cake.Common/Xml/XmlPeekAliases.cs +++ b/src/Cake.Common/Xml/XmlPeekAliases.cs @@ -132,14 +132,15 @@ private static string XmlPeek(XmlReader source, string xpath, XmlPeekSettings se document.PreserveWhitespace = settings.PreserveWhitespace; document.Load(source); - var namespaceManager = new XmlNamespaceManager(document.NameTable); + var navigator = document.CreateNavigator(); + var namespaceManager = new XmlNamespaceManager(navigator.NameTable); + foreach (var xmlNamespace in settings.Namespaces) { namespaceManager.AddNamespace(xmlNamespace.Key /* Prefix */, xmlNamespace.Value /* URI */); } - var node = document.SelectSingleNode(xpath, namespaceManager); - + var node = navigator.SelectSingleNode(xpath, namespaceManager); return node?.Value; }