Merge pull request #6999 from livarcocc/first_run_sentinel_when_no_dotnet_folder_exists
Create the Dotnet User Profile folder when running the first experience
This commit is contained in:
commit
7af62e423e
2 changed files with 187 additions and 2 deletions
|
@ -13,19 +13,24 @@ namespace Microsoft.DotNet.Configurer
|
||||||
public static readonly string SENTINEL = $"{Product.Version}.dotnetFirstUseSentinel";
|
public static readonly string SENTINEL = $"{Product.Version}.dotnetFirstUseSentinel";
|
||||||
|
|
||||||
private readonly IFile _file;
|
private readonly IFile _file;
|
||||||
|
private readonly IDirectory _directory;
|
||||||
|
|
||||||
private string _dotnetUserProfileFolderPath;
|
private string _dotnetUserProfileFolderPath;
|
||||||
|
|
||||||
private string SentinelPath => Path.Combine(_dotnetUserProfileFolderPath, SENTINEL);
|
private string SentinelPath => Path.Combine(_dotnetUserProfileFolderPath, SENTINEL);
|
||||||
|
|
||||||
public FirstTimeUseNoticeSentinel(CliFallbackFolderPathCalculator cliFallbackFolderPathCalculator) :
|
public FirstTimeUseNoticeSentinel(CliFallbackFolderPathCalculator cliFallbackFolderPathCalculator) :
|
||||||
this(cliFallbackFolderPathCalculator.DotnetUserProfileFolderPath, FileSystemWrapper.Default.File)
|
this(
|
||||||
|
cliFallbackFolderPathCalculator.DotnetUserProfileFolderPath,
|
||||||
|
FileSystemWrapper.Default.File,
|
||||||
|
FileSystemWrapper.Default.Directory)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
internal FirstTimeUseNoticeSentinel(string dotnetUserProfileFolderPath, IFile file)
|
internal FirstTimeUseNoticeSentinel(string dotnetUserProfileFolderPath, IFile file, IDirectory directory)
|
||||||
{
|
{
|
||||||
_file = file;
|
_file = file;
|
||||||
|
_directory = directory;
|
||||||
_dotnetUserProfileFolderPath = dotnetUserProfileFolderPath;
|
_dotnetUserProfileFolderPath = dotnetUserProfileFolderPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,6 +43,11 @@ namespace Microsoft.DotNet.Configurer
|
||||||
{
|
{
|
||||||
if (!Exists())
|
if (!Exists())
|
||||||
{
|
{
|
||||||
|
if (!_directory.Exists(_dotnetUserProfileFolderPath))
|
||||||
|
{
|
||||||
|
_directory.CreateDirectory(_dotnetUserProfileFolderPath);
|
||||||
|
}
|
||||||
|
|
||||||
_file.CreateEmptyFile(SentinelPath);
|
_file.CreateEmptyFile(SentinelPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,175 @@
|
||||||
|
// 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.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using FluentAssertions;
|
||||||
|
using Microsoft.DotNet.Cli.Utils;
|
||||||
|
using Microsoft.DotNet.Configurer;
|
||||||
|
using Microsoft.Extensions.DependencyModel.Tests;
|
||||||
|
using Microsoft.Extensions.EnvironmentAbstractions;
|
||||||
|
using Moq;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.DotNet.Configurer.UnitTests
|
||||||
|
{
|
||||||
|
public class GivenAFirstTimeUseNoticeSentinel
|
||||||
|
{
|
||||||
|
private const string DOTNET_USER_PROFILE_FOLDER_PATH = "some path";
|
||||||
|
|
||||||
|
private FileSystemMockBuilder _fileSystemMockBuilder;
|
||||||
|
|
||||||
|
public GivenAFirstTimeUseNoticeSentinel()
|
||||||
|
{
|
||||||
|
_fileSystemMockBuilder = FileSystemMockBuilder.Create();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TheSentinelHasTheCurrentVersionInItsName()
|
||||||
|
{
|
||||||
|
FirstTimeUseNoticeSentinel.SENTINEL.Should().Contain($"{Product.Version}");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ItReturnsTrueIfTheSentinelExists()
|
||||||
|
{
|
||||||
|
_fileSystemMockBuilder.AddFiles(DOTNET_USER_PROFILE_FOLDER_PATH, FirstTimeUseNoticeSentinel.SENTINEL);
|
||||||
|
|
||||||
|
var fileSystemMock = _fileSystemMockBuilder.Build();
|
||||||
|
|
||||||
|
var firstTimeUseNoticeSentinel =
|
||||||
|
new FirstTimeUseNoticeSentinel(
|
||||||
|
DOTNET_USER_PROFILE_FOLDER_PATH,
|
||||||
|
fileSystemMock.File,
|
||||||
|
fileSystemMock.Directory);
|
||||||
|
|
||||||
|
firstTimeUseNoticeSentinel.Exists().Should().BeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ItReturnsFalseIfTheSentinelDoesNotExist()
|
||||||
|
{
|
||||||
|
var fileSystemMock = _fileSystemMockBuilder.Build();
|
||||||
|
|
||||||
|
var firstTimeUseNoticeSentinel =
|
||||||
|
new FirstTimeUseNoticeSentinel(
|
||||||
|
DOTNET_USER_PROFILE_FOLDER_PATH,
|
||||||
|
fileSystemMock.File,
|
||||||
|
fileSystemMock.Directory);
|
||||||
|
|
||||||
|
firstTimeUseNoticeSentinel.Exists().Should().BeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ItCreatesTheSentinelInTheDotnetUserProfileFolderPathIfItDoesNotExistAlready()
|
||||||
|
{
|
||||||
|
var fileSystemMock = _fileSystemMockBuilder.Build();
|
||||||
|
var firstTimeUseNoticeSentinel =
|
||||||
|
new FirstTimeUseNoticeSentinel(
|
||||||
|
DOTNET_USER_PROFILE_FOLDER_PATH,
|
||||||
|
fileSystemMock.File,
|
||||||
|
fileSystemMock.Directory);
|
||||||
|
|
||||||
|
firstTimeUseNoticeSentinel.Exists().Should().BeFalse();
|
||||||
|
|
||||||
|
firstTimeUseNoticeSentinel.CreateIfNotExists();
|
||||||
|
|
||||||
|
firstTimeUseNoticeSentinel.Exists().Should().BeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ItDoesNotCreateTheSentinelAgainIfItAlreadyExistsInTheDotnetUserProfileFolderPath()
|
||||||
|
{
|
||||||
|
const string contentToValidateSentinalWasNotReplaced = "some string";
|
||||||
|
var sentinel = Path.Combine(DOTNET_USER_PROFILE_FOLDER_PATH, FirstTimeUseNoticeSentinel.SENTINEL);
|
||||||
|
_fileSystemMockBuilder.AddFile(sentinel, contentToValidateSentinalWasNotReplaced);
|
||||||
|
|
||||||
|
var fileSystemMock = _fileSystemMockBuilder.Build();
|
||||||
|
|
||||||
|
var firstTimeUseNoticeSentinel =
|
||||||
|
new FirstTimeUseNoticeSentinel(
|
||||||
|
DOTNET_USER_PROFILE_FOLDER_PATH,
|
||||||
|
fileSystemMock.File,
|
||||||
|
fileSystemMock.Directory);
|
||||||
|
|
||||||
|
firstTimeUseNoticeSentinel.Exists().Should().BeTrue();
|
||||||
|
|
||||||
|
firstTimeUseNoticeSentinel.CreateIfNotExists();
|
||||||
|
|
||||||
|
fileSystemMock.File.ReadAllText(sentinel).Should().Be(contentToValidateSentinalWasNotReplaced);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ItCreatesTheDotnetUserProfileFolderIfItDoesNotExistAlreadyWhenCreatingTheSentinel()
|
||||||
|
{
|
||||||
|
var fileSystemMock = _fileSystemMockBuilder.Build();
|
||||||
|
var directoryMock = new DirectoryMock();
|
||||||
|
var firstTimeUseNoticeSentinel =
|
||||||
|
new FirstTimeUseNoticeSentinel(
|
||||||
|
DOTNET_USER_PROFILE_FOLDER_PATH,
|
||||||
|
fileSystemMock.File,
|
||||||
|
directoryMock);
|
||||||
|
|
||||||
|
firstTimeUseNoticeSentinel.CreateIfNotExists();
|
||||||
|
|
||||||
|
directoryMock.Exists(DOTNET_USER_PROFILE_FOLDER_PATH).Should().BeTrue();
|
||||||
|
directoryMock.CreateDirectoryInvoked.Should().BeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ItDoesNotAttemptToCreateTheDotnetUserProfileFolderIfItAlreadyExistsWhenCreatingTheSentinel()
|
||||||
|
{
|
||||||
|
var fileSystemMock = _fileSystemMockBuilder.Build();
|
||||||
|
var directoryMock = new DirectoryMock(new List<string> { DOTNET_USER_PROFILE_FOLDER_PATH });
|
||||||
|
var firstTimeUseNoticeSentinel =
|
||||||
|
new FirstTimeUseNoticeSentinel(
|
||||||
|
DOTNET_USER_PROFILE_FOLDER_PATH,
|
||||||
|
fileSystemMock.File,
|
||||||
|
directoryMock);
|
||||||
|
|
||||||
|
firstTimeUseNoticeSentinel.CreateIfNotExists();
|
||||||
|
|
||||||
|
directoryMock.CreateDirectoryInvoked.Should().BeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class DirectoryMock : IDirectory
|
||||||
|
{
|
||||||
|
private IList<string> _directories;
|
||||||
|
|
||||||
|
public bool CreateDirectoryInvoked { get; set; }
|
||||||
|
|
||||||
|
public DirectoryMock(IList<string> directories = null)
|
||||||
|
{
|
||||||
|
_directories = directories ?? new List<string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Exists(string path)
|
||||||
|
{
|
||||||
|
return _directories.Any(d => d == path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ITemporaryDirectory CreateTemporaryDirectory()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<string> GetFiles(string path, string searchPattern)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetDirectoryFullName(string path)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CreateDirectory(string path)
|
||||||
|
{
|
||||||
|
_directories.Add(path);
|
||||||
|
CreateDirectoryInvoked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue