File: StaticContentProviderTests.cs
Web Access
Project: src\src\Components\WebView\WebView\test\Microsoft.AspNetCore.Components.WebView.Test.csproj (Microsoft.AspNetCore.Components.WebView.Test)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Primitives;
 
namespace Microsoft.AspNetCore.Components.WebView;
 
public class StaticContentProviderTests
{
    [Fact]
    public void TryGetResponseContentReturnsCorrectContentTypeForNonPhysicalFile()
    {
        // Arrange
        const string cssFilePath = "folder/file.css";
        const string cssFileContent = "this is css";
        var inMemoryFileProvider = new InMemoryFileProvider(
            new Dictionary<string, string>
            {
                    { cssFilePath, cssFileContent },
            });
        var appBase = "fake://0.0.0.0/";
        var scp = new StaticContentProvider(inMemoryFileProvider, new Uri(appBase), "fakehost.html");
 
        // Act
        Assert.True(scp.TryGetResponseContent(
            requestUri: appBase + cssFilePath,
            allowFallbackOnHostPage: false,
            out var statusCode,
            out var statusMessage,
            out var content,
            out var headers));
 
        // Assert
        var contentString = new StreamReader(content).ReadToEnd();
        Assert.Equal(200, statusCode);
        Assert.Equal("OK", statusMessage);
        Assert.Equal("this is css", contentString);
        Assert.True(headers.TryGetValue("Content-Type", out var contentTypeValue));
        Assert.Equal("text/css", contentTypeValue);
    }
 
    private sealed class InMemoryFileProvider : IFileProvider
    {
        public InMemoryFileProvider(IDictionary<string, string> filePathsAndContents)
        {
            ArgumentNullException.ThrowIfNull(filePathsAndContents);
 
            FilePathsAndContents = filePathsAndContents;
        }
 
        public IDictionary<string, string> FilePathsAndContents { get; }
 
        public IDirectoryContents GetDirectoryContents(string subpath)
        {
            return new InMemoryDirectoryContents(this, subpath);
        }
 
        public IFileInfo GetFileInfo(string subpath)
        {
            return FilePathsAndContents
                .Where(kvp => kvp.Key == subpath)
                .Select(x => new InMemoryFileInfo(x.Key, x.Value))
                .Single();
        }
 
        public IChangeToken Watch(string filter)
        {
            return null;
        }
 
        private sealed class InMemoryDirectoryContents : IDirectoryContents
        {
            private readonly InMemoryFileProvider _inMemoryFileProvider;
            private readonly string _subPath;
 
            public InMemoryDirectoryContents(InMemoryFileProvider inMemoryFileProvider, string subPath)
            {
                _inMemoryFileProvider = inMemoryFileProvider ?? throw new ArgumentNullException(nameof(inMemoryFileProvider));
                _subPath = subPath ?? throw new ArgumentNullException(nameof(inMemoryFileProvider));
            }
 
            public bool Exists => true;
 
            public IEnumerator<IFileInfo> GetEnumerator()
            {
                return
                    _inMemoryFileProvider
                        .FilePathsAndContents
                        .Where(kvp => kvp.Key.StartsWith(_subPath, StringComparison.Ordinal))
                        .Select(x => new InMemoryFileInfo(x.Key, x.Value))
                        .GetEnumerator();
            }
 
            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
            {
                return GetEnumerator();
            }
        }
 
        private sealed class InMemoryFileInfo : IFileInfo
        {
            private readonly string _filePath;
            private readonly string _fileContents;
 
            public InMemoryFileInfo(string filePath, string fileContents)
            {
                _filePath = filePath;
                _fileContents = fileContents;
            }
 
            public bool Exists => true;
 
            public long Length => _fileContents.Length;
 
            public string PhysicalPath => null;
 
            public string Name => Path.GetFileName(_filePath);
 
            public DateTimeOffset LastModified => DateTimeOffset.Now;
 
            public bool IsDirectory => false;
 
            public Stream CreateReadStream()
            {
                return new MemoryStream(Encoding.UTF8.GetBytes(_fileContents));
            }
        }
    }
}