diff --git a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Gzip/GzipCommand.cs b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Gzip/GzipCommand.cs index da52405..dd54a22 100644 --- a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Gzip/GzipCommand.cs +++ b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Gzip/GzipCommand.cs @@ -3,12 +3,10 @@ using System.CommandLine.Parsing; using System.ComponentModel; using System.IO; -using System.IO.Compression; using System.Text; -using System.Text.Json; using System.Threading.Tasks; -namespace EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands +namespace EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands.Gzip { public class GzipCommand : Command { @@ -43,21 +41,21 @@ public GzipCommand() : base("binary", "Work with binary gunzipped data used in E private async Task Run(ParseResult parseResult, IConsole console) { - var (statusCode, output) = await ConstructString(Input, UnzipOption, ZipOption, PrettyPrintOption); + var (statusCode, output) = await GzipLogic.ConstructString(Input, UnzipOption, ZipOption, PrettyPrintOption); - if (statusCode != 0) + if (statusCode != 0 || OutputOption == null) { console.WriteLine(output); return statusCode; } - if (OutputOption == null) - { - console.WriteLine(output); + await WriteToFile(console, output); - return statusCode; - } + return statusCode; + } + private async Task WriteToFile(IConsole console, string output) + { if (OutputOption.Exists) console.WriteLine("Output exists and content will be overridden..."); @@ -71,64 +69,6 @@ private async Task Run(ParseResult parseResult, IConsole console) sourceStream.Close(); console.WriteLine($"Content written to {OutputOption.FullName}"); - - return statusCode; - } - public static async Task<(int, string)> ConstructString( - string input, - bool unzip = false, - bool zip = false, - bool prettyPrint = false) - { - if (string.IsNullOrWhiteSpace(input)) - { - throw new Exception("Cannot operate on empty input"); - } - - if (unzip) - { - var unzipped = await Unzip(input); - - if (!prettyPrint) return (0, unzipped); - - var prettified = await FormatJson(unzipped); - return (0, prettified); - } - - if (zip) - { - var zipped = await Zip(input); - return (0, zipped); - } - - return (127, "Command not found"); - } - - internal static async Task Unzip(string str) - { - var bytes = Convert.FromHexString(str[2..]); - using var tinyStream = - new StreamReader(new GZipStream(new MemoryStream(bytes), CompressionMode.Decompress)); - return await tinyStream.ReadToEndAsync(); - } - - internal static async Task Zip(string str) - { - using var memoryStream = new MemoryStream(); - await using var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress); - await using var writer = new StreamWriter(gZipStream, Encoding.UTF8); - await writer.WriteAsync(str); - await writer.FlushAsync(); - - var compressedBytes = memoryStream.ToArray(); - - return Convert.ToHexString(compressedBytes); - } - - internal static Task FormatJson(string str) - { - using var jDoc = JsonDocument.Parse(str); - return Task.FromResult(JsonSerializer.Serialize(jDoc, new JsonSerializerOptions { WriteIndented = true })); } } } diff --git a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Gzip/GzipLogic.cs b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Gzip/GzipLogic.cs index eb0612e..65c1c85 100644 --- a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Gzip/GzipLogic.cs +++ b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Gzip/GzipLogic.cs @@ -1,7 +1,72 @@ +using System; +using System.IO; +using System.IO.Compression; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; + namespace EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands.Gzip { public class GzipLogic { - + public static async Task<(int, string)> ConstructString( + string input, + bool unzip = false, + bool zip = false, + bool prettyPrint = false) + { + if (string.IsNullOrWhiteSpace(input)) + { + throw new Exception("Cannot operate on empty input"); + } + + if (unzip) + { + var unzipped = await Unzip(input); + + if (!prettyPrint) return (0, unzipped); + + var prettified = await FormatJson(unzipped); + return (0, prettified); + } + + if (zip) + { + var zipped = await Zip(input); + return (0, zipped); + } + + return (127, "Command not found"); + } + + internal static async Task Unzip(string str) + { + if (str.StartsWith("0x")) + str = str[2..]; + + var bytes = Convert.FromHexString(str); + using var tinyStream = + new StreamReader(new GZipStream(new MemoryStream(bytes), CompressionMode.Decompress)); + return await tinyStream.ReadToEndAsync(); + } + + internal static async Task Zip(string str) + { + using var memoryStream = new MemoryStream(); + await using var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress); + await using var writer = new StreamWriter(gZipStream, Encoding.UTF8); + await writer.WriteAsync(str); + await writer.FlushAsync(); + + var compressedBytes = memoryStream.ToArray(); + + return Convert.ToHexString(compressedBytes); + } + + internal static Task FormatJson(string str) + { + using var jDoc = JsonDocument.Parse(str); + return Task.FromResult(JsonSerializer.Serialize(jDoc, new JsonSerializerOptions { WriteIndented = true })); + } } } \ No newline at end of file diff --git a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/EAVFW.Extensions.Manifest.ManifestEnricherTool.csproj b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/EAVFW.Extensions.Manifest.ManifestEnricherTool.csproj index 6c14c32..3c92d6c 100644 --- a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/EAVFW.Extensions.Manifest.ManifestEnricherTool.csproj +++ b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/EAVFW.Extensions.Manifest.ManifestEnricherTool.csproj @@ -44,6 +44,6 @@ - + \ No newline at end of file diff --git a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Program.cs b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Program.cs index 8931999..d71f536 100644 --- a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Program.cs +++ b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Program.cs @@ -8,8 +8,8 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System.CommandLine; -using System.CommandLine.Parsing; using System.Threading.Tasks; +using EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands.Gzip; namespace EAVFW.Extensions.Manifest.ManifestEnricherTool { @@ -32,9 +32,9 @@ static IServiceCollection ConfigureServices(IServiceCollection serviceCollection serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddGPT(); - - + serviceCollection.AddHttpClient(); return serviceCollection; } diff --git a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Properties/launchSettings.json b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Properties/launchSettings.json index 68c72eb..aed73ed 100644 --- a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Properties/launchSettings.json +++ b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Properties/launchSettings.json @@ -2,7 +2,11 @@ "profiles": { "EAVFW.Extensions.Manifest.ManifestEnricherTool": { "commandName": "Project", - "workingDirectory": "C:\\dev\\hafnia\\loi", + "workingDirectory": "/Users/thyge/dev/playground", + "commandLineArgs": "binary --unzip 0x1F8B08000000000000139C51414EC33010FC8BAFD4C8719C36C9AD824BA50252E90D71D8D8EBC852EA147B73A8A2FE1D3B05CE153E8DAC99D99DD999812637FAC8DA993D0504C2FDDBEE19080EF83561A4178C117ADC2EAC4C72FE3C5106C3E8C28DC35A06CA182937C0D142C795EE2A5EA2042E6AD369B0AAAA9A82AD5840EDCE0E3DA5791FACA884EAACB45CDB3572D5E8861B5B36BFA235405DB3CFEB8A45029A9284BD4F5AA34193ACBAD15CEE1F6CC10D680E0831A7F0D3305C932F05D7F71896F0C71BCE90DC0993B514B2E485E0853C8A4DAB8A56C9C7B2484B370F42B442FC2D31B394C8D1E51516DD1E89308CD67983279FFE7FAA8CB702C66076E6FECD4DBA451EF1AFEAF2FB060000FFFF" +// "commandLineArgs": "binary --unzip --pretty-print 0x1F8B08000000000000139C51414EC33010FC8BAFD4C8719C36C9AD824BA50252E90D71D8D8EBC852EA147B73A8A2FE1D3B05CE153E8DAC99D99DD999812637FAC8DA993D0504C2FDDBEE19080EF83561A4178C117ADC2EAC4C72FE3C5106C3E8C28DC35A06CA182937C0D142C795EE2A5EA2042E6AD369B0AAAA9A82AD5840EDCE0E3DA5791FACA884EAACB45CDB3572D5E8861B5B36BFA235405DB3CFEB8A45029A9284BD4F5AA34193ACBAD15CEE1F6CC10D680E0831A7F0D3305C932F05D7F71896F0C71BCE90DC0993B514B2E485E0853C8A4DAB8A56C9C7B2484B370F42B442FC2D31B394C8D1E51516DD1E89308CD67983279FFE7FAA8CB702C66076E6FECD4DBA451EF1AFEAF2FB060000FFFF" +// "commandLineArgs": "binary --unzip --pretty-print --output myjsonfile.json 0x1F8B08000000000000139C51414EC33010FC8BAFD4C8719C36C9AD824BA50252E90D71D8D8EBC852EA147B73A8A2FE1D3B05CE153E8DAC99D99DD999812637FAC8DA993D0504C2FDDBEE19080EF83561A4178C117ADC2EAC4C72FE3C5106C3E8C28DC35A06CA182937C0D142C795EE2A5EA2042E6AD369B0AAAA9A82AD5840EDCE0E3DA5791FACA884EAACB45CDB3572D5E8861B5B36BFA235405DB3CFEB8A45029A9284BD4F5AA34193ACBAD15CEE1F6CC10D680E0831A7F0D3305C932F05D7F71896F0C71BCE90DC0993B514B2E485E0853C8A4DAB8A56C9C7B2484B370F42B442FC2D31B394C8D1E51516DD1E89308CD67983279FFE7FAA8CB702C66076E6FECD4DBA451EF1AFEAF2FB060000FFFF" +// "commandLineArgs": "binary --zip {\"actions\":{\"CreateLOIDataRequestMessageAction\":{\"input\":{\"loirequest\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"recipients\":[\"1504bf2f-cf6e-49c9-df39-08dbcaf6aa88\"]},\"status\":\"Succeded\",\"body\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"failedReason\":null}},\"triggers\":{\"Trigger\":{\"time\":\"2023-10-12T07:41:42.311509+00:00\",\"body\":{\"entityName\":\"LetterofindemnityRequests\",\"recordId\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"data\":{\"recipients\":[\"1504bf2f-cf6e-49c9-df39-08dbcaf6aa88\"]}}}}}" //"workingDirectory": "C:\\dev\\kfst_vanddata", //"commandLineArgs": "--path c:\\dev\\kfst_vanddata\\apps\\KFST.Vanddata.ManagementPortal\\manifest.json --customizationprefix kfst", //"commandLineArgs": "install EAVFW.Extensions.SecurityModel", @@ -15,7 +19,7 @@ // "commandLineArgs": "--path C:\\dev\\MedlemsCentralen\\src\\MC.Models\\manifest.json --customizationprefix MC" // "commandLineArgs": "sql ./src/Hafnia.Models", - "commandLineArgs": "gpt review pr --project https://github.com/delegateas/WorkflowEngine.git --pr 15" +// "commandLineArgs": "gpt review pr --project https://github.com/delegateas/WorkflowEngine.git --pr 15" // "commandLineArgs": "sql ./apps/KFST.Vanddata.ManagementPortal" //"commandLineArgs": "--path C:\\dev\\hafnia\\loi\\src\\Hafnia.Models\\manifest.json --customizationprefix hafnia" } diff --git a/tests/EAVFW.Extensions.Manifest.Tests/Gzip/GzipLogicTest.cs b/tests/EAVFW.Extensions.Manifest.Tests/Gzip/GzipLogicTest.cs index 4ae0437..fe6449a 100644 --- a/tests/EAVFW.Extensions.Manifest.Tests/Gzip/GzipLogicTest.cs +++ b/tests/EAVFW.Extensions.Manifest.Tests/Gzip/GzipLogicTest.cs @@ -1,7 +1,78 @@ +using System.Threading.Tasks; +using EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands.Gzip; +using Microsoft.VisualStudio.TestTools.UnitTesting; + namespace EAVFW.Extensions.Manifest.Tests.Gzip { + [TestClass] public class GzipLogicTest { - + [TestMethod] + public async Task NoOptions() + { + // Arrange + var jsonString = "{ \"value\": 2 }"; + var expectedStatusCode = 127; + + // Act + var (statusCode, output) = await GzipLogic.ConstructString(jsonString); + + // Assert + Assert.AreEqual(expectedStatusCode, statusCode); + } + + + [TestMethod] + public async Task ZipAndUnZipTests() + { + // Arrange + var jsonString = "{ \"value\": 2 }"; + var expectedStatusCode = 0; + + // Act + var (statusCode, output) = + await GzipLogic.ConstructString((await GzipLogic.ConstructString(jsonString, zip: true)).Item2, + unzip: true); + + // Assert + Assert.AreEqual(expectedStatusCode, statusCode); + Assert.AreEqual(jsonString, output); + } + + [TestMethod] + public async Task ZipAndUnZipWithPrettyPrintTests() + { + // Arrange + var jsonString = "{ \"value\": 2 }"; + var prettyfied = "{\n \"value\": 2\n}"; + var expectedStatusCode = 0; + + // Act + var (statusCode, output) = await GzipLogic.ConstructString( + (await GzipLogic.ConstructString(jsonString, zip: true)).Item2, unzip: true, prettyPrint: true); + + // Assert + Assert.AreEqual(expectedStatusCode, statusCode); + Assert.AreEqual(prettyfied, output); + } + + [TestMethod] + public async Task UnZipEavfwGeneratedContent() + { + // Arrange + var zippedString = + "0x1F8B08000000000000139C51414EC33010FC8BAFD4C8719C36C9AD824BA50252E90D71D8D8EBC852EA147B73A8A2FE1D3B05CE153E8DAC99D99DD999812637FAC8DA993D0504C2FDDBEE19080EF83561A4178C117ADC2EAC4C72FE3C5106C3E8C28DC35A06CA182937C0D142C795EE2A5EA2042E6AD369B0AAAA9A82AD5840EDCE0E3DA5791FACA884EAACB45CDB3572D5E8861B5B36BFA235405DB3CFEB8A45029A9284BD4F5AA34193ACBAD15CEE1F6CC10D680E0831A7F0D3305C932F05D7F71896F0C71BCE90DC0993B514B2E485E0853C8A4DAB8A56C9C7B2484B370F42B442FC2D31B394C8D1E51516DD1E89308CD67983279FFE7FAA8CB702C66076E6FECD4DBA451EF1AFEAF2FB060000FFFF"; + var unzippedString = + "{\"actions\":{\"CreateLOIDataRequestMessageAction\":{\"input\":{\"loirequest\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"recipients\":[\"1504bf2f-cf6e-49c9-df39-08dbcaf6aa88\"]},\"status\":\"Succeded\",\"body\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"failedReason\":null}},\"triggers\":{\"Trigger\":{\"time\":\"2023-10-12T07:41:42.311509+00:00\",\"body\":{\"entityName\":\"LetterofindemnityRequests\",\"recordId\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"data\":{\"recipients\":[\"1504bf2f-cf6e-49c9-df39-08dbcaf6aa88\"]}}}}}"; + + var expectedStatusCode = 0; + + // Act + var (statusCode, output) = await GzipLogic.ConstructString(zippedString, unzip: true); + + // Asset + Assert.AreEqual(expectedStatusCode, statusCode); + Assert.AreEqual(unzippedString, output); + } } } \ No newline at end of file