| @@ -0,0 +1,12 @@ | |||
| { | |||
| "Version": 1, | |||
| "WorkspaceRootPath": "C:\\Users\\christophe_brachet\\Desktop\\TestApiDocker\\", | |||
| "Documents": [], | |||
| "DocumentGroupContainers": [ | |||
| { | |||
| "Orientation": 0, | |||
| "VerticalTabListWidth": 256, | |||
| "DocumentGroups": [] | |||
| } | |||
| ] | |||
| } | |||
| @@ -0,0 +1,54 @@ | |||
| { | |||
| "Version": 1, | |||
| "WorkspaceRootPath": "C:\\Users\\christophe_brachet\\Desktop\\TestApiDocker\\", | |||
| "Documents": [ | |||
| { | |||
| "AbsoluteMoniker": "D:0:0:{9EA9D523-C331-4E33-8204-B4024392D267}|TestApiDocker\\TestApiDocker.csproj|c:\\users\\christophe_brachet\\desktop\\testapidocker\\testapidocker\\myunittest.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", | |||
| "RelativeMoniker": "D:0:0:{9EA9D523-C331-4E33-8204-B4024392D267}|TestApiDocker\\TestApiDocker.csproj|solutionrelative:testapidocker\\myunittest.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" | |||
| }, | |||
| { | |||
| "AbsoluteMoniker": "D:0:0:{9EA9D523-C331-4E33-8204-B4024392D267}|TestApiDocker\\TestApiDocker.csproj|c:\\users\\christophe_brachet\\desktop\\testapidocker\\testapidocker\\models\\weatherforecast.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", | |||
| "RelativeMoniker": "D:0:0:{9EA9D523-C331-4E33-8204-B4024392D267}|TestApiDocker\\TestApiDocker.csproj|solutionrelative:testapidocker\\models\\weatherforecast.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" | |||
| } | |||
| ], | |||
| "DocumentGroupContainers": [ | |||
| { | |||
| "Orientation": 0, | |||
| "VerticalTabListWidth": 256, | |||
| "DocumentGroups": [ | |||
| { | |||
| "DockedWidth": 200, | |||
| "SelectedChildIndex": 1, | |||
| "Children": [ | |||
| { | |||
| "$type": "Document", | |||
| "DocumentIndex": 1, | |||
| "Title": "WeatherForecast.cs", | |||
| "DocumentMoniker": "C:\\Users\\christophe_brachet\\Desktop\\TestApiDocker\\TestApiDocker\\Models\\WeatherForecast.cs", | |||
| "RelativeDocumentMoniker": "TestApiDocker\\Models\\WeatherForecast.cs", | |||
| "ToolTip": "C:\\Users\\christophe_brachet\\Desktop\\TestApiDocker\\TestApiDocker\\Models\\WeatherForecast.cs", | |||
| "RelativeToolTip": "TestApiDocker\\Models\\WeatherForecast.cs", | |||
| "ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAAkAAAAAAAAAA==", | |||
| "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", | |||
| "WhenOpened": "2024-08-26T21:34:59.064Z", | |||
| "EditorCaption": "" | |||
| }, | |||
| { | |||
| "$type": "Document", | |||
| "DocumentIndex": 0, | |||
| "Title": "MyUnitTest.cs", | |||
| "DocumentMoniker": "C:\\Users\\christophe_brachet\\Desktop\\TestApiDocker\\TestApiDocker\\MyUnitTest.cs", | |||
| "RelativeDocumentMoniker": "TestApiDocker\\MyUnitTest.cs", | |||
| "ToolTip": "C:\\Users\\christophe_brachet\\Desktop\\TestApiDocker\\TestApiDocker\\MyUnitTest.cs", | |||
| "RelativeToolTip": "TestApiDocker\\MyUnitTest.cs", | |||
| "ViewState": "AgIAAAkAAAAAAAAAAAAAAB4AAAALAAAAAAAAAA==", | |||
| "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", | |||
| "WhenOpened": "2024-08-26T21:21:10.154Z", | |||
| "EditorCaption": "" | |||
| } | |||
| ] | |||
| } | |||
| ] | |||
| } | |||
| ] | |||
| } | |||
| @@ -0,0 +1,25 @@ | |||
| | |||
| Microsoft Visual Studio Solution File, Format Version 12.00 | |||
| # Visual Studio Version 17 | |||
| VisualStudioVersion = 17.11.35208.52 | |||
| MinimumVisualStudioVersion = 10.0.40219.1 | |||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApiDocker", "TestApiDocker\TestApiDocker.csproj", "{9EA9D523-C331-4E33-8204-B4024392D267}" | |||
| EndProject | |||
| Global | |||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
| Debug|Any CPU = Debug|Any CPU | |||
| Release|Any CPU = Release|Any CPU | |||
| EndGlobalSection | |||
| GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||
| {9EA9D523-C331-4E33-8204-B4024392D267}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
| {9EA9D523-C331-4E33-8204-B4024392D267}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
| {9EA9D523-C331-4E33-8204-B4024392D267}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
| {9EA9D523-C331-4E33-8204-B4024392D267}.Release|Any CPU.Build.0 = Release|Any CPU | |||
| EndGlobalSection | |||
| GlobalSection(SolutionProperties) = preSolution | |||
| HideSolutionNode = FALSE | |||
| EndGlobalSection | |||
| GlobalSection(ExtensibilityGlobals) = postSolution | |||
| SolutionGuid = {90F8E6B7-23C2-4D64-AA1A-21BA19F95C47} | |||
| EndGlobalSection | |||
| EndGlobal | |||
| @@ -0,0 +1,16 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace TestApiDocker.Models | |||
| { | |||
| public class WeatherForecast | |||
| { | |||
| public DateOnly Date { get; set; } | |||
| public int TemperatureC { get; set; } | |||
| public string? Summary { get; set; } | |||
| } | |||
| } | |||
| @@ -0,0 +1,53 @@ | |||
| using DotNet.Testcontainers.Builders; | |||
| using DotNet.Testcontainers.Containers; | |||
| using DotNet.Testcontainers.Images; | |||
| using System.Net.Http.Json; | |||
| using TestApiDocker.Models; | |||
| namespace TestApiDocker | |||
| { | |||
| [TestClass] | |||
| public class MyUnitTest | |||
| { | |||
| private static readonly IContainer _container = new ContainerBuilder() | |||
| .WithImage("ecolocale/my-api:latest") | |||
| .WithPortBinding(9090, 9090) | |||
| .WithCleanUp(true) | |||
| .Build(); | |||
| [TestInitialize] | |||
| public async Task StartContainer() | |||
| { | |||
| await _container.StartAsync(); | |||
| } | |||
| [TestMethod] | |||
| public async Task ShouldReturnWeatherForecast() | |||
| { | |||
| //Laisser le temps de démarrer que le container se charge | |||
| await Task.Delay(1000); | |||
| HttpClient httpClient = new HttpClient(); | |||
| Uri requestUri = | |||
| new UriBuilder( | |||
| Uri.UriSchemeHttp, | |||
| _container.Hostname, | |||
| _container.GetMappedPublicPort(9090), | |||
| "WeatherForecast" | |||
| ).Uri; | |||
| List<WeatherForecast> weatherForecasts = await httpClient.GetFromJsonAsync<List<WeatherForecast>>(requestUri); | |||
| Assert.AreEqual(5, weatherForecasts.Count()); | |||
| } | |||
| [TestCleanup] | |||
| public async Task DisposeContainer() | |||
| { | |||
| await _container.StopAsync(); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,24 @@ | |||
| <Project Sdk="Microsoft.NET.Sdk"> | |||
| <PropertyGroup> | |||
| <TargetFramework>net8.0</TargetFramework> | |||
| <ImplicitUsings>enable</ImplicitUsings> | |||
| <Nullable>enable</Nullable> | |||
| <IsPackable>false</IsPackable> | |||
| <IsTestProject>true</IsTestProject> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <PackageReference Include="coverlet.collector" Version="6.0.0" /> | |||
| <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" /> | |||
| <PackageReference Include="MSTest.TestAdapter" Version="3.1.1" /> | |||
| <PackageReference Include="MSTest.TestFramework" Version="3.1.1" /> | |||
| <PackageReference Include="Testcontainers" Version="3.9.0" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" /> | |||
| </ItemGroup> | |||
| </Project> | |||
| @@ -0,0 +1,16 @@ | |||
| FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base | |||
| WORKDIR /app | |||
| EXPOSE 9090 | |||
| FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build | |||
| WORKDIR /src | |||
| COPY ["docker-dotnetcore-api.csproj", "."] | |||
| RUN dotnet restore "./docker-dotnetcore-api.csproj" | |||
| COPY . . | |||
| WORKDIR "/src/." | |||
| RUN dotnet build "docker-dotnetcore-api.csproj" -c Release -o /app/build | |||
| FROM build AS publish | |||
| RUN dotnet publish "docker-dotnetcore-api.csproj" -c Release -o /app/publish | |||
| FROM base AS final | |||
| WORKDIR /app | |||
| COPY --from=publish /app/publish . | |||
| ENTRYPOINT ["dotnet", "docker-dotnetcore-api.dll"] | |||
| @@ -0,0 +1,44 @@ | |||
| var builder = WebApplication.CreateBuilder(args); | |||
| builder.WebHost.UseUrls("http://0.0.0.0:9090"); | |||
| // Add services to the container. | |||
| // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | |||
| builder.Services.AddEndpointsApiExplorer(); | |||
| builder.Services.AddSwaggerGen(); | |||
| var app = builder.Build(); | |||
| // Configure the HTTP request pipeline. | |||
| if (app.Environment.IsDevelopment()) | |||
| { | |||
| app.UseSwagger(); | |||
| app.UseSwaggerUI(); | |||
| } | |||
| app.UseHttpsRedirection(); | |||
| var summaries = new[] | |||
| { | |||
| "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" | |||
| }; | |||
| app.MapGet("/weatherforecast", () => | |||
| { | |||
| var forecast = Enumerable.Range(1, 5).Select(index => | |||
| new WeatherForecast | |||
| ( | |||
| DateOnly.FromDateTime(DateTime.Now.AddDays(index)), | |||
| Random.Shared.Next(-20, 55), | |||
| summaries[Random.Shared.Next(summaries.Length)] | |||
| )) | |||
| .ToArray(); | |||
| return forecast; | |||
| }) | |||
| .WithName("GetWeatherForecast") | |||
| .WithOpenApi(); | |||
| app.Run(); | |||
| record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) | |||
| { | |||
| public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); | |||
| } | |||
| @@ -0,0 +1,41 @@ | |||
| { | |||
| "$schema": "http://json.schemastore.org/launchsettings.json", | |||
| "iisSettings": { | |||
| "windowsAuthentication": false, | |||
| "anonymousAuthentication": true, | |||
| "iisExpress": { | |||
| "applicationUrl": "http://localhost:40366", | |||
| "sslPort": 44378 | |||
| } | |||
| }, | |||
| "profiles": { | |||
| "http": { | |||
| "commandName": "Project", | |||
| "dotnetRunMessages": true, | |||
| "launchBrowser": true, | |||
| "launchUrl": "swagger", | |||
| "applicationUrl": "http://localhost:5281", | |||
| "environmentVariables": { | |||
| "ASPNETCORE_ENVIRONMENT": "Development" | |||
| } | |||
| }, | |||
| "https": { | |||
| "commandName": "Project", | |||
| "dotnetRunMessages": true, | |||
| "launchBrowser": true, | |||
| "launchUrl": "swagger", | |||
| "applicationUrl": "https://localhost:7047;http://localhost:5281", | |||
| "environmentVariables": { | |||
| "ASPNETCORE_ENVIRONMENT": "Development" | |||
| } | |||
| }, | |||
| "IIS Express": { | |||
| "commandName": "IISExpress", | |||
| "launchBrowser": true, | |||
| "launchUrl": "swagger", | |||
| "environmentVariables": { | |||
| "ASPNETCORE_ENVIRONMENT": "Development" | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| { | |||
| "Logging": { | |||
| "LogLevel": { | |||
| "Default": "Information", | |||
| "Microsoft.AspNetCore": "Warning" | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,9 @@ | |||
| { | |||
| "Logging": { | |||
| "LogLevel": { | |||
| "Default": "Information", | |||
| "Microsoft.AspNetCore": "Warning" | |||
| } | |||
| }, | |||
| "AllowedHosts": "*" | |||
| } | |||
| @@ -0,0 +1,15 @@ | |||
| <Project Sdk="Microsoft.NET.Sdk.Web"> | |||
| <PropertyGroup> | |||
| <TargetFramework>net8.0</TargetFramework> | |||
| <Nullable>enable</Nullable> | |||
| <ImplicitUsings>enable</ImplicitUsings> | |||
| <RootNamespace>docker_dotnetcore_api</RootNamespace> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.8" /> | |||
| <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> | |||
| </ItemGroup> | |||
| </Project> | |||
| @@ -0,0 +1,6 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||
| <PropertyGroup> | |||
| <ActiveDebugProfile>https</ActiveDebugProfile> | |||
| </PropertyGroup> | |||
| </Project> | |||
| @@ -0,0 +1,6 @@ | |||
| @docker_dotnetcore_api_HostAddress = http://localhost:5281 | |||
| GET {{docker_dotnetcore_api_HostAddress}}/weatherforecast/ | |||
| Accept: application/json | |||
| ### | |||