Skip to content

Commit

Permalink
Add integration test suite for group conditions
Browse files Browse the repository at this point in the history
  • Loading branch information
vgeronimos committed Mar 7, 2024
1 parent 3ac6f2e commit 76c84ac
Show file tree
Hide file tree
Showing 31 changed files with 1,657 additions and 502 deletions.
997 changes: 497 additions & 500 deletions .paket/Paket.Restore.targets

Large diffs are not rendered by default.

209 changes: 209 additions & 0 deletions integrationtests/Paket.IntegrationTests/ConditionSpecs.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
module Paket.IntegrationTests.ConditionSpecs

open System.Text.RegularExpressions
open Fake
open System
open NUnit.Framework
open FsUnit
open System
open System.IO
open System.Diagnostics
open Paket
open Paket.Domain

let preparePackages workingDir =
let packagesDir = workingDir @@ "Packages"

[1..5]
|> List.filter (fun v -> fileExists (workingDir @@ "Packages" @@ $"PaketTest2394.PackageA.%d{v}.0.0.nupkg") |> not)
|> List.map (fun v -> directDotnet false $"pack -o . -p:Version=%d{v}.0" packagesDir)
|> ignore

let private shouldIncludeVersionedString (pattern: string) (version: int) (inputs: string seq) =
let expected = pattern.Replace("XX", version.ToString())
let regex = $"""^%s{Regex.Escape(pattern).Replace("XX", "(\d)")}$"""

inputs
|> Seq.filter (fun input -> Regex.IsMatch(input, regex))
|> Seq.iter (fun input -> Assert.That(input, Is.EqualTo expected))

let private shouldIncludePackageA v i = shouldIncludeVersionedString "PackageA XX.0" v i
let private shouldIncludePackageB v i = shouldIncludeVersionedString "PackageB XX.0 (references PackageB.Transient XX.0)" v i
let private shouldIncludePackageBTransient v i = shouldIncludeVersionedString "PackageB.Transient XX.0" v i
let private shouldIncludeConstant v i = shouldIncludeVersionedString "Constant PACKAGEA_XX set" v i

[<Test>]
let ``#2394 default group with no condition`` () =
let scenario = "i002394-group-conditions"
preparePackages (originalScenarioPath scenario)

use __ = prepare scenario
let root = scenarioTempPath scenario
let projectDir = root @@ "TestProjects"

directPaketInPath "install" projectDir |> ignore
let output = directDotnet false "run --project MainGroup.fsproj" projectDir |> Seq.map (_.Message)
directDotnet false "pack MainGroup.fsproj -o ." projectDir |> ignore

output |> shouldIncludePackageA 1
output |> shouldIncludePackageB 1
output |> shouldIncludePackageBTransient 1
output |> shouldIncludeConstant 1

let nupkgPath = projectDir @@ "MainGroup.1.0.0.nupkg"

if File.Exists nupkgPath |> not then Assert.Fail $"Expected '%s{nupkgPath}' to exist"
let nuspec = NuGetCache.getNuSpecFromNupkg nupkgPath
let dependencies = nuspec.Dependencies.Value
|> List.map (fun (n, v, _) -> n.Name, v.Range.ToString())

let expected = [("PaketTest2394.PackageA", ">= 1.0 < 2.0"); ("PaketTest2394.PackageB", ">= 1.0 < 2.0")]
Assert.That(dependencies, Is.SupersetOf expected)

[<Test>]
let ``#2394 alternate group with no condition`` () =
let scenario = "i002394-group-conditions"
preparePackages (originalScenarioPath scenario)

use __ = prepare scenario
let root = scenarioTempPath scenario
let projectDir = root @@ "TestProjects"

directPaketInPath "install" projectDir |> ignore
let output = directDotnet false "run --project NonConditionalGroup.fsproj" projectDir |> Seq.map (_.Message)
directDotnet false "pack NonConditionalGroup.fsproj -o ." projectDir |> ignore

output |> shouldIncludePackageA 2
output |> shouldIncludePackageB 2
output |> shouldIncludePackageBTransient 2
output |> shouldIncludeConstant 2

let nupkgPath = projectDir @@ "NonConditionalGroup.1.0.0.nupkg"

if File.Exists nupkgPath |> not then Assert.Fail $"Expected '%s{nupkgPath}' to exist"
let nuspec = NuGetCache.getNuSpecFromNupkg nupkgPath
let dependencies = nuspec.Dependencies.Value
|> List.map (fun (n, v, _) -> n.Name, v.Range.ToString())

let expected = [("PaketTest2394.PackageA", ">= 2.0 < 3.0"); ("PaketTest2394.PackageB", ">= 2.0 < 3.0")]
Assert.That(dependencies, Is.SupersetOf expected)

[<Test>]
let ``#2394 group with fixed property condition`` () =
let scenario = "i002394-group-conditions"
preparePackages (originalScenarioPath scenario)

use __ = prepare scenario
let root = scenarioTempPath scenario
let projectDir = root @@ "TestProjects"

directPaketInPath "install" projectDir |> ignore
let output = directDotnet false "run --project FixedProperty.fsproj" projectDir |> Seq.map (_.Message)
directDotnet false "pack FixedProperty.fsproj -o ." projectDir |> ignore

output |> shouldIncludePackageA 3
output |> shouldIncludePackageB 3
output |> shouldIncludePackageBTransient 3
output |> shouldIncludeConstant 3

let nupkgPath = projectDir @@ "FixedProperty.1.0.0.nupkg"

if File.Exists nupkgPath |> not then Assert.Fail $"Expected '%s{nupkgPath}' to exist"
let nuspec = NuGetCache.getNuSpecFromNupkg nupkgPath
let dependencies = nuspec.Dependencies.Value
|> List.map (fun (n, v, _) -> n.Name, v.Range.ToString())

let expected = [("PaketTest2394.PackageA", ">= 3.0 < 4.0"); ("PaketTest2394.PackageB", ">= 3.0 < 4.0")]
Assert.That(dependencies, Is.SupersetOf expected)

[<Test>]
let ``#2394 mix dependencies from multiple groups with conditions`` () =
let scenario = "i002394-group-conditions"
preparePackages (originalScenarioPath scenario)

use __ = prepare scenario
let root = scenarioTempPath scenario
let projectDir = root @@ "TestProjects"

directPaketInPath "install" projectDir |> ignore
let output = directDotnet false "run --project MixedProperties.fsproj" projectDir |> Seq.map (_.Message)
directDotnet false "pack MixedProperties.fsproj -o ." projectDir |> ignore

output |> shouldIncludePackageA 4
output |> shouldIncludePackageB 5
output |> shouldIncludePackageBTransient 5
output |> shouldIncludeConstant 4

let expected = ["PackageA 4.0"; "PackageB 5.0 (references PackageB.Transient 5.0)"; "PackageB.Transient 5.0"; "Constant PACKAGEA_4 set"]
let rejected = ["PackageA 1.0"; "PackageB.Transient 1.0"; "Constant PACKAGEA_1 set"
"PackageA 2.0"; "PackageB.Transient 2.0"; "Constant PACKAGEA_2 set"
"PackageA 3.0"; "PackageB.Transient 3.0"; "Constant PACKAGEA_3 set"
"PackageA 5.0"; "PackageB.Transient 4.0"; "Constant PACKAGEA_5 set"]
Assert.That(output, Is.SupersetOf expected)
Assert.That(output, Is.Not.SubsetOf rejected)

let nupkgPath = projectDir @@ "MixedProperties.1.0.0.nupkg"

if File.Exists nupkgPath |> not then Assert.Fail $"Expected '%s{nupkgPath}' to exist"
let nuspec = NuGetCache.getNuSpecFromNupkg nupkgPath
let dependencies = nuspec.Dependencies.Value
|> List.map (fun (n, v, _) -> n.Name, v.Range.ToString())

let expected = [("PaketTest2394.PackageA", ">= 4.0 < 5.0"); ("PaketTest2394.PackageB", ">= 5.0 < 6.0")]
Assert.That(dependencies, Is.SupersetOf expected)

[<Test>]
let ``#2394 project with dynamic condition based on configuration 1`` () =
let scenario = "i002394-group-conditions"
preparePackages (originalScenarioPath scenario)

use __ = prepare scenario
let root = scenarioTempPath scenario
let projectDir = root @@ "TestProjects"

directPaketInPath "install" projectDir |> ignore
let output = directDotnet false "run --project ConfigurationDependent.fsproj" projectDir |> Seq.map (_.Message)
directDotnet false "pack ConfigurationDependent.fsproj -o ." projectDir |> ignore

output |> shouldIncludePackageA 3
output |> shouldIncludePackageB 3
output |> shouldIncludePackageBTransient 3
output |> shouldIncludeConstant 3

let nupkgPath = projectDir @@ "ConfigurationDependent.1.0.0.nupkg"

if File.Exists nupkgPath |> not then Assert.Fail $"Expected '%s{nupkgPath}' to exist"
let nuspec = NuGetCache.getNuSpecFromNupkg nupkgPath
let dependencies = nuspec.Dependencies.Value
|> List.map (fun (n, v, _) -> n.Name, v.Range.ToString())

let expected = [("PaketTest2394.PackageA", ">= 3.0 < 4.0"); ("PaketTest2394.PackageB", ">= 3.0 < 4.0")]
Assert.That(dependencies, Is.SupersetOf expected)

[<Test>]
let ``#2394 project with dynamic condition based on configuration 2`` () =
let scenario = "i002394-group-conditions"
preparePackages (originalScenarioPath scenario)

use __ = prepare scenario
let root = scenarioTempPath scenario
let projectDir = root @@ "TestProjects"

directPaketInPath "install" projectDir |> ignore
let output = directDotnet false "run --project ConfigurationDependent.fsproj --configuration Alternate" projectDir |> Seq.map (_.Message)
directDotnet false "pack ConfigurationDependent.fsproj --configuration Alternate -o ." projectDir |> ignore

output |> shouldIncludePackageA 4
output |> shouldIncludePackageB 4
output |> shouldIncludePackageBTransient 4
output |> shouldIncludeConstant 4

let nupkgPath = projectDir @@ "ConfigurationDependent.1.0.0.nupkg"

if File.Exists nupkgPath |> not then Assert.Fail $"Expected '%s{nupkgPath}' to exist"
let nuspec = NuGetCache.getNuSpecFromNupkg nupkgPath
let dependencies = nuspec.Dependencies.Value
|> List.map (fun (n, v, _) -> n.Name, v.Range.ToString())

let expected = [("PaketTest2394.PackageA", ">= 4.0 < 5.0"); ("PaketTest2394.PackageB", ">= 4.0 < 5.0")]
Assert.That(dependencies, Is.SupersetOf expected)
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
<None Include="paket.references" />
<Content Include="App.config" />
<Compile Include="AddGithubSpecs.fs" />
<Compile Include="ConditionSpecs.fs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Paket.Core\Paket.Core.fsproj" />
Expand All @@ -51,4 +52,4 @@
</Reference>
</ItemGroup>
<Import Project="..\..\.paket\Paket.Restore.targets" />
</Project>
</Project>
2 changes: 1 addition & 1 deletion integrationtests/Paket.IntegrationTests/TestHelper.fs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ open System
open System.IO
open Paket.Logging

let disableScenarioCleanup = false // change to true to debug a single test temporarily.
let disableScenarioCleanup = true // change to true to debug a single test temporarily.

let isLiveUnitTesting = AppDomain.CurrentDomain.GetAssemblies() |> Seq.exists (fun a -> a.GetName().Name = "Microsoft.CodeAnalysis.LiveUnitTesting.Runtime")

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*.nupkg
bin/
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project>
<!-- Based on https://github.com/NuGet/Home/issues/5525#issuecomment-1179525536 -->
<Target Name="UseExplicitPackageVersions" BeforeTargets="GenerateNuspec">
<ItemGroup>
<_ProjectReferenceWithExplicitPackageVersion Include="@(ProjectReference->'%(FullPath)')" Condition="'%(ProjectReference.PackageVersion)' != ''" />
<_ProjectReferenceWithExactPackageVersion Include="@(ProjectReference->'%(FullPath)')" />
<_ProjectReferenceWithReassignedVersion Include="@(_ProjectReferencesWithVersions)" Condition="'%(Identity)' != '' And '@(_ProjectReferenceWithExplicitPackageVersion)' == '@(_ProjectReferencesWithVersions)'">
<ProjectVersion>@(_ProjectReferenceWithExplicitPackageVersion->'%(PackageVersion)')</ProjectVersion>
</_ProjectReferenceWithReassignedVersion>
<_ProjectReferenceWithReassignedVersion Include="@(_ProjectReferencesWithVersions)" Condition="'%(Identity)' != '' And '@(_ProjectReferenceWithExactPackageVersion)' == '@(_ProjectReferencesWithVersions)'">
<ProjectVersion>[@(_ProjectReferencesWithVersions->'%(ProjectVersion)')]</ProjectVersion>
</_ProjectReferenceWithReassignedVersion>
<_ProjectReferencesWithVersions Remove="@(_ProjectReferenceWithReassignedVersion)" />
<_ProjectReferencesWithVersions Include="@(_ProjectReferenceWithReassignedVersion)" />
</ItemGroup>
</Target>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PaketTest2394.PackageA", "PaketTest2394.PackageA\PaketTest2394.PackageA.csproj", "{A0449AB0-A1EA-4BE6-8D03-701BC5A2FD46}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PaketTest2394.PackageB", "PaketTest2394.PackageB\PaketTest2394.PackageB.csproj", "{59B3FFCE-AA5A-4AAA-B73D-108A6A15E524}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PaketTest2394.PackageB.Transient", "PaketTest2394.PackageB.Transient\PaketTest2394.PackageB.Transient.csproj", "{C763B8F6-18BF-4018-B852-CA8EE39C94F5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A0449AB0-A1EA-4BE6-8D03-701BC5A2FD46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A0449AB0-A1EA-4BE6-8D03-701BC5A2FD46}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A0449AB0-A1EA-4BE6-8D03-701BC5A2FD46}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A0449AB0-A1EA-4BE6-8D03-701BC5A2FD46}.Release|Any CPU.Build.0 = Release|Any CPU
{59B3FFCE-AA5A-4AAA-B73D-108A6A15E524}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{59B3FFCE-AA5A-4AAA-B73D-108A6A15E524}.Debug|Any CPU.Build.0 = Debug|Any CPU
{59B3FFCE-AA5A-4AAA-B73D-108A6A15E524}.Release|Any CPU.ActiveCfg = Release|Any CPU
{59B3FFCE-AA5A-4AAA-B73D-108A6A15E524}.Release|Any CPU.Build.0 = Release|Any CPU
{C763B8F6-18BF-4018-B852-CA8EE39C94F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C763B8F6-18BF-4018-B852-CA8EE39C94F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C763B8F6-18BF-4018-B852-CA8EE39C94F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C763B8F6-18BF-4018-B852-CA8EE39C94F5}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace PaketTest2394.PackageA;

public static class PackageDescription
{
public static string GetDescription()
{
var assemblyName = typeof(PackageDescription).Assembly.GetName();
return $"PackageA {assemblyName.Version!.ToString(2)}";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Include="build/PaketTest2394.PackageA.targets" Pack="true" PackagePath="build\PaketTest2394.PackageA.targets" />
</ItemGroup>
<Target Name="UpdateTargetsFile" BeforeTargets="Build">
<PropertyGroup>
<NewDefineConstants>%24(DefineConstants)%3BPACKAGEA_$(Version.Split('.')[0])</NewDefineConstants>
</PropertyGroup>
<XmlPoke XmlInputPath="build/PaketTest2394.PackageA.targets" Query="//DefineConstants" Value="$(NewDefineConstants)"/>
</Target>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<Project>
<PropertyGroup>
<DefineConstants>$(DefineConstants);PACKAGEA_5</DefineConstants>
</PropertyGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace PaketTest2394.PackageB.Transient;

public static class PackageDescription
{
public static string GetDescription()
{
var assemblyName = typeof(PackageDescription).Assembly.GetName();
return $"PackageB.Transient {assemblyName.Version!.ToString(2)}";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace PaketTest2394.PackageB;

public static class PackageDescription
{
public static string GetDescription()
{
var assemblyName = typeof(PackageDescription).Assembly.GetName();
return $"PackageB {assemblyName.Version!.ToString(2)} (references {Transient.PackageDescription.GetDescription()})";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\PaketTest2394.PackageB.Transient\PaketTest2394.PackageB.Transient.csproj" />
</ItemGroup>

</Project>
Loading

0 comments on commit 76c84ac

Please sign in to comment.