244 lines
9.5 KiB
C#
244 lines
9.5 KiB
C#
|
// 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;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using FluentAssertions;
|
||
|
using Microsoft.DotNet.Cli.CommandLine;
|
||
|
using Microsoft.DotNet.Cli.Utils;
|
||
|
using Microsoft.DotNet.ToolPackage;
|
||
|
using Microsoft.DotNet.Tools.Install.Tool;
|
||
|
using Microsoft.DotNet.Tools.Tests.ComponentMocks;
|
||
|
using Microsoft.DotNet.Tools.Test.Utilities;
|
||
|
using Microsoft.DotNet.Tools.Update.Tool;
|
||
|
using Microsoft.Extensions.DependencyModel.Tests;
|
||
|
using Microsoft.Extensions.EnvironmentAbstractions;
|
||
|
using Xunit;
|
||
|
using Parser = Microsoft.DotNet.Cli.Parser;
|
||
|
using LocalizableStrings = Microsoft.DotNet.Tools.Update.Tool.LocalizableStrings;
|
||
|
|
||
|
namespace Microsoft.DotNet.Tests.Commands
|
||
|
{
|
||
|
public class UpdateToolCommandTests
|
||
|
{
|
||
|
private readonly BufferedReporter _reporter;
|
||
|
private readonly IFileSystem _fileSystem;
|
||
|
private readonly EnvironmentPathInstructionMock _environmentPathInstructionMock;
|
||
|
private readonly ToolPackageStoreMock _store;
|
||
|
private readonly PackageId _packageId = new PackageId("global.tool.console.demo");
|
||
|
private readonly List<MockFeed> _mockFeeds;
|
||
|
private const string LowerPackageVersion = "1.0.4";
|
||
|
private const string HigherPackageVersion = "1.0.5";
|
||
|
private const string ShimsDirectory = "shims";
|
||
|
private const string ToolsDirectory = "tools";
|
||
|
|
||
|
public UpdateToolCommandTests()
|
||
|
{
|
||
|
_reporter = new BufferedReporter();
|
||
|
_fileSystem = new FileSystemMockBuilder().Build();
|
||
|
_environmentPathInstructionMock = new EnvironmentPathInstructionMock(_reporter, ShimsDirectory);
|
||
|
_store = new ToolPackageStoreMock(new DirectoryPath(ToolsDirectory), _fileSystem);
|
||
|
_mockFeeds = new List<MockFeed>
|
||
|
{
|
||
|
new MockFeed
|
||
|
{
|
||
|
Type = MockFeedType.FeedFromLookUpNugetConfig,
|
||
|
Packages = new List<MockFeedPackage>
|
||
|
{
|
||
|
new MockFeedPackage
|
||
|
{
|
||
|
PackageId = _packageId.ToString(),
|
||
|
Version = LowerPackageVersion
|
||
|
},
|
||
|
new MockFeedPackage
|
||
|
{
|
||
|
PackageId = _packageId.ToString(),
|
||
|
Version = HigherPackageVersion
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
[Fact]
|
||
|
public void GivenANonExistentPackageItErrors()
|
||
|
{
|
||
|
var packageId = "does.not.exist";
|
||
|
var command = CreateUpdateCommand($"-g {packageId}");
|
||
|
|
||
|
Action a = () => command.Execute();
|
||
|
|
||
|
a.ShouldThrow<GracefulException>().And.Message
|
||
|
.Should().Contain(
|
||
|
string.Format(
|
||
|
LocalizableStrings.ToolNotInstalled,
|
||
|
packageId));
|
||
|
}
|
||
|
|
||
|
[Fact]
|
||
|
public void GivenAnExistedLowerversionInstallationWhenCallItCanUpdateThePackageVersion()
|
||
|
{
|
||
|
CreateInstallCommand($"-g {_packageId} --version {LowerPackageVersion}").Execute();
|
||
|
|
||
|
var command = CreateUpdateCommand($"-g {_packageId}");
|
||
|
|
||
|
command.Execute();
|
||
|
|
||
|
_store.EnumeratePackageVersions(_packageId).Single().Version.ToFullString().Should()
|
||
|
.Be(HigherPackageVersion);
|
||
|
}
|
||
|
|
||
|
[Fact]
|
||
|
public void GivenAnExistedLowerversionInstallationWhenCallItCanPrintSucessMessage()
|
||
|
{
|
||
|
CreateInstallCommand($"-g {_packageId} --version {LowerPackageVersion}").Execute();
|
||
|
_reporter.Lines.Clear();
|
||
|
|
||
|
var command = CreateUpdateCommand($"-g {_packageId}");
|
||
|
|
||
|
command.Execute();
|
||
|
|
||
|
_reporter.Lines.First().Should().Contain(string.Format(
|
||
|
LocalizableStrings.UpdateSucceeded,
|
||
|
_packageId, LowerPackageVersion, HigherPackageVersion));
|
||
|
}
|
||
|
|
||
|
[Fact]
|
||
|
public void GivenAnExistedSameVersionInstallationWhenCallItCanPrintSucessMessage()
|
||
|
{
|
||
|
CreateInstallCommand($"-g {_packageId} --version {HigherPackageVersion}").Execute();
|
||
|
_reporter.Lines.Clear();
|
||
|
|
||
|
var command = CreateUpdateCommand($"-g {_packageId}");
|
||
|
|
||
|
command.Execute();
|
||
|
|
||
|
_reporter.Lines.First().Should().Contain(string.Format(
|
||
|
LocalizableStrings.UpdateSucceededVersionNoChange,
|
||
|
_packageId, HigherPackageVersion));
|
||
|
}
|
||
|
|
||
|
[Fact]
|
||
|
public void GivenAnExistedLowerversionWhenReinstallThrowsIthasTheFirstLineIndicateUpdateFailure()
|
||
|
{
|
||
|
CreateInstallCommand($"-g {_packageId} --version {LowerPackageVersion}").Execute();
|
||
|
_reporter.Lines.Clear();
|
||
|
|
||
|
ParseResult result = Parser.Instance.Parse("dotnet update tool " + $"-g {_packageId}");
|
||
|
var command = new UpdateToolCommand(
|
||
|
result["dotnet"]["update"]["tool"],
|
||
|
result,
|
||
|
_ => (_store,
|
||
|
new ToolPackageInstallerMock(
|
||
|
_fileSystem,
|
||
|
_store,
|
||
|
new ProjectRestorerMock(
|
||
|
_fileSystem,
|
||
|
_reporter,
|
||
|
_mockFeeds
|
||
|
),
|
||
|
installCallback: () => throw new ToolConfigurationException("Simulated error"))),
|
||
|
_ => new ShellShimRepositoryMock(new DirectoryPath(ShimsDirectory), _fileSystem),
|
||
|
_reporter);
|
||
|
|
||
|
Action a = () => command.Execute();
|
||
|
a.ShouldThrow<GracefulException>().And.Message.Should().Contain(
|
||
|
string.Format(LocalizableStrings.UpdateToolFailed, _packageId) + Environment.NewLine +
|
||
|
string.Format(Tools.Install.Tool.LocalizableStrings.InvalidToolConfiguration, "Simulated error"));
|
||
|
}
|
||
|
|
||
|
[Fact]
|
||
|
public void GivenAnExistedLowerversionWhenReinstallThrowsItRollsBack()
|
||
|
{
|
||
|
CreateInstallCommand($"-g {_packageId} --version {LowerPackageVersion}").Execute();
|
||
|
_reporter.Lines.Clear();
|
||
|
|
||
|
ParseResult result = Parser.Instance.Parse("dotnet update tool " + $"-g {_packageId}");
|
||
|
var command = new UpdateToolCommand(
|
||
|
result["dotnet"]["update"]["tool"],
|
||
|
result,
|
||
|
_ => (_store,
|
||
|
new ToolPackageInstallerMock(
|
||
|
_fileSystem,
|
||
|
_store,
|
||
|
new ProjectRestorerMock(
|
||
|
_fileSystem,
|
||
|
_reporter,
|
||
|
_mockFeeds
|
||
|
),
|
||
|
installCallback: () => throw new ToolConfigurationException("Simulated error"))),
|
||
|
_ => new ShellShimRepositoryMock(new DirectoryPath(ShimsDirectory), _fileSystem),
|
||
|
_reporter);
|
||
|
|
||
|
Action a = () => command.Execute();
|
||
|
|
||
|
_store.EnumeratePackageVersions(_packageId).Single().Version.ToFullString().Should()
|
||
|
.Be(LowerPackageVersion);
|
||
|
}
|
||
|
|
||
|
[Fact]
|
||
|
public void WhenRunWithBothGlobalAndToolPathShowErrorMessage()
|
||
|
{
|
||
|
var command = CreateUpdateCommand($"-g --tool-path /tmp/folder {_packageId}");
|
||
|
|
||
|
Action a = () => command.Execute();
|
||
|
|
||
|
a.ShouldThrow<GracefulException>().And.Message
|
||
|
.Should().Contain(
|
||
|
LocalizableStrings.UpdateToolCommandInvalidGlobalAndToolPath);
|
||
|
}
|
||
|
|
||
|
[Fact]
|
||
|
public void WhenRunWithNeitherOfGlobalNorToolPathShowErrorMessage()
|
||
|
{
|
||
|
var command = CreateUpdateCommand($"{_packageId}");
|
||
|
|
||
|
Action a = () => command.Execute();
|
||
|
|
||
|
a.ShouldThrow<GracefulException>().And.Message
|
||
|
.Should().Contain(
|
||
|
LocalizableStrings.UpdateToolCommandNeedGlobalOrToolPath);
|
||
|
}
|
||
|
|
||
|
private InstallToolCommand CreateInstallCommand(string options)
|
||
|
{
|
||
|
ParseResult result = Parser.Instance.Parse("dotnet install tool " + options);
|
||
|
|
||
|
return new InstallToolCommand(
|
||
|
result["dotnet"]["install"]["tool"],
|
||
|
result,
|
||
|
(_) => (_store, new ToolPackageInstallerMock(
|
||
|
_fileSystem,
|
||
|
_store,
|
||
|
new ProjectRestorerMock(
|
||
|
_fileSystem,
|
||
|
_reporter,
|
||
|
_mockFeeds
|
||
|
))),
|
||
|
(_) => new ShellShimRepositoryMock(new DirectoryPath(ShimsDirectory), _fileSystem),
|
||
|
_environmentPathInstructionMock,
|
||
|
_reporter);
|
||
|
}
|
||
|
|
||
|
private UpdateToolCommand CreateUpdateCommand(string options)
|
||
|
{
|
||
|
ParseResult result = Parser.Instance.Parse("dotnet update tool " + options);
|
||
|
|
||
|
return new UpdateToolCommand(
|
||
|
result["dotnet"]["update"]["tool"],
|
||
|
result,
|
||
|
(_) => (_store, new ToolPackageInstallerMock(
|
||
|
_fileSystem,
|
||
|
_store,
|
||
|
new ProjectRestorerMock(
|
||
|
_fileSystem,
|
||
|
_reporter,
|
||
|
_mockFeeds
|
||
|
))),
|
||
|
(_) => new ShellShimRepositoryMock(new DirectoryPath(ShimsDirectory), _fileSystem),
|
||
|
_reporter);
|
||
|
}
|
||
|
}
|
||
|
}
|