2017-03-02 21:04:03 -08:00
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System ;
2016-08-22 12:24:10 -07:00
using System.IO ;
using System.Linq ;
using Microsoft.Build.Construction ;
2016-10-27 18:46:43 -07:00
using Microsoft.DotNet.Internal.ProjectModel ;
using Microsoft.DotNet.Internal.ProjectModel.Files ;
2016-08-22 12:24:10 -07:00
using Microsoft.DotNet.TestFramework ;
using Microsoft.DotNet.Tools.Test.Utilities ;
using NuGet.Frameworks ;
using Xunit ;
using FluentAssertions ;
2016-08-23 13:50:05 -07:00
using Microsoft.DotNet.ProjectJsonMigration.Rules ;
2016-08-22 12:24:10 -07:00
namespace Microsoft.DotNet.ProjectJsonMigration.Tests
{
public class GivenThatIWantToMigratePublishOptions : TestBase
{
[Fact]
2016-12-13 16:44:53 -08:00
private void MigratingPublishOptionsForConsoleAppIncludeExcludePopulatesContentItemWithInclude ( )
2016-08-22 12:24:10 -07:00
{
var testDirectory = Temp . CreateDirectory ( ) . Path ;
WriteFilesInProjectDirectory ( testDirectory ) ;
var mockProj = RunPublishOptionsRuleOnPj ( @ "
{
"" publishOptions "" : {
"" include "" : [ "" root "" , "" src "" , "" rootfile . cs "" ] ,
"" exclude "" : [ "" src "" , "" rootfile . cs "" ] ,
"" includeFiles "" : [ "" src / file1 . cs "" , "" src / file2 . cs "" ] ,
"" excludeFiles "" : [ "" src / file2 . cs "" ]
}
} ",
testDirectory : testDirectory ) ;
2017-02-23 20:36:02 -08:00
mockProj . Items . Count ( i = > i . ItemType . Equals ( "None" , StringComparison . Ordinal ) ) . Should ( ) . Be ( 4 ) ;
2016-08-22 12:24:10 -07:00
2017-02-22 22:06:45 -08:00
foreach ( var item in mockProj . Items . Where ( i = > i . ItemType . Equals ( "None" , StringComparison . Ordinal ) ) )
2016-08-22 12:24:10 -07:00
{
2016-08-23 13:50:05 -07:00
item . Metadata . Count ( m = > m . Name = = "CopyToPublishDirectory" ) . Should ( ) . Be ( 1 ) ;
2017-02-22 23:16:54 -08:00
if ( item . Update . Contains ( @"src\file1.cs" ) )
2016-08-22 12:24:10 -07:00
{
2017-02-23 20:36:02 -08:00
item . Update . Should ( ) . Be ( @"src\file1.cs" ) ;
2017-02-22 23:16:54 -08:00
item . Exclude . Should ( ) . BeEmpty ( ) ;
2017-02-23 20:36:02 -08:00
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "PreserveNewest" ) . Should ( ) . Be ( 1 ) ;
}
else if ( item . Update . Contains ( @"src\file2.cs" ) )
{
item . Update . Should ( ) . Be ( @"src\file2.cs" ) ;
item . Exclude . Should ( ) . BeEmpty ( ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "Never" ) . Should ( ) . Be ( 1 ) ;
}
else if ( item . Update . Contains ( @"root\**\*" ) )
{
item . Update . Should ( ) . Be ( @"root\**\*" ) ;
item . Exclude . Should ( ) . BeEmpty ( ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "PreserveNewest" ) . Should ( ) . Be ( 1 ) ;
2016-08-22 12:24:10 -07:00
}
else
{
2017-02-23 20:36:02 -08:00
item . Update . Should ( ) . Be ( @"src\**\*;rootfile.cs" ) ;
2017-02-22 23:16:54 -08:00
item . Exclude . Should ( ) . BeEmpty ( ) ;
2017-02-23 20:36:02 -08:00
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "Never" ) . Should ( ) . Be ( 1 ) ;
2016-08-22 12:24:10 -07:00
}
}
}
[Fact]
2016-12-13 16:44:53 -08:00
private void MigratingPublishOptionsForWebAppIncludeExcludePopulatesContentItemWithUpdate ( )
{
var testDirectory = Temp . CreateDirectory ( ) . Path ;
WriteFilesInProjectDirectory ( testDirectory ) ;
var mockProj = RunPublishOptionsRuleOnPj ( @ "
{
"" publishOptions "" : {
"" include "" : [ "" root "" , "" src "" , "" rootfile . cs "" ] ,
"" exclude "" : [ "" src "" , "" rootfile . cs "" ] ,
"" includeFiles "" : [ "" src / file1 . cs "" , "" src / file2 . cs "" ] ,
"" excludeFiles "" : [ "" src / file2 . cs "" ]
} ,
"" buildOptions "" : {
"" emitEntryPoint "" : true
} ,
"" dependencies "" : {
"" Microsoft . AspNetCore . Mvc "" : {
"" version "" : "" 1.0 . 0 ""
}
} ,
"" frameworks "" : {
"" netcoreapp1 . 0 "" : { }
}
} ",
testDirectory : testDirectory ) ;
2017-02-23 20:36:02 -08:00
mockProj . Items . Count ( i = > i . ItemType . Equals ( "None" , StringComparison . Ordinal ) ) . Should ( ) . Be ( 4 ) ;
2016-12-13 16:44:53 -08:00
2017-02-22 22:06:45 -08:00
foreach ( var item in mockProj . Items . Where ( i = > i . ItemType . Equals ( "None" , StringComparison . Ordinal ) ) )
2016-12-13 16:44:53 -08:00
{
item . Metadata . Count ( m = > m . Name = = "CopyToPublishDirectory" ) . Should ( ) . Be ( 1 ) ;
if ( item . Update . Contains ( @"src\file1.cs" ) )
{
2017-02-23 20:36:02 -08:00
item . Update . Should ( ) . Be ( @"src\file1.cs" ) ;
item . Exclude . Should ( ) . BeEmpty ( ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "PreserveNewest" ) . Should ( ) . Be ( 1 ) ;
}
else if ( item . Update . Contains ( @"src\file2.cs" ) )
{
item . Update . Should ( ) . Be ( @"src\file2.cs" ) ;
2016-12-13 16:44:53 -08:00
item . Exclude . Should ( ) . BeEmpty ( ) ;
2017-02-23 20:36:02 -08:00
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "Never" ) . Should ( ) . Be ( 1 ) ;
}
else if ( item . Update . Contains ( @"root\**\*" ) )
{
item . Update . Should ( ) . Be ( @"root\**\*" ) ;
item . Exclude . Should ( ) . BeEmpty ( ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "PreserveNewest" ) . Should ( ) . Be ( 1 ) ;
2016-12-13 16:44:53 -08:00
}
else
{
2017-02-23 20:36:02 -08:00
item . Update . Should ( ) . Be ( @"src\**\*;rootfile.cs" ) ;
2016-12-13 16:44:53 -08:00
item . Exclude . Should ( ) . BeEmpty ( ) ;
2017-02-23 20:36:02 -08:00
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "Never" ) . Should ( ) . Be ( 1 ) ;
2016-12-13 16:44:53 -08:00
}
}
}
[Fact]
private void MigratingConsoleAppWithPublishOptionsAndBuildOptionsCopyToOutputMergesContentItemsWithInclude ( )
2016-08-22 12:24:10 -07:00
{
var testDirectory = Temp . CreateDirectory ( ) . Path ;
WriteFilesInProjectDirectory ( testDirectory ) ;
var mockProj = RunPublishAndBuildOptionsRuleOnPj ( @ "
{
"" buildOptions "" : {
"" copyToOutput "" : {
"" include "" : [ "" src "" , "" rootfile . cs "" ] ,
"" exclude "" : [ "" src "" , "" rootfile . cs "" ] ,
"" includeFiles "" : [ "" src / file1 . cs "" , "" src / file2 . cs "" ] ,
"" excludeFiles "" : [ "" src / file2 . cs "" ]
}
} ,
"" publishOptions "" : {
"" include "" : [ "" root "" , "" src "" , "" rootfile . cs "" ] ,
"" exclude "" : [ "" src "" , "" rootfile . cs "" ] ,
"" includeFiles "" : [ "" src / file1 . cs "" , "" src / file2 . cs "" ] ,
"" excludeFiles "" : [ "" src / file3 . cs "" ]
}
} ",
testDirectory : testDirectory ) ;
2017-02-23 20:36:02 -08:00
mockProj . Items . Count ( i = > i . ItemType . Equals ( "None" , StringComparison . Ordinal ) ) . Should ( ) . Be ( 5 ) ;
2016-08-22 12:24:10 -07:00
2017-02-22 22:06:45 -08:00
foreach ( var item in mockProj . Items . Where ( i = > i . ItemType . Equals ( "None" , StringComparison . Ordinal ) ) )
2016-08-22 12:24:10 -07:00
{
2017-02-22 23:16:54 -08:00
if ( item . Update . Contains ( @"root\**\*" ) )
2016-08-22 12:24:10 -07:00
{
2017-02-22 23:16:54 -08:00
item . Update . Should ( ) . Be ( @"root\**\*" ) ;
2017-02-23 20:36:02 -08:00
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "PreserveNewest" ) . Should ( ) . Be ( 1 ) ;
2016-08-22 12:24:10 -07:00
}
2017-02-22 23:16:54 -08:00
else if ( item . Update . Contains ( @"src\file1.cs" ) )
2016-08-22 12:24:10 -07:00
{
2017-02-23 20:36:02 -08:00
item . Update . Should ( ) . Be ( @"src\file1.cs" ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToOutputDirectory" & & m . Value = = "PreserveNewest" ) . Should ( ) . Be ( 1 ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "PreserveNewest" ) . Should ( ) . Be ( 1 ) ;
}
else if ( item . Update . Contains ( @"src\file2.cs" ) )
{
item . Update . Should ( ) . Be ( @"src\file2.cs" ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToOutputDirectory" & & m . Value = = "Never" ) . Should ( ) . Be ( 1 ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "PreserveNewest" ) . Should ( ) . Be ( 1 ) ;
}
else if ( item . Update . Contains ( @"src\file3.cs" ) )
{
item . Update . Should ( ) . Be ( @"src\file3.cs" ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "Never" ) . Should ( ) . Be ( 1 ) ;
2016-08-22 12:24:10 -07:00
}
else
{
2017-02-22 23:16:54 -08:00
item . Update . Should ( )
2016-08-22 12:24:10 -07:00
. Be ( @"src\**\*;rootfile.cs" ) ;
2017-02-23 20:36:02 -08:00
item . Metadata . Count ( m = >
m . Name = = "CopyToOutputDirectory" & & m . Value = = "Never" ) . Should ( ) . Be ( 1 ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "Never" ) . Should ( ) . Be ( 1 ) ;
2016-12-13 16:44:53 -08:00
}
}
}
[Fact]
private void MigratingWebAppWithPublishOptionsAndBuildOptionsCopyToOutputMergesContentItemsWithUpdate ( )
{
var testDirectory = Temp . CreateDirectory ( ) . Path ;
WriteFilesInProjectDirectory ( testDirectory ) ;
var mockProj = RunPublishAndBuildOptionsRuleOnPj ( @ "
{
"" buildOptions "" : {
"" copyToOutput "" : {
"" include "" : [ "" src "" , "" rootfile . cs "" ] ,
"" exclude "" : [ "" src "" , "" rootfile . cs "" ] ,
"" includeFiles "" : [ "" src / file1 . cs "" , "" src / file2 . cs "" ] ,
"" excludeFiles "" : [ "" src / file2 . cs "" ]
} ,
"" emitEntryPoint "" : true
} ,
"" publishOptions "" : {
"" include "" : [ "" root "" , "" src "" , "" rootfile . cs "" ] ,
"" exclude "" : [ "" src "" , "" rootfile . cs "" ] ,
"" includeFiles "" : [ "" src / file1 . cs "" , "" src / file2 . cs "" ] ,
"" excludeFiles "" : [ "" src / file3 . cs "" ]
} ,
"" dependencies "" : {
"" Microsoft . AspNetCore . Mvc "" : {
"" version "" : "" 1.0 . 0 ""
}
} ,
"" frameworks "" : {
"" netcoreapp1 . 0 "" : { }
}
} ",
testDirectory : testDirectory ) ;
2017-02-23 20:36:02 -08:00
mockProj . Items . Count ( i = > i . ItemType . Equals ( "None" , StringComparison . Ordinal ) ) . Should ( ) . Be ( 5 ) ;
2016-12-13 16:44:53 -08:00
// From ProjectReader #L725 (Both are empty)
var defaultIncludePatterns = Enumerable . Empty < string > ( ) ;
2017-01-12 11:22:41 -08:00
var defaultExcludePatterns = Enumerable . Empty < string > ( ) ;
2016-12-13 16:44:53 -08:00
2017-02-22 22:06:45 -08:00
foreach ( var item in mockProj . Items . Where ( i = > i . ItemType . Equals ( "None" , StringComparison . Ordinal ) ) )
2016-12-13 16:44:53 -08:00
{
var metadata = string . Join ( "," , item . Metadata . Select ( m = > m . Name ) ) ;
if ( item . Update . Contains ( @"root\**\*" ) )
{
2017-02-22 20:02:57 -08:00
item . Update . Should ( ) . Be ( @"root\**\*" ) ;
2016-12-13 16:44:53 -08:00
item . Exclude . Should ( ) . BeEmpty ( ) ;
2017-02-23 20:36:02 -08:00
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "PreserveNewest" ) . Should ( ) . Be ( 1 ) ;
2016-12-13 16:44:53 -08:00
}
else if ( item . Update . Contains ( @"src\file1.cs" ) )
{
2017-02-23 20:36:02 -08:00
item . Update . Should ( ) . Be ( @"src\file1.cs" ) ;
item . Exclude . Should ( ) . BeEmpty ( ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToOutputDirectory" & & m . Value = = "PreserveNewest" ) . Should ( ) . Be ( 1 ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "PreserveNewest" ) . Should ( ) . Be ( 1 ) ;
}
else if ( item . Update . Contains ( @"src\file2.cs" ) )
{
item . Update . Should ( ) . Be ( @"src\file2.cs" ) ;
item . Exclude . Should ( ) . BeEmpty ( ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToOutputDirectory" & & m . Value = = "Never" ) . Should ( ) . Be ( 1 ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "PreserveNewest" ) . Should ( ) . Be ( 1 ) ;
}
else if ( item . Update . Contains ( @"src\file3.cs" ) )
{
item . Update . Should ( ) . Be ( @"src\file3.cs" ) ;
2016-12-13 16:44:53 -08:00
item . Exclude . Should ( ) . BeEmpty ( ) ;
2017-02-23 20:36:02 -08:00
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "Never" ) . Should ( ) . Be ( 1 ) ;
2016-12-13 16:44:53 -08:00
}
else
{
item . Update . Should ( ) . Be ( @"src\**\*;rootfile.cs" ) ;
item . Exclude . Should ( ) . BeEmpty ( ) ;
2017-02-23 20:36:02 -08:00
item . Metadata . Count ( m = >
m . Name = = "CopyToOutputDirectory" & & m . Value = = "Never" ) . Should ( ) . Be ( 1 ) ;
item . Metadata . Count ( m = >
m . Name = = "CopyToPublishDirectory" & & m . Value = = "Never" ) . Should ( ) . Be ( 1 ) ;
2016-08-22 12:24:10 -07:00
}
}
}
2017-02-23 20:36:02 -08:00
[Fact]
public void ExcludedPatternsAreNotEmittedOnNoneWhenBuildingAWebProject ( )
{
var mockProj = RunPublishOptionsRuleOnPj ( @ "
{
"" buildOptions "" : {
"" emitEntryPoint "" : true
} ,
"" publishOptions "" : {
"" include "" : [ "" wwwroot "" , "" * * / * . cshtml "" , "" appsettings . json "" , "" web . config "" ] ,
} ,
"" dependencies "" : {
"" Microsoft . AspNetCore . Mvc "" : {
"" version "" : "" 1.0 . 0 ""
}
} ,
"" frameworks "" : {
"" netcoreapp1 . 0 "" : { }
}
} ");
mockProj . Items . Count ( i = > i . ItemType . Equals ( "None" , StringComparison . Ordinal ) ) . Should ( ) . Be ( 0 ) ;
}
2016-08-22 12:24:10 -07:00
private void WriteFilesInProjectDirectory ( string testDirectory )
{
Directory . CreateDirectory ( Path . Combine ( testDirectory , "root" ) ) ;
Directory . CreateDirectory ( Path . Combine ( testDirectory , "src" ) ) ;
File . WriteAllText ( Path . Combine ( testDirectory , "root" , "file1.txt" ) , "content" ) ;
File . WriteAllText ( Path . Combine ( testDirectory , "root" , "file2.txt" ) , "content" ) ;
File . WriteAllText ( Path . Combine ( testDirectory , "root" , "file3.txt" ) , "content" ) ;
File . WriteAllText ( Path . Combine ( testDirectory , "src" , "file1.cs" ) , "content" ) ;
File . WriteAllText ( Path . Combine ( testDirectory , "src" , "file2.cs" ) , "content" ) ;
File . WriteAllText ( Path . Combine ( testDirectory , "src" , "file3.cs" ) , "content" ) ;
File . WriteAllText ( Path . Combine ( testDirectory , "rootfile.cs" ) , "content" ) ;
}
private ProjectRootElement RunPublishOptionsRuleOnPj ( string s , string testDirectory = null )
{
testDirectory = testDirectory ? ? Temp . CreateDirectory ( ) . Path ;
return TemporaryProjectFileRuleRunner . RunRules ( new IMigrationRule [ ]
{
new MigratePublishOptionsRule ( )
} , s , testDirectory ) ;
}
private ProjectRootElement RunPublishAndBuildOptionsRuleOnPj ( string s , string testDirectory = null )
{
testDirectory = testDirectory ? ? Temp . CreateDirectory ( ) . Path ;
return TemporaryProjectFileRuleRunner . RunRules ( new IMigrationRule [ ]
{
new MigrateBuildOptionsRule ( ) ,
new MigratePublishOptionsRule ( )
} , s , testDirectory ) ;
}
}
2017-03-02 20:35:20 -08:00
}