using Autofac; using FitConnect; using FitConnect.Encryption; using FitConnect.Models.Api.Metadata; using FitConnect.Services.Interfaces; using FitConnect.Services.Models; using FitConnect.Services.Models.v1.Submission; using Microsoft.Extensions.Logging; using Moq; using Newtonsoft.Json; using Data = FitConnect.Models.Data; using Metadata = FitConnect.Models.Api.Metadata.Metadata; using Route = FitConnect.Services.Models.v1.Routes.Route; namespace MockContainer; public record MockSettings(string PrivateKeyDecryption, string PrivateKeySigning, string PublicKeyEncryption, string PublicKeySignatureVerification, string SenderClientId, string SenderClientSecret, string SubscriberClientId, string SubscriberClientSecret, string DestinationId, string LeikaKey, string CallbackSecret, string SetPublicKeys) : IFitConnectSettings; public class TestFile { public byte[] Content; public string Name; public TestFile() { Content = File.ReadAllBytes("Test.pdf"); Name = "Test.pdf"; } } public static class Container { public static IContainer Create() { var builder = new ContainerBuilder(); var settings = CreateEncryptionSettings(builder); builder.Register(c => new TestFile()).As<TestFile>(); builder.Register(c => CreateOAuthService().Object).As<IOAuthService>(); builder.Register(c => CreateRouteService().Object).As<IRouteService>(); builder.Register(c => CreateSubmissionService().Object).As<ISubmissionService>(); builder.Register(c => CreateDestinationService(settings).Object).As<IDestinationService>(); builder.Register(c => Mock.Of<ICasesService>()).As<ICasesService>(); builder.Register(c => LoggerFactory.Create( b => { b.AddConsole(); b.SetMinimumLevel(LogLevel.Information); }).CreateLogger("E2E Tests") ).As<ILogger>(); return builder.Build(); } private static Mock<IDestinationService> CreateDestinationService(IFitConnectSettings settings) { var mock = new Mock<IDestinationService>(); mock.Setup(x => x.GetPublicKey(It.IsAny<string>())).Returns(() => Task.FromResult(settings.PublicKeyEncryption)); return mock; } private static IFitConnectSettings? GetSettingsFromEnvironment() { Console.WriteLine("Getting settings from environment"); var privateKeyDecryption = Environment.GetEnvironmentVariable("MOCK_PRIVATE_KEY_DECRYPTION")!; var privateKeySigning = Environment.GetEnvironmentVariable("MOCK_PRIVATE_KEY_SIGNING")!; var publicKeyEncryption = Environment.GetEnvironmentVariable("MOCK_PUBLIC_KEY_ENCRYPTION")!; var publicKeySignature = Environment.GetEnvironmentVariable("MOCK_PUBLIC_KEY_SIGNATURE")!; var setPublicKeys = Environment.GetEnvironmentVariable("MOCK_SET_PUBLIC_KEYS")!; var senderClientId = Environment.GetEnvironmentVariable("MOCK_SENDER_CLIENT_ID")!; var senderClientSecret = Environment.GetEnvironmentVariable("MOCK_SENDER_CLIENT_SECRET")!; var subscriberClientId = Environment.GetEnvironmentVariable("MOCK_SUBSCRIBER_CLIENT_ID")!; var subscriberClientSecret = Environment.GetEnvironmentVariable("MOCK_SUBSCRIBER_CLIENT_SECRET")!; var destinationId = Environment.GetEnvironmentVariable("MOCK_DESTINATION_ID")!; var leikaKey = Environment.GetEnvironmentVariable("MOCK_LEIKA_KEY")!; var callbackSecret = Environment.GetEnvironmentVariable("MOCK_CALLBACK_SECRET")!; return new MockSettings( privateKeyDecryption, privateKeySigning, publicKeyEncryption, publicKeySignature, senderClientId, senderClientSecret, subscriberClientId, subscriberClientSecret, destinationId, leikaKey, callbackSecret, setPublicKeys); } private static MockSettings? GetSettingsFromFiles() { Console.WriteLine("Reading settings from files"); try { var privateKeyDecryption = File.ReadAllText("./encryptionKeys/privateKey_decryption.json"); var privateKeySigning = File.ReadAllText("./encryptionKeys/privateKey_signing.json"); var publicKeyEncryption = File.ReadAllText("./encryptionKeys/publicKey_encryption.json"); var publicKeySignature = File.ReadAllText("./encryptionKeys/publicKey_signature_verification.json"); var setPublicKeys = File.ReadAllText("./encryptionKeys/set-public-keys.json"); var credentials = JsonConvert.DeserializeObject<dynamic>( File.ReadAllText("./encryptionKeys/credentials.json"))!; var senderClientId = (string)credentials.sender.clientId; var senderClientSecret = (string)credentials.sender.clientSecret; var subscriberClientId = (string)credentials.subscriber.clientId; var subscriberClientSecret = (string)credentials.subscriber.clientSecret; var destinationId = (string)credentials.destinationId; var leikaKey = (string)credentials.leikaKey; var callbackSecret = (string)credentials.callbackSecret; return new MockSettings( privateKeyDecryption, privateKeySigning, publicKeyEncryption, publicKeySignature, senderClientId, senderClientSecret, subscriberClientId, subscriberClientSecret, destinationId, leikaKey, callbackSecret, setPublicKeys); } catch { Console.WriteLine("Files not found, using environment variables"); return null; } } private static IFitConnectSettings CreateEncryptionSettings(ContainerBuilder builder) { var settings = Environment.GetEnvironmentVariable("ENVIRONMENT_DRIVEN_TEST") == null ? GetSettingsFromFiles() : GetSettingsFromEnvironment(); if (settings == null) throw new ArgumentException("Could not find settings file nor environment variables"); builder.Register(c => settings) .As<IFitConnectSettings>(); builder.Register(c => (settings as MockSettings)!.ToKeySet()).As<KeySet>(); return settings; } private static Mock<IRouteService> CreateRouteService() { var routeService = new Mock<IRouteService>(); routeService.Setup(r => r.GetDestinationIdAsync( It.Is<string>(s => !string.IsNullOrWhiteSpace(s)), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string?>())) .Returns(() => Task.Run(() => new List<Route>())); return routeService; } private static Mock<IOAuthService> CreateOAuthService() { var oAuthService = new Mock<IOAuthService>(); oAuthService.SetupGet(o => o.IsAuthenticated).Returns(true); return oAuthService; } private static Mock<ISubmissionService> CreateSubmissionService() { var submissionService = new Mock<ISubmissionService>(); submissionService.Setup(s => s.ListSubmissionsAsync(It.IsAny<string>(), It.IsAny<int>(), It.IsAny<int>())).Returns( () => Task.FromResult(JsonConvert.DeserializeObject<SubmissionsForPickupDto>( @"{""offset"":0,""count"":3,""totalCount"":3,""submissions"":[{""destinationId"":""879ee109-a690-4db8-ab32-424284184d7d"",""submissionId"":""ce75a6b8-d72f-4b94-b09e-af6be35bc2ae""},{""destinationId"":""19c8489b-29b8-422f-b7db-919852cfb04b"",""submissionId"":""e364430f-5a3b-4284-ba9a-f2867ba421e6""},{""destinationId"":""80a0aac3-148d-42bb-9366-516ce6355348"",""submissionId"":""530ba588-2db9-4899-ab0d-0c0b57689271""}]}")) ! ); submissionService.Setup(s => s.CreateSubmissionAsync(It.IsAny<CreateSubmissionDto>())) .Returns( () => Task.FromResult(new SubmissionCreatedDto { DestinationId = "destinationId", CaseId = "caseId" })); submissionService.Setup(s => s.GetKey(It.IsAny<string>())).Returns(() => "{\"kty\":\"RSA\",\"key_ops\":[\"wrapKey\"],\"alg\":\"RSA-OAEP-256\",\"x5c\":[\"MIIFCTCCAvECBAONrDowDQYJKoZIhvcNAQENBQAwSTELMAkGA1UEBhMCREUxFTATBgNVBAoMDFRlc3RiZWhvZXJkZTEjMCEGA1UEAwwaRklUIENvbm5lY3QgVGVzdHplcnRpZmlrYXQwHhcNMjIwNjI4MTE1MzE1WhcNMzIwNjI1MTE1MzE1WjBJMQswCQYDVQQGEwJERTEVMBMGA1UECgwMVGVzdGJlaG9lcmRlMSMwIQYDVQQDDBpGSVQgQ29ubmVjdCBUZXN0emVydGlmaWthdDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAM4xtyHNdvpBlol6lROwg4yAsgG9zKQ7oQkjNTUxnbsuiqhRPpniY1/ZbtTEZqrsDLtSzb9B48eJLIgdGS+mI5Z6kFTG1XaMZ46XEJxZNY/Ldf53YTmrW3QqxGV05t7/ylqWQZtSCPDsHjfX5SyoJOFTPWMqFjLiKllJzBi2j/FTbJ73K1gVUv7V7UiRuARfqScDUH6egNKza7CpvzARft7kyF3za3cm4w1rtV6yBkduWOq/JLzctMsp7vbX4S8AW6m4BvD2JLSMukx7KXY2u0AgtmnzNCDXItRo/+PGH3rC3C27/oyIyykJ94fZsSiz2FffnbEUgmU+x6RzwWfT3KorgG3wI6cECiBmFCZLdBhjoZzPpYyr6LBrIeMbAip3CWxNnayB2zNZIhlrhkPw1WkxcZDBLJaql/P7dQKknU1g94KiPtNjxnO8NSfolFkLGQ3zT0LIoSXYPyHMOiG8xgKczSMgBXkkoCTTSUqWOXlx2QeFdCKBkxxW947fMKpA8nGIhIk4JiycpV1Xf5eQ5alz+Ox3QeUSi22mSN4hhDMyvfLwZeKlpIsQwcQ8zjWuXllHJAdfr3WGLj5LCk6i5NVpYfWtm++SrDiSnGgTlxB7n1SAWcvGvhhm5INta5xgmFOY5i3DwYo9A9NzxZw+7tEZT2k3uY1gmxd6GDJkOhIXAgMBAAEwDQYJKoZIhvcNAQENBQADggIBAI2knmZldxsrJp6Lyk+eLEVbrZI3BuHdfs+9q5I8R2b/RoqEuI05ZxoFPMZGyOMUINsXpthWMGsyALs512nmzR4bD1NGu5Ada3P/UiK3zaZk+xpJ9qAJo9xATRlGkdPhW5HyztUap1M+UW0GA/fDZJLRDVAlF+8czCPahP8ZhP5pkZcPTL/xxvQwDmadmdDRAEObOQlx58SwqQYC/FnO6lEFRhY+Hak9W4E1MoegoG8KFwOvqVRiRx3IVy1vdMQZgRRLDLkZzKIlI8WwkJONObVqdSrF2HfnEk6jhsG7/4Prn16XBSRi7wdqLOnnUpxwKsvL7BZVqAPcJ821XLxZ8wmRVItMnO3qJPP6RqVj7wfB7hnUOLHDywbGGWSrk0gi3x81x3tYXf8S+AbEn59uGIiArZjKmErvgFdtCWS8ILd7EFGYaMSYCCaJxoM/N5LckxAQXmsCgiLeOxXez2+H/uTRbctc5XEgNuVt+k92bF8amaGi5gUO60v7k4hPsnSHFzIqhsfiiOE6Pewyt96teAx4Xc2vMULcc2MUOHeiqK77OzHj8jN+/nztVSnYSrbaPYhJuIXVW5UZExG8kCTSNKK3aS+4++El7sbIHsqBTKvTmQvOMaBrGbZZR5jy5RTZSPi4njBdkjzRogloZRBoOSLebbR4B+4LMeoidxoOQN6O\"],\"kid\":\"vr7cWKGl-g4Wa_CRGowNhAYW_gQb-akMbiigxN0EkDI\",\"n\":\"zjG3Ic12-kGWiXqVE7CDjICyAb3MpDuhCSM1NTGduy6KqFE-meJjX9lu1MRmquwMu1LNv0Hjx4ksiB0ZL6YjlnqQVMbVdoxnjpcQnFk1j8t1_ndhOatbdCrEZXTm3v_KWpZBm1II8OweN9flLKgk4VM9YyoWMuIqWUnMGLaP8VNsnvcrWBVS_tXtSJG4BF-pJwNQfp6A0rNrsKm_MBF-3uTIXfNrdybjDWu1XrIGR25Y6r8kvNy0yynu9tfhLwBbqbgG8PYktIy6THspdja7QCC2afM0INci1Gj_48YfesLcLbv-jIjLKQn3h9mxKLPYV9-dsRSCZT7HpHPBZ9PcqiuAbfAjpwQKIGYUJkt0GGOhnM-ljKvosGsh4xsCKncJbE2drIHbM1kiGWuGQ_DVaTFxkMEslqqX8_t1AqSdTWD3gqI-02PGc7w1J-iUWQsZDfNPQsihJdg_Icw6IbzGApzNIyAFeSSgJNNJSpY5eXHZB4V0IoGTHFb3jt8wqkDycYiEiTgmLJylXVd_l5DlqXP47HdB5RKLbaZI3iGEMzK98vBl4qWkixDBxDzONa5eWUckB1-vdYYuPksKTqLk1Wlh9a2b75KsOJKcaBOXEHufVIBZy8a-GGbkg21rnGCYU5jmLcPBij0D03PFnD7u0RlPaTe5jWCbF3oYMmQ6Ehc\",\"e\":\"AQAB\",\"use\":null}"); submissionService .Setup(c => c.SubmitSubmission(It.IsAny<string>(), It.IsAny<SubmitSubmissionDto>())) .Returns( (string id, SubmitSubmissionDto dto) => { Console.WriteLine( $@"Submitting submission {id} with {JsonConvert.SerializeObject(dto, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.Indented })}"); return Task.Run(() => new SubmissionReducedDto())!; }); var data = new Data(); var metadata = new Metadata { PublicServiceType = new Verwaltungsleistung { Name = "Verwaltungsleistung" } }; var encryptData = ""; var encryptMetadata = ""; submissionService.Setup(s => s.GetSubmissionAsync(It.IsAny<string>())) .Returns((string id) => Task.FromResult( new SubmissionDto { SubmissionId = id, DestinationId = "destination", Callback = new CallbackDto { Secret = "secret", Url = "http://localhost:8080/callback" }, EncryptedData = encryptData, EncryptedMetadata = encryptMetadata, Attachments = new List<string>(), CaseId = "caseId", ServiceType = new ServiceTypeDto { Description = "ServiceType", Identifier = "Service identifier", Name = "Dummy Service Type" } })); return submissionService; } } public static class MockSettingsExtensions { public static KeySet ToKeySet(this MockSettings settings) { return new KeySet { PrivateKeyDecryption = settings.PrivateKeyDecryption, PrivateKeySigning = settings.PrivateKeySigning, PublicKeyEncryption = settings.PublicKeyEncryption, PublicKeySignatureVerification = settings.PublicKeySignatureVerification }; } }