diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..26eb1a9 --- /dev/null +++ b/build.bat @@ -0,0 +1,28 @@ +@echo off +setlocal + +set IMAGE=namdh861/mws-backend +set CONTAINER=mws-backend +set PORT=2000 + +echo [1/3] Building Docker image... +docker build -t %IMAGE% . + +if errorlevel 1 ( + echo Build failed. + exit /b 1 +) + +echo [2/3] Stopping old container (if any)... +docker rm -f %CONTAINER% >nul 2>&1 + +echo [3/3] Running container on port %PORT% with restart=always... +docker run -d --name %CONTAINER% --restart always -p %PORT%:8080 %IMAGE% + +if errorlevel 1 ( + echo Run failed. + exit /b 1 +) + +echo Done. App running at http://localhost:%PORT% +endlocal diff --git a/mws.backend.dotnet.sln b/mws.backend.dotnet.sln index 2cc69c7..ea676e5 100644 --- a/mws.backend.dotnet.sln +++ b/mws.backend.dotnet.sln @@ -8,8 +8,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "domain", "domain\domain.csp EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "infrastructure", "infrastructure\infrastructure.csproj", "{FEFFBC10-B99E-4A56-9F32-6D925D192606}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tests", "tests\tests.csproj", "{F69F8389-492D-4227-A6EC-2F41FC7FEBBE}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -68,18 +66,6 @@ Global {FEFFBC10-B99E-4A56-9F32-6D925D192606}.Release|x64.Build.0 = Release|Any CPU {FEFFBC10-B99E-4A56-9F32-6D925D192606}.Release|x86.ActiveCfg = Release|Any CPU {FEFFBC10-B99E-4A56-9F32-6D925D192606}.Release|x86.Build.0 = Release|Any CPU - {F69F8389-492D-4227-A6EC-2F41FC7FEBBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F69F8389-492D-4227-A6EC-2F41FC7FEBBE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F69F8389-492D-4227-A6EC-2F41FC7FEBBE}.Debug|x64.ActiveCfg = Debug|Any CPU - {F69F8389-492D-4227-A6EC-2F41FC7FEBBE}.Debug|x64.Build.0 = Debug|Any CPU - {F69F8389-492D-4227-A6EC-2F41FC7FEBBE}.Debug|x86.ActiveCfg = Debug|Any CPU - {F69F8389-492D-4227-A6EC-2F41FC7FEBBE}.Debug|x86.Build.0 = Debug|Any CPU - {F69F8389-492D-4227-A6EC-2F41FC7FEBBE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F69F8389-492D-4227-A6EC-2F41FC7FEBBE}.Release|Any CPU.Build.0 = Release|Any CPU - {F69F8389-492D-4227-A6EC-2F41FC7FEBBE}.Release|x64.ActiveCfg = Release|Any CPU - {F69F8389-492D-4227-A6EC-2F41FC7FEBBE}.Release|x64.Build.0 = Release|Any CPU - {F69F8389-492D-4227-A6EC-2F41FC7FEBBE}.Release|x86.ActiveCfg = Release|Any CPU - {F69F8389-492D-4227-A6EC-2F41FC7FEBBE}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tests/CloudFileDocumentContentStoreTests.cs b/tests/CloudFileDocumentContentStoreTests.cs deleted file mode 100644 index 415e5d9..0000000 --- a/tests/CloudFileDocumentContentStoreTests.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System.Net; -using System.Net.Http; -using Microsoft.Extensions.Logging; -using Moq; -using mws.backend.dotnet.infrastructure.CloudFile; - -namespace tests; - -public class CloudFileDocumentContentStoreTests -{ - private readonly Mock _cfMock = new(); - private readonly Mock> _loggerMock = new(); - private readonly CloudFileDocumentContentStore _sut; - - public CloudFileDocumentContentStoreTests() - { - _sut = new CloudFileDocumentContentStore(_cfMock.Object, _loggerMock.Object); - } - - [Fact] - public async Task EnsureBucketAsync_CallsCorrectBucket() - { - var projectId = Guid.NewGuid(); - - await _sut.EnsureBucketAsync(projectId, CancellationToken.None); - - _cfMock.Verify(c => c.EnsureBucketAsync($"mws-p-{projectId:N}", It.IsAny()), Times.Once); - } - - [Fact] - public async Task UploadAsync_BuildsCorrectBucketAndKey() - { - var projectId = Guid.NewGuid(); - var documentId = Guid.NewGuid(); - using var stream = new MemoryStream(new byte[] { 1, 2, 3 }); - - await _sut.UploadAsync(projectId, documentId, "text/html; charset=utf-8", stream, CancellationToken.None); - - _cfMock.Verify(c => c.UploadAsync( - $"mws-p-{projectId:N}", - $"{documentId:N}.html", - "text/html; charset=utf-8", - It.IsAny(), - It.IsAny()), Times.Once); - } - - [Fact] - public async Task UploadAsync_ThrowsStorageUnavailableOnHttpRequestException() - { - var projectId = Guid.NewGuid(); - var documentId = Guid.NewGuid(); - using var stream = new MemoryStream(new byte[] { 1, 2, 3 }); - - _cfMock.Setup(c => c.UploadAsync( - It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), It.IsAny())) - .ThrowsAsync(new HttpRequestException("Connection refused")); - - var ex = await Assert.ThrowsAsync( - () => _sut.UploadAsync(projectId, documentId, "text/html", stream, CancellationToken.None)); - - Assert.Contains("Cloud file upload failed", ex.Message); - } - - [Fact] - public async Task DownloadAsync_ReturnsStreamNullOnNotFound() - { - var projectId = Guid.NewGuid(); - var documentId = Guid.NewGuid(); - - _cfMock.Setup(c => c.DownloadAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(Stream.Null); - - var result = await _sut.DownloadAsync(projectId, documentId, CancellationToken.None); - - Assert.Equal(Stream.Null, result); - } - - [Fact] - public async Task DownloadAsync_ThrowsStorageUnavailableOnHttpRequestException() - { - var projectId = Guid.NewGuid(); - var documentId = Guid.NewGuid(); - - _cfMock.Setup(c => c.DownloadAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .ThrowsAsync(new HttpRequestException("Connection refused")); - - await Assert.ThrowsAsync( - () => _sut.DownloadAsync(projectId, documentId, CancellationToken.None)); - } - - [Fact] - public async Task DeleteAsync_Swallows404Errors() - { - var projectId = Guid.NewGuid(); - var documentId = Guid.NewGuid(); - - // Should not throw - await _sut.DeleteAsync(projectId, documentId, CancellationToken.None); - - _cfMock.Verify(c => c.DeleteAsync( - $"mws-p-{projectId:N}", - $"{documentId:N}.html", - It.IsAny()), Times.Once); - } - - [Fact] - public async Task ExistsAsync_ReturnsTrueWhenFileExists() - { - var projectId = Guid.NewGuid(); - var documentId = Guid.NewGuid(); - - _cfMock.Setup(c => c.ExistsAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(true); - - var result = await _sut.ExistsAsync(projectId, documentId, CancellationToken.None); - - Assert.True(result); - } - - [Fact] - public async Task ExistsAsync_ReturnsFalseOnException() - { - var projectId = Guid.NewGuid(); - var documentId = Guid.NewGuid(); - - _cfMock.Setup(c => c.ExistsAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .ThrowsAsync(new HttpRequestException("Connection refused")); - - var result = await _sut.ExistsAsync(projectId, documentId, CancellationToken.None); - - Assert.False(result); - } -} diff --git a/tests/UnitTest1.cs b/tests/UnitTest1.cs deleted file mode 100644 index 3b98de5..0000000 --- a/tests/UnitTest1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace tests; - -public class UnitTest1 -{ - [Fact] - public void Test1() - { - - } -} diff --git a/tests/tests.csproj b/tests/tests.csproj deleted file mode 100644 index a2f4501..0000000 --- a/tests/tests.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - net10.0 - enable - enable - false - - - - - - - - - - - - - - - - - - - \ No newline at end of file