diff --git a/.github/workflows/docker-build-push.yml b/.github/workflows/docker-build-push.yml index 26ea558..c968cdb 100644 --- a/.github/workflows/docker-build-push.yml +++ b/.github/workflows/docker-build-push.yml @@ -1,7 +1,7 @@ name: Adliance.AzureBlobSimulator env: - VERSION: 1.0.0.${{ github.run_number }} + VERSION: 1.1.0.${{ github.run_number }} on: push: @@ -18,7 +18,7 @@ jobs: - name: 'Setup .NET' uses: actions/setup-dotnet@v3 with: - dotnet-version: '9.0.x' + dotnet-version: '10.0.x' - name: 'Run tests' run: dotnet test --configuration Release diff --git a/Adliance.AzureBlobSimulator.sln b/Adliance.AzureBlobSimulator.sln deleted file mode 100644 index 67acffc..0000000 --- a/Adliance.AzureBlobSimulator.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Adliance.AzureBlobSimulator", "src\Adliance.AzureBlobSimulator\Adliance.AzureBlobSimulator.csproj", "{94AF4640-39F3-45B0-80D7-B4E10746E63B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Adliance.AzureBlobSimulator.Tests", "test\Adliance.AzureBlobSimulator.Tests\Adliance.AzureBlobSimulator.Tests.csproj", "{38867EAF-A4C4-4C69-B14F-F9CBA07D812C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F3A9EDE3-F084-4676-9063-B0A5F8DF4685}" - ProjectSection(SolutionItems) = preProject - README.md = README.md - .gitignore = .gitignore - dockerfile = dockerfile - docker-build-push.yml = .github/workflows/docker-build-push.yml - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {94AF4640-39F3-45B0-80D7-B4E10746E63B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {94AF4640-39F3-45B0-80D7-B4E10746E63B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {94AF4640-39F3-45B0-80D7-B4E10746E63B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {94AF4640-39F3-45B0-80D7-B4E10746E63B}.Release|Any CPU.Build.0 = Release|Any CPU - {38867EAF-A4C4-4C69-B14F-F9CBA07D812C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {38867EAF-A4C4-4C69-B14F-F9CBA07D812C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {38867EAF-A4C4-4C69-B14F-F9CBA07D812C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {38867EAF-A4C4-4C69-B14F-F9CBA07D812C}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal diff --git a/Adliance.AzureBlobSimulator.slnx b/Adliance.AzureBlobSimulator.slnx new file mode 100644 index 0000000..81acc71 --- /dev/null +++ b/Adliance.AzureBlobSimulator.slnx @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/dockerfile b/dockerfile index 0206a44..33ca0b0 100644 --- a/dockerfile +++ b/dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build ARG VERSION=0.0.0.0 RUN dotnet tool install -g dotnet-setversion ENV PATH="${PATH}:/root/.dotnet/tools" @@ -7,7 +7,7 @@ WORKDIR /src/Adliance.AzureBlobSimulator RUN setversion $VERSION RUN dotnet publish "Adliance.AzureBlobSimulator.csproj" -c Release -o /app/publish -FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS final +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final EXPOSE 80 WORKDIR /app ENV ASPNETCORE_HTTP_PORTS=80 diff --git a/src/Adliance.AzureBlobSimulator/Adliance.AzureBlobSimulator.csproj b/src/Adliance.AzureBlobSimulator/Adliance.AzureBlobSimulator.csproj index c80a213..7c079b9 100644 --- a/src/Adliance.AzureBlobSimulator/Adliance.AzureBlobSimulator.csproj +++ b/src/Adliance.AzureBlobSimulator/Adliance.AzureBlobSimulator.csproj @@ -1,13 +1,10 @@ - - - net9.0 - enable - enable - - - - - - - + + net10.0 + enable + enable + + + + + \ No newline at end of file diff --git a/test/Adliance.AzureBlobSimulator.Tests/Adliance.AzureBlobSimulator.Tests.csproj b/test/Adliance.AzureBlobSimulator.Tests/Adliance.AzureBlobSimulator.Tests.csproj index 593a05a..6233bfc 100644 --- a/test/Adliance.AzureBlobSimulator.Tests/Adliance.AzureBlobSimulator.Tests.csproj +++ b/test/Adliance.AzureBlobSimulator.Tests/Adliance.AzureBlobSimulator.Tests.csproj @@ -1,35 +1,30 @@  - - net9.0 + net10.0 enable enable false - - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + \ No newline at end of file diff --git a/test/Adliance.AzureBlobSimulator.Tests/Controllers/BlobControllerTests.cs b/test/Adliance.AzureBlobSimulator.Tests/Controllers/BlobControllerTests.cs index 53dfa84..57bebdb 100644 --- a/test/Adliance.AzureBlobSimulator.Tests/Controllers/BlobControllerTests.cs +++ b/test/Adliance.AzureBlobSimulator.Tests/Controllers/BlobControllerTests.cs @@ -70,7 +70,6 @@ public async Task Can_Get_Properties_of_Blob() var containerPath = Path.Combine(TestStoragePath, containerName); Directory.CreateDirectory(containerPath); await File.WriteAllBytesAsync(Path.Combine(containerPath, blobName), "Hello World!"u8.ToArray()); - ; var containerClient = BlobServiceClient.GetBlobContainerClient(containerName); var blobClient = containerClient.GetBlobClient(blobName); diff --git a/test/Adliance.AzureBlobSimulator.Tests/Controllers/ContainersControllerTests.cs b/test/Adliance.AzureBlobSimulator.Tests/Controllers/ContainersControllerTests.cs index 26c82d6..be4c423 100644 --- a/test/Adliance.AzureBlobSimulator.Tests/Controllers/ContainersControllerTests.cs +++ b/test/Adliance.AzureBlobSimulator.Tests/Controllers/ContainersControllerTests.cs @@ -1,34 +1,72 @@ using Azure.Storage.Blobs.Models; using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Extensions.Configuration; namespace Adliance.AzureBlobSimulator.Tests.Controllers; public class ContainersControllerTests(WebApplicationFactory factory) : ControllerTestBase(factory) { [Fact] - public async Task Can_Get_List_of_Containers() + public async Task GetsContainerListSuccessfully() { - var containerNames = new[] + var containerNames = new Dictionary { - "container1", - "container2", - "test-container" + // + { "container1", "folder1" }, + { "container2", "folder2" }, + { "test-container", "test-folder" } }; - foreach (var containerName in containerNames) + foreach (var containerPath in containerNames.Values.Select(folder => Path.Combine(TestStoragePath, folder))) { - var containerPath = Path.Combine(TestStoragePath, containerName); Directory.CreateDirectory(containerPath); } + // create new factory to test different folder name and container name + var customFactory = Factory.WithWebHostBuilder(builder => + { + builder.ConfigureAppConfiguration((_, config) => + { + //overwrite existing config for LocalPath to prevent autodetection + var dict = new Dictionary + { + ["Storage:LocalPath"] = Path.Combine(TestStoragePath, "empty") + }; + + var i = 0; + foreach (var (name, folder) in containerNames) + { + dict[$"Storage:Containers:{i}:Name"] = name; + dict[$"Storage:Containers:{i}:LocalPath"] = Path.GetFullPath(Path.Combine(TestStoragePath, folder)); + i++; + } + + config.AddInMemoryCollection(dict); + }); + }); + + Directory.CreateDirectory(Path.Combine(TestStoragePath, "empty")); + + var options = new Azure.Storage.Blobs.BlobClientOptions + { + Transport = new Azure.Core.Pipeline.HttpClientTransport(customFactory.CreateClient()) + }; + var client = new Azure.Storage.Blobs.BlobServiceClient(new Uri("http://localhost"), new Azure.Storage.StorageSharedKeyCredential(StorageAccountName, StorageAccountKey), options); + var containers = new List(); - await foreach (var container in BlobServiceClient.GetBlobContainersAsync()) containers.Add(container); + await foreach (var container in client.GetBlobContainersAsync()) + { + containers.Add(container); + } Assert.NotEmpty(containers); - Assert.Equal(2 + containerNames.Length, containers.Count); + Assert.Equal(2 + containerNames.Count, containers.Count); Assert.Contains(containers, c => c.Name == "$logs"); Assert.Contains(containers, c => c.Name == "$blobchangefeed"); - foreach (var containerName in containerNames) Assert.Contains(containers, c => c.Name == containerName); + foreach (var (name, _) in containerNames) + { + Assert.Contains(containers, c => c.Name == name); + } } [Fact] diff --git a/test/Adliance.AzureBlobSimulator.Tests/SharedAccessSignature/SasAuthenticationMiddlewareTests.cs b/test/Adliance.AzureBlobSimulator.Tests/SharedAccessSignature/SasAuthenticationMiddlewareTests.cs index 56d2b2f..e474ca6 100644 --- a/test/Adliance.AzureBlobSimulator.Tests/SharedAccessSignature/SasAuthenticationMiddlewareTests.cs +++ b/test/Adliance.AzureBlobSimulator.Tests/SharedAccessSignature/SasAuthenticationMiddlewareTests.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; namespace Adliance.AzureBlobSimulator.Tests.SharedAccessSignature; @@ -20,41 +21,47 @@ public class SasAuthenticationMiddlewareTests public SasAuthenticationMiddlewareTests() { - var builder = new WebHostBuilder() - .ConfigureServices(services => + var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - services.Configure(options => - { - options.Accounts = - [ - new StorageAccountOptions + webBuilder + .UseTestServer() + .ConfigureServices(services => + { + services.Configure(options => { - Name = "testaccount", - Key = Convert.ToBase64String( - Encoding.UTF8.GetBytes("1234567890123456")) - } - ]; - }); - - services.AddSingleton(); - }) - .Configure(app => - { - app.UseMiddleware(); + options.Accounts = + [ + new StorageAccountOptions + { + Name = "testaccount", + Key = Convert.ToBase64String( + Encoding.UTF8.GetBytes("1234567890123456")) + } + ]; + }); + + services.AddSingleton(); + }) + .Configure(app => + { + app.UseMiddleware(); - app.Run(context => - { - context.Response.StatusCode = 200; - return Task.CompletedTask; - }); - }); + app.Run(context => + { + context.Response.StatusCode = 200; + return Task.CompletedTask; + }); + }); + }) + .Start(); - var server = new TestServer(builder); - _client = server.CreateClient(); + _client = host.GetTestClient(); + var options = host.Services.GetRequiredService>(); var env = new TestHostEnvironment(); - var options = server.Services.GetRequiredService>(); var validator = new SasValidatorService(options, null, env); + _sasHelper = new SasHelper(options, validator); }