Example #1
0
        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);
        }
Example #2
0
        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);
                }
            }
        }
Example #3
0
        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();
            }
        }