public void Setup() { _validator = new FiksResponseValidator(); _fiksResponseTest = new FiksResponseTest { PayloadQuery = "/arkivmelding/registrering", ExpectedValue = "someValue", ValueType = SearchValueType.Attribute, }; var requestPayloadFilePath = "./TestData/Requests/ny_inngaaende.xml"; _testCase = new TestCase { MessageType = ArkivintegrasjonMeldingTypeV1.Arkivmelding, TestName = "testTestCase", FiksResponseTests = new List <FiksResponseTest>(), PayloadFileName = requestPayloadFilePath, ExpectedResponseMessageTypes = new List <FiksExpectedResponseMessageType>() { new FiksExpectedResponseMessageType() { ExpectedResponseMessageType = "no.ks.fiks.gi.arkivintegrasjon.mottatt.v1" }, new FiksExpectedResponseMessageType() { ExpectedResponseMessageType = "no.ks.fiks.gi.arkivintegrasjon.kvittering.v1" } } }; _testCase.FiksResponseTests.Add(_fiksResponseTest); _fiksResponseMottatt = new FiksResponse { Type = ArkivintegrasjonMeldingTypeV1.ArkivmeldingMottatt, }; var responsePayloadFilePath = "./TestData/Responses/svar_paa_ny_inngaaende.xml"; byte[] fileAsBytes; using (MemoryStream ms = new MemoryStream()) { Stream s = File.OpenRead(responsePayloadFilePath); s.CopyTo(ms); fileAsBytes = ms.ToArray(); } _fiksResponseKvittering = new FiksResponse { Type = ArkivintegrasjonMeldingTypeV1.ArkivmeldingKvittering, ReceivedAt = DateTime.Now, FiksPayloads = new List <FiksPayload> { new FiksPayload() { Filename = "svar_paa_ny_inngaaende.xml", Payload = fileAsBytes } }, }; _fiksRequest = new FiksRequest { MessageGuid = new Guid("F15D3D0D-FA20-41D7-B762-A718ACE95A0B"), FiksResponses = new List <FiksResponse>(), SentAt = DateTime.Now, IsFiksResponseValidated = false, FiksResponseValidationErrors = new List <string>(), TestCase = _testCase, }; _fiksRequest.FiksResponses.Add(_fiksResponseMottatt); _fiksRequest.FiksResponses.Add(_fiksResponseKvittering); _testSession = new TestSession { Id = new Guid("0459C8B6-EAF1-4186-8FCB-BEC3AC311404"), FiksRequests = new List <FiksRequest>(), CreatedAt = DateTime.Now, }; _testSession.FiksRequests.Add(_fiksRequest); }
private static void ValidatePayload(FiksResponse fiksResponse, FiksRequest fiksRequest, List <string> validationErrors) { var fiksPayload = GetFiksPayload(fiksResponse.FiksPayloads); var receivedPayloadFileName = fiksPayload != null ? fiksPayload.Filename : null; var messageType = fiksResponse.Type; // Ingen payload forventet og heller ingen payload mottatt. Alt ok. if (!ShouldHavePayload(messageType) && receivedPayloadFileName == null) { return; } // Forventet payload men ingen mottatt. Feil! if (ShouldHavePayload(messageType) && receivedPayloadFileName == null) { validationErrors.Add(string.Format( ValidationErrorMessages.MissingPayloadFileMessage, messageType )); return; } // Ingen paylod forventet men det er mottatt fil. Feil! if (!ShouldHavePayload(messageType) && receivedPayloadFileName != null) { validationErrors.Add(string.Format( ValidationErrorMessages.UnexpectedPayloadFileMessage, messageType )); return; } // Payload mottat som forventet men feil filformat. Feil! if (receivedPayloadFileName != null && !PayloadChecksHelper.HasValidFileFormat(receivedPayloadFileName)) { validationErrors.Add(string.Format( ValidationErrorMessages.InvalidPayloadFileFormatMessage, receivedPayloadFileName.Split('.').Last() )); return; } // Payload har ikke korrekt filnavn i forhold til meldingstype. Feil! if (!HasCorrectFilename(fiksResponse.Type, receivedPayloadFileName)) { validationErrors.Add(string.Format( ValidationErrorMessages.InvalidPayloadFilename, receivedPayloadFileName, GetExpectedFileName(messageType) )); return; } if (receivedPayloadFileName != null && receivedPayloadFileName.EndsWith(".xml")) { var xmlContent = System.Text.Encoding.Default.GetString(fiksPayload.Payload); ValidateXmlWithSchema(xmlContent, validationErrors, messageType); ValidateXmlPayloadContent(xmlContent, fiksRequest, validationErrors); } else { if (receivedPayloadFileName != null && receivedPayloadFileName.EndsWith(".json")) { ValidateJsonPayloadContent(System.Text.Encoding.Default.GetString(fiksPayload.Payload), fiksRequest.TestCase.FiksResponseTests, validationErrors); } } }
private async void OnMottattMelding(object sender, MottattMeldingArgs mottattMeldingArgs) { Logger.Information("Henter melding med MeldingId: {MeldingId}", mottattMeldingArgs.Melding.MeldingId); var payloads = new List <FiksPayload>(); if (mottattMeldingArgs.Melding.HasPayload) { try { // Verify that message has payload IAsicReader reader = new AsiceReader(); await using var inputStream = mottattMeldingArgs.Melding.DecryptedStream.Result; using var asice = reader.Read(inputStream); foreach (var asiceReadEntry in asice.Entries) { await using var entryStream = asiceReadEntry.OpenStream(); byte[] fileAsBytes; using (MemoryStream ms = new MemoryStream()) { entryStream.CopyTo(ms); fileAsBytes = ms.ToArray(); } payloads.Add(new FiksPayload() { Filename = asiceReadEntry.FileName, Payload = fileAsBytes }); } } catch (Exception e) { Logger.Error("Klarte ikke hente payload og melding blir dermed ikke parset. MeldingId: {MeldingId}, Error: {Message}", mottattMeldingArgs.Melding?.MeldingId, e.Message); mottattMeldingArgs.SvarSender?.Ack(); return; } } try { using var scope = _scopeFactory.CreateScope(); var context = scope.ServiceProvider.GetRequiredService <FiksIOMessageDBContext>(); var testSession = context.TestSessions.Include(t => t.FiksRequests).FirstOrDefaultAsync(t => t.FiksRequests.Any(r => r.MessageGuid.Equals(mottattMeldingArgs.Melding.SvarPaMelding))).Result; // Ikke optimalt? Det er gjort slik fordi man ikke vet om databasen har rukket å skrive før man får svar. var timesTried = 1; while (testSession == null && timesTried <= 5) { Thread.Sleep(1000); testSession = context.TestSessions.Include(t => t.FiksRequests).FirstOrDefault(t => t.FiksRequests.Any(r => r.MessageGuid.Equals(mottattMeldingArgs.Melding.SvarPaMelding))); timesTried++; } if (testSession != null) { var fiksRequest = testSession.FiksRequests.Find(r => r.MessageGuid.Equals(mottattMeldingArgs.Melding.SvarPaMelding)); var responseMessage = new FiksResponse { ReceivedAt = DateTime.Now, Type = mottattMeldingArgs.Melding.MeldingType, FiksPayloads = payloads }; if (fiksRequest == null) { mottattMeldingArgs.SvarSender?.Ack(); Logger.Error("Klarte ikke å matche svar-melding fra FIKS med en eksisterende forespørsel. Testsession med id {TestSessionId} funnet. Svarmelding forkastes. SvarPaMelding id: {Id}", testSession.Id, mottattMeldingArgs.Melding.SvarPaMelding); return; } fiksRequest.FiksResponses ??= new List <FiksResponse>(); fiksRequest.FiksResponses.Add(responseMessage); context.Entry(testSession).State = EntityState.Modified; await context.SaveChangesAsync(); } else { Logger.Error("Klarte ikke å matche svar-melding fra FIKS med en eksisterende testsesjon. Testsession ikke funnet. Svarmelding forkastes. SvarPaMelding id: {Id}", mottattMeldingArgs.Melding.SvarPaMelding); } } finally { mottattMeldingArgs.SvarSender?.Ack(); } }