From 8bd142f12d11843301719aabecba8a40c19180f8 Mon Sep 17 00:00:00 2001 From: Hideki Saito Date: Sun, 24 Aug 2025 23:22:21 -0700 Subject: [PATCH 1/5] Update README.md to reflect .NET 8.0 support and enhance project structure details --- README.md | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 36615f4..aa956d3 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,19 @@ # My Number Library for .NET -This repository provides tools for validating and generating Japanese My Number (Social Security and Tax Number System) in .NET. +This repository provides tools for validating and generating Japanese My Number (Social Security and Tax Number System) in .NET 8.0. + +## Project Structure + +- **MyNumberNET/**: Core .NET 8.0 library for My Number validation and generation. +- **MyNumberNET_CLI/**: Command-line interface for interacting with the library. Uses NLog for logging. +- **MyNumberNET_Test/**: Unit tests for the library. +- **Dockerfile**: Containerization support for CLI or library usage. +- **Jenkinsfile**: CI/CD pipeline configuration. ## Projects ### MyNumberNET -A .NET library for validating and generating My Number sequences. +A .NET 8.0 library for validating and generating My Number sequences. **Features:** - Validate a 12-digit My Number: `MyNumber.VerifyNumber(int[] number)` @@ -20,12 +28,16 @@ bool isValid = MyNumber.VerifyNumber(number); ``` ### MyNumberNET_CLI -A command-line interface for validating and generating My Numbers. +A command-line interface for validating and generating My Numbers. Uses NLog for logging. **Usage:** ``` dotnet run --project MyNumberNET_CLI [command] [arguments] ``` +Or run the built executable directly: +``` +MyNumberNET_CLI\bin\Debug\net8.0\MyNumberNET_CLI.exe [command] [arguments] +``` **Commands:** - `generate [count]` : Generate valid My Numbers - `check [My Number]` : Validate a given number @@ -48,13 +60,22 @@ dotnet test MyNumberNET_Test ``` dotnet build MyNumberNET.sln ``` -3. Run CLI or tests as shown above. -## .NET Version -All projects now target **.NET 8 (net8.0)**. You need the [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) to build and run. +## Docker Support + +To build and run the CLI in a container: +``` +docker build -t mynumbernet-cli . +docker run --rm mynumbernet-cli [command] [arguments] +``` + +## CI/CD + +Automated builds and tests are configured via Jenkinsfile. -## Logging -The CLI uses **NLog** for logging. Configuration is in `MyNumberNET_CLI/nlog.config`. +## Requirements +- .NET 8.0 SDK +- (Optional) Docker for containerization ## License See LICENSE for details. From 44b40c66258df1fc4d78e93e58fa201ddefdbe50 Mon Sep 17 00:00:00 2001 From: Hideki Saito Date: Sun, 24 Aug 2025 23:25:20 -0700 Subject: [PATCH 2/5] Deprecating Dockerfile (as it wasn't serving much) --- Dockerfile | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index a714b91..0000000 --- a/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -# https://hub.docker.com/_/microsoft-dotnet-core -FROM mcr.microsoft.com/dotnet/core/sdk:latest AS build -WORKDIR /source - -# copy csproj and restore as distinct layers -COPY . . - -WORKDIR /source -RUN dotnet build -RUN dotnet test From 411c5d902e4f5e588ae7cc6ef82e3022f98faeb4 Mon Sep 17 00:00:00 2001 From: Hideki Saito Date: Sun, 24 Aug 2025 23:39:55 -0700 Subject: [PATCH 3/5] Add MyNumberController with verification and check digit endpoints; include unit tests --- .../Controllers/MyNumberController.cs | 51 ++++++++++++++++ .../MyNumberNET_ApiServer.csproj | 12 ++++ MyNumberNET_ApiServer/Program.cs | 25 ++++++++ MyNumberNET_Test/MyNumberControllerTests.cs | 61 +++++++++++++++++++ MyNumberNET_Test/MyNumberNET_Test.csproj | 3 + 5 files changed, 152 insertions(+) create mode 100644 MyNumberNET_ApiServer/Controllers/MyNumberController.cs create mode 100644 MyNumberNET_ApiServer/MyNumberNET_ApiServer.csproj create mode 100644 MyNumberNET_ApiServer/Program.cs create mode 100644 MyNumberNET_Test/MyNumberControllerTests.cs diff --git a/MyNumberNET_ApiServer/Controllers/MyNumberController.cs b/MyNumberNET_ApiServer/Controllers/MyNumberController.cs new file mode 100644 index 0000000..1f88367 --- /dev/null +++ b/MyNumberNET_ApiServer/Controllers/MyNumberController.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNetCore.Mvc; +using MyNumberNET; + +namespace MyNumberNET_ApiServer.Controllers +{ + /// + /// Controller for exposing MyNumberNET functionality via REST API. + /// + [ApiController] + [Route("api/[controller]")] + public class MyNumberController : ControllerBase + { + /// + /// Verifies if the provided 12-digit array is a valid "My Number". + /// + /// An array of 12 integers representing the My Number digits. + /// True if valid, false otherwise. Returns BadRequest if input is malformed. + [HttpPost("verify")] + public ActionResult Verify([FromBody] int[] number) + { + try + { + bool isValid = MyNumber.VerifyNumber(number); + return Ok(isValid); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } + + /// + /// Calculates the check digit for the provided 11-digit array. + /// + /// An array of 11 integers representing the first 11 digits of My Number. + /// The calculated check digit. Returns BadRequest if input is malformed. + [HttpPost("checkdigit")] + public ActionResult CheckDigit([FromBody] int[] number) + { + try + { + int checkDigit = MyNumber.CalculateCheckDigits(number); + return Ok(checkDigit); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } + } +} diff --git a/MyNumberNET_ApiServer/MyNumberNET_ApiServer.csproj b/MyNumberNET_ApiServer/MyNumberNET_ApiServer.csproj new file mode 100644 index 0000000..f8ef484 --- /dev/null +++ b/MyNumberNET_ApiServer/MyNumberNET_ApiServer.csproj @@ -0,0 +1,12 @@ + + + net8.0 + enable + enable + true + 1591 + + + + + diff --git a/MyNumberNET_ApiServer/Program.cs b/MyNumberNET_ApiServer/Program.cs new file mode 100644 index 0000000..e633767 --- /dev/null +++ b/MyNumberNET_ApiServer/Program.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace MyNumberNET_ApiServer +{ + public class Program + { + public static void Main(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + builder.Services.AddControllers(); + + var app = builder.Build(); + + app.UseRouting(); + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + + app.Run(); + } + } +} diff --git a/MyNumberNET_Test/MyNumberControllerTests.cs b/MyNumberNET_Test/MyNumberControllerTests.cs new file mode 100644 index 0000000..823f28e --- /dev/null +++ b/MyNumberNET_Test/MyNumberControllerTests.cs @@ -0,0 +1,61 @@ +using Xunit; +using MyNumberNET_ApiServer.Controllers; +using Microsoft.AspNetCore.Mvc; + +namespace MyNumberNET_Test +{ + public class MyNumberControllerTests + { + [Fact] + public void Verify_ValidNumber_ReturnsTrue() + { + var controller = new MyNumberController(); + var validNumber = new int[] { 1,2,3,4,5,6,7,8,9,0,1,2 }; // Replace with a truly valid number if needed + var result = controller.Verify(validNumber); + Assert.IsType(result.Result); + var okResult = result.Result as OkObjectResult; + Assert.True((bool)okResult.Value); + } + + [Fact] + public void Verify_InvalidNumber_ReturnsFalse() + { + var controller = new MyNumberController(); + var invalidNumber = new int[] { 1,2,3,4,5,6,7,8,9,0,1,3 }; // Last digit is wrong + var result = controller.Verify(invalidNumber); + Assert.IsType(result.Result); + var okResult = result.Result as OkObjectResult; + Assert.False((bool)okResult.Value); + } + + [Fact] + public void Verify_MalformedNumber_ReturnsBadRequest() + { + var controller = new MyNumberController(); + var malformedNumber = new int[] { 1,2,3 }; // Too short + var result = controller.Verify(malformedNumber); + Assert.IsType(result.Result); + } + + [Fact] + public void CheckDigit_ValidInput_ReturnsDigit() + { + var controller = new MyNumberController(); + var digits = new int[] { 1,2,3,4,5,6,7,8,9,0,1 }; // Replace with valid digits if needed + var result = controller.CheckDigit(digits); + Assert.IsType(result.Result); + var okResult = result.Result as OkObjectResult; + Assert.True(int.TryParse(okResult.Value.ToString(), out _)); + } + + [Fact] + public void CheckDigit_MalformedInput_ReturnsBadRequest() + { + var controller = new MyNumberController(); + var malformedDigits = new int[] { 1,2,3 }; // Too short + var result = controller.CheckDigit(malformedDigits); + Assert.IsType(result.Result); + } + } +} + diff --git a/MyNumberNET_Test/MyNumberNET_Test.csproj b/MyNumberNET_Test/MyNumberNET_Test.csproj index f95d818..066552b 100644 --- a/MyNumberNET_Test/MyNumberNET_Test.csproj +++ b/MyNumberNET_Test/MyNumberNET_Test.csproj @@ -20,9 +20,12 @@ + + + true From 43faf156b6e3f7bc7e68af2650986acce4c4ba8b Mon Sep 17 00:00:00 2001 From: Hideki Saito Date: Sun, 24 Aug 2025 23:41:36 -0700 Subject: [PATCH 4/5] Refactor MyNumberControllerTests to improve validation checks and assertions --- MyNumberNET_Test/MyNumberControllerTests.cs | 33 ++++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/MyNumberNET_Test/MyNumberControllerTests.cs b/MyNumberNET_Test/MyNumberControllerTests.cs index 823f28e..57372ff 100644 --- a/MyNumberNET_Test/MyNumberControllerTests.cs +++ b/MyNumberNET_Test/MyNumberControllerTests.cs @@ -1,3 +1,4 @@ +using System; using Xunit; using MyNumberNET_ApiServer.Controllers; using Microsoft.AspNetCore.Mvc; @@ -10,10 +11,15 @@ public class MyNumberControllerTests public void Verify_ValidNumber_ReturnsTrue() { var controller = new MyNumberController(); - var validNumber = new int[] { 1,2,3,4,5,6,7,8,9,0,1,2 }; // Replace with a truly valid number if needed + var first11 = new[] { 1,2,3,4,5,6,7,8,9,0,1 }; + var checkDigit = MyNumberNET.MyNumber.CalculateCheckDigits((int[])first11.Clone()); + var validNumber = new int[12]; + Array.Copy(first11, validNumber, 11); + validNumber[11] = checkDigit; var result = controller.Verify(validNumber); - Assert.IsType(result.Result); + Assert.NotNull(result.Result); var okResult = result.Result as OkObjectResult; + Assert.NotNull(okResult); Assert.True((bool)okResult.Value); } @@ -21,10 +27,11 @@ public void Verify_ValidNumber_ReturnsTrue() public void Verify_InvalidNumber_ReturnsFalse() { var controller = new MyNumberController(); - var invalidNumber = new int[] { 1,2,3,4,5,6,7,8,9,0,1,3 }; // Last digit is wrong + var invalidNumber = new[] { 1,2,3,4,5,6,7,8,9,0,1,3 }; // Last digit is wrong var result = controller.Verify(invalidNumber); - Assert.IsType(result.Result); + Assert.NotNull(result.Result); var okResult = result.Result as OkObjectResult; + Assert.NotNull(okResult); Assert.False((bool)okResult.Value); } @@ -32,19 +39,22 @@ public void Verify_InvalidNumber_ReturnsFalse() public void Verify_MalformedNumber_ReturnsBadRequest() { var controller = new MyNumberController(); - var malformedNumber = new int[] { 1,2,3 }; // Too short + var malformedNumber = new[] { 1,2,3 }; // Too short var result = controller.Verify(malformedNumber); - Assert.IsType(result.Result); + Assert.NotNull(result.Result); + var badRequestResult = result.Result as BadRequestObjectResult; + Assert.NotNull(badRequestResult); } [Fact] public void CheckDigit_ValidInput_ReturnsDigit() { var controller = new MyNumberController(); - var digits = new int[] { 1,2,3,4,5,6,7,8,9,0,1 }; // Replace with valid digits if needed + var digits = new[] { 1,2,3,4,5,6,7,8,9,0,1 }; var result = controller.CheckDigit(digits); - Assert.IsType(result.Result); + Assert.NotNull(result.Result); var okResult = result.Result as OkObjectResult; + Assert.NotNull(okResult); Assert.True(int.TryParse(okResult.Value.ToString(), out _)); } @@ -52,10 +62,11 @@ public void CheckDigit_ValidInput_ReturnsDigit() public void CheckDigit_MalformedInput_ReturnsBadRequest() { var controller = new MyNumberController(); - var malformedDigits = new int[] { 1,2,3 }; // Too short + var malformedDigits = new[] { 1,2,3 }; // Too short var result = controller.CheckDigit(malformedDigits); - Assert.IsType(result.Result); + Assert.NotNull(result.Result); + var badRequestResult = result.Result as BadRequestObjectResult; + Assert.NotNull(badRequestResult); } } } - From cb25192a71d802aaec08b12a457d7d38b9062de6 Mon Sep 17 00:00:00 2001 From: Hideki Saito Date: Sun, 24 Aug 2025 23:42:35 -0700 Subject: [PATCH 5/5] Update README.md to include MyNumberNET_ApiServer details and enhance project structure --- README.md | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index aa956d3..909ca1c 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,12 @@ This repository provides tools for validating and generating Japanese My Number ## Project Structure - **MyNumberNET/**: Core .NET 8.0 library for My Number validation and generation. +- **MyNumberNET_ApiServer/**: ASP.NET Core Web API for My Number validation and generation. - **MyNumberNET_CLI/**: Command-line interface for interacting with the library. Uses NLog for logging. -- **MyNumberNET_Test/**: Unit tests for the library. -- **Dockerfile**: Containerization support for CLI or library usage. +- **MyNumberNET_Test/**: Unit tests for the library and API server. - **Jenkinsfile**: CI/CD pipeline configuration. +- **global.json**: Specifies the .NET SDK version. +- **MyNumberNET.sln**: Solution file for managing all projects. ## Projects @@ -27,6 +29,15 @@ int[] number = {6,1,4,1,0,6,5,2,6,0,0,0}; bool isValid = MyNumber.VerifyNumber(number); ``` +### MyNumberNET_ApiServer +ASP.NET Core Web API for validating and generating My Numbers. + +**Usage:** +``` +dotnet run --project MyNumberNET_ApiServer +``` +The API exposes endpoints for validation and generation. See `Controllers/MyNumberController.cs` for details. + ### MyNumberNET_CLI A command-line interface for validating and generating My Numbers. Uses NLog for logging. @@ -46,36 +57,20 @@ MyNumberNET_CLI\bin\Debug\net8.0\MyNumberNET_CLI.exe [command] [arguments] - `ranges [min] [max]` : Generate numbers in a sequential range ### MyNumberNET_Test -Unit tests for the library. +Unit tests for the library and API server. -**To run tests:** +**Run tests:** ``` dotnet test MyNumberNET_Test ``` -## Build Instructions +## Solution Management -1. Clone the repository. -2. Build the solution: - ``` - dotnet build MyNumberNET.sln - ``` - -## Docker Support - -To build and run the CLI in a container: +Use the solution file to build and manage all projects: ``` -docker build -t mynumbernet-cli . -docker run --rm mynumbernet-cli [command] [arguments] +dotnet build MyNumberNET.sln ``` -## CI/CD - -Automated builds and tests are configured via Jenkinsfile. - -## Requirements -- .NET 8.0 SDK -- (Optional) Docker for containerization +## .NET Version -## License -See LICENSE for details. +This repository uses .NET 8.0. The required SDK version is specified in `global.json`.