public void AddPackageWithFrameworkReferenceDoesNotAffectWebConfigIfReferencesAlreadyExist() { // Arrange var webConfigPath = @"x:\my-website\web.config"; var memoryStream = new NeverCloseMemoryStream(@"<?xml version=""1.0""?> <configuration> <connectionStrings> <add name=""test"" /> </connectionStrings> <system.web> <compilation> <assemblies> <add assembly=""System.Data, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"" /> </assemblies> </compilation> <profiles><add name=""awesomeprofile"" /></profiles> </system.web> </configuration> "); var fileSystem = new Mock <IFileSystem>(); fileSystem.SetupGet(f => f.Root).Returns("x:\\my-website"); fileSystem.Setup(f => f.FileExists(It.Is <string>(p => p.Equals(webConfigPath)))).Returns(true); fileSystem.Setup(f => f.OpenFile(It.Is <string>(p => p.Equals(webConfigPath)))).Returns(() => { memoryStream.Seek(0, SeekOrigin.Begin); return(memoryStream); }); fileSystem.Setup(f => f.AddFile(It.Is <string>(p => p.Equals(webConfigPath)), It.IsAny <Stream>())) .Callback <string, Stream>((_, stream) => { memoryStream = new NeverCloseMemoryStream(stream.ReadToEnd()); }); // Act WebProjectSystem.AddReferencesToConfig(fileSystem.Object, "System.Data"); WebProjectSystem.AddReferencesToConfig(fileSystem.Object, "Microsoft.Abstractions"); // Assert memoryStream.Seek(0, SeekOrigin.Begin); XDocument document = XDocument.Load(memoryStream); var element = document.Root; Assert.Equal(element.Name, "configuration"); // Use SingleOrDefault to ensure there's exactly one element with that name var assemblies = document.Root .Elements().SingleOrDefault(e => e.Name.ToString().Equals("system.web")) .Elements().SingleOrDefault(e => e.Name.ToString().Equals("compilation")) .Elements().SingleOrDefault(e => e.Name.ToString().Equals("assemblies")); Assert.Equal(2, assemblies.Elements("add").Count()); Assert.Equal("System.Data, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35", assemblies.Elements().First().Attribute("assembly").Value); Assert.Equal("Microsoft.Abstractions", assemblies.Elements().Last().Attribute("assembly").Value); // Make sure the original web.config content is unaffected Assert.Equal("test", document.Root .Elements().SingleOrDefault(e => e.Name.ToString().Equals("connectionStrings")) .Elements().SingleOrDefault(e => e.Name.ToString().Equals("add")) .Attributes().SingleOrDefault(e => e.Name.ToString().Equals("name")).Value); Assert.Equal("awesomeprofile", document.Root.Element("system.web").Element("profiles").Element("add").Attribute("name").Value); }
public void AddPackageWithFrameworkReferenceDoesNotAffectWebConfigIfReferencesAlreadyExist() { // Arrange var webConfigPath = @"x:\my-website\web.config"; var memoryStream = new NeverCloseMemoryStream(@"<?xml version=""1.0""?> <configuration> <connectionStrings> <add name=""test"" /> </connectionStrings> <system.web> <compilation> <assemblies> <add assembly=""System.Data, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"" /> </assemblies> </compilation> <profiles><add name=""awesomeprofile"" /></profiles> </system.web> </configuration> "); var fileSystem = new Mock<IFileSystem>(); fileSystem.SetupGet(f => f.Root).Returns("x:\\my-website"); fileSystem.Setup(f => f.FileExists(It.Is<string>(p => p.Equals(webConfigPath)))).Returns(true); fileSystem.Setup(f => f.OpenFile(It.Is<string>(p => p.Equals(webConfigPath)))).Returns(() => { memoryStream.Seek(0, SeekOrigin.Begin); return memoryStream; }); fileSystem.Setup(f => f.AddFile(It.Is<string>(p => p.Equals(webConfigPath)), It.IsAny<Stream>())) .Callback<string, Stream>((_, stream) => { memoryStream = new NeverCloseMemoryStream(stream.ReadToEnd()); }); // Act WebProjectSystem.AddReferencesToConfig(fileSystem.Object, "System.Data"); WebProjectSystem.AddReferencesToConfig(fileSystem.Object, "Microsoft.Abstractions"); // Assert memoryStream.Seek(0, SeekOrigin.Begin); XDocument document = XDocument.Load(memoryStream); var element = document.Root; Assert.Equal(element.Name, "configuration"); // Use SingleOrDefault to ensure there's exactly one element with that name var assemblies = document.Root .Elements().SingleOrDefault(e => e.Name.ToString().Equals("system.web")) .Elements().SingleOrDefault(e => e.Name.ToString().Equals("compilation")) .Elements().SingleOrDefault(e => e.Name.ToString().Equals("assemblies")); Assert.Equal(2, assemblies.Elements("add").Count()); Assert.Equal("System.Data, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35", assemblies.Elements().First().Attribute("assembly").Value); Assert.Equal("Microsoft.Abstractions", assemblies.Elements().Last().Attribute("assembly").Value); // Make sure the original web.config content is unaffected Assert.Equal("test", document.Root .Elements().SingleOrDefault(e => e.Name.ToString().Equals("connectionStrings")) .Elements().SingleOrDefault(e => e.Name.ToString().Equals("add")) .Attributes().SingleOrDefault(e => e.Name.ToString().Equals("name")).Value); Assert.Equal("awesomeprofile", document.Root.Element("system.web").Element("profiles").Element("add").Attribute("name").Value); }