// 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 { 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 _directories; public bool CreateDirectoryInvoked { get; set; } public DirectoryMock(IList directories = null) { _directories = directories ?? new List(); } public bool Exists(string path) { return _directories.Any(d => d == path); } public ITemporaryDirectory CreateTemporaryDirectory() { throw new NotImplementedException(); } public IEnumerable 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; } } } }