Ejemplo n.º 1
0
 public VerifyTestCaseData(
     VerifyWarrantyCaseRequest request,
     VerifyWarrantyCaseResponse expectedResponse)
 {
     Request          = request;
     ExpectedResponse = expectedResponse;
 }
Ejemplo n.º 2
0
        public async Task Verify(
            VerifyWarrantyCaseRequest request,
            IList <Guid> requestIds,
            IList <ExternalPartyCall> externalPartyCalls,
            VerifyWarrantyCaseResponse expectedResponse,
            int expectedWarrantyCaseVerificationCount,
            IList <WarrantyCaseVerification> expectedWarrantyCaseVerifications,
            int expectedWarrantyProofCount,
            IList <WarrantyProof?> expectedWarrantyProofs,                 // corresponds to requestIds
            int expectedExternalPartyRequestCount,
            IList <ExternalPartyRequest?> expectedExternalPartyRequests,   // corresponds to requestIds
            int expectedExternalPartyResponseCount,
            IList <ExternalPartyResponse?> expectedExternalPartyResponses) // corresponds to requestIds
        {
            var services = GetServices();

            var mockedRequestIdGenerator = new Mock <IRequestIdGenerator>(MockBehavior.Strict);
            var mockedRequestIdGeneratorSetupSequence = mockedRequestIdGenerator
                                                        .SetupSequence(m => m.GenerateRequestId());

            foreach (var requestId in requestIds)
            {
                mockedRequestIdGeneratorSetupSequence.Returns(requestId);
            }
            services.AddSingleton(_ => mockedRequestIdGenerator.Object);

            List <WarrantyRequest> actualExternalPartyCallRequests = new List <WarrantyRequest>();
            var externalPartyProxyCallSequence = new MockSequence();

            var mockedExternalPartyProxy = new Mock <IExternalPartyProxy>(MockBehavior.Strict);

            foreach (var externalPartyCall in externalPartyCalls)
            {
                var mockedExternalPartyProxySetup = mockedExternalPartyProxy
                                                    .InSequence(externalPartyProxyCallSequence)
                                                    .Setup(m => m.Call(It.IsAny <WarrantyRequest>()))
                                                    .Callback <WarrantyRequest>(warrantyRequest => actualExternalPartyCallRequests.Add(warrantyRequest));
                if (externalPartyCall.Throws)
                {
                    mockedExternalPartyProxySetup.Throws(new NetworkException("Network exception."));
                }
                else
                {
                    mockedExternalPartyProxySetup.ReturnsAsync(externalPartyCall.Response !);
                }
            }
            services.AddScoped(_ => mockedExternalPartyProxy.Object);

            var serviceProvider = services.BuildServiceProvider();

            using var serviceScope = serviceProvider.CreateScope();
            var warrantyService = serviceScope.ServiceProvider.GetRequiredService <IWarrantyService>();

            var actual = await warrantyService.Verify(request);

            // assert
            Assert.Equal(expectedResponse.IsSuccess, actual.IsSuccess);
            actual.WarrantyCaseResponse.Should().BeEquivalentTo(expectedResponse.WarrantyCaseResponse);
            Assert.Equal(expectedResponse.FailureType, actual.FailureType);
            Assert.Equal(expectedResponse.FailureMessage is null, actual.FailureMessage is null);

            mockedExternalPartyProxy.Verify(
                m => m.Call(It.IsAny <WarrantyRequest>()),
                Times.Exactly(externalPartyCalls.Count));
            actualExternalPartyCallRequests.Should().BeEquivalentTo(externalPartyCalls.Select(c => c.ExpectedRequest).ToList());

            // assert saved data
            using (var comprehensiveDbContext = serviceScope.ServiceProvider.GetRequiredService <ComprehensiveDataDbContext>())
            {
                var actualWarrantyCaseVerificationCount = comprehensiveDbContext.WarrantyCaseVerification
                                                          .Where(v => v.OrderId == request.OrderId)
                                                          .Count();
                Assert.Equal(expectedWarrantyCaseVerificationCount, actualWarrantyCaseVerificationCount);

                foreach ((WarrantyCaseVerification expectedWarrantyCaseVerification, int i) in
                         expectedWarrantyCaseVerifications.Select((y, i) => (y, i)))
                {
                    var actualWarrantyCaseVerification = comprehensiveDbContext.WarrantyCaseVerification
                                                         .Where(v => v.OrderId == request.OrderId)
                                                         .OrderByDescending(v => v.DateTime)
                                                         .Skip(expectedWarrantyCaseVerifications.Count - 1 - i)
                                                         .First();
                    actualWarrantyCaseVerification.Should().BeEquivalentTo(
                        expectedWarrantyCaseVerification,
                        opt => opt
                        .Excluding(v => v.Id)
                        .Excluding(v => v.DateTime)
                        .Excluding(v => v.FailureMessage)
                        .Excluding(v => v.ConvertedResponse));
                    Assert.Equal(
                        expectedWarrantyCaseVerification.FailureMessage is null,
                        actualWarrantyCaseVerification.FailureMessage is null);
                    var expectedConvertedResponse = JsonConvert.DeserializeObject <WarrantyCaseResponse?>(expectedWarrantyCaseVerification.ConvertedResponse ?? "");
                    var actualConvertedResponse   = JsonConvert.DeserializeObject <WarrantyCaseResponse?>(actualWarrantyCaseVerification.ConvertedResponse ?? "");
                    actualConvertedResponse.Should().BeEquivalentTo(expectedConvertedResponse);
                }

                var actualWarrantyProofCount = comprehensiveDbContext.WarrantyProof
                                               .Where(p => p.OrderId == request.OrderId)
                                               .Count();
                Assert.Equal(actualWarrantyProofCount, expectedWarrantyProofCount);

                foreach ((WarrantyProof? expectedWarrantyProof, int i) in
                         expectedWarrantyProofs.Select((y, i) => (y, i)))
                {
                    var actualWarrantyProof = comprehensiveDbContext.WarrantyProof
                                              .Where(p => p.RequestId == requestIds.Last())
                                              .SingleOrDefault();
                    actualWarrantyProof.Should().BeEquivalentTo(
                        expectedWarrantyProof,
                        opt => opt
                        .Excluding(req => req.Id)
                        .Excluding(req => req.DateTime));
                }
            }

            using (var budgetDbContext = serviceScope.ServiceProvider.GetRequiredService <BudgetDataDbContext>())
            {
                var actualExternalPartyRequestCount = budgetDbContext.ExternalPartyRequest
                                                      .Where(req => req.OrderId == request.OrderId)
                                                      .Count();
                Assert.Equal(expectedExternalPartyRequestCount, actualExternalPartyRequestCount);

                foreach ((ExternalPartyRequest? expectedExternalPartyRequest, int i) in
                         expectedExternalPartyRequests.Select((y, i) => (y, i)))
                {
                    var actualExternalPartyRequest = budgetDbContext.ExternalPartyRequest
                                                     .Where(req => req.OrderId == request.OrderId && req.RequestId == requestIds[i])
                                                     .SingleOrDefault();
                    actualExternalPartyRequest.Should().BeEquivalentTo(
                        expectedExternalPartyRequest,
                        opt => opt
                        .Excluding(req => req.Id)
                        .Excluding(req => req.DateTime)
                        .Excluding(req => req.Request));
                    var expectedRawRequest = JsonConvert.DeserializeObject <WarrantyResponse?>(expectedExternalPartyRequest.Request ?? "");
                    var actualRawRequest   = JsonConvert.DeserializeObject <WarrantyResponse?>(actualExternalPartyRequest.Request ?? "");
                    actualRawRequest.Should().BeEquivalentTo(expectedRawRequest);
                }

                var actualExternalPartyResponseCount = budgetDbContext.ExternalPartyResponse
                                                       .Where(res => res.OrderId == request.OrderId)
                                                       .Count();
                Assert.Equal(expectedExternalPartyResponseCount, actualExternalPartyResponseCount);

                foreach ((ExternalPartyResponse? expectedExternalPartyResponse, int i) in
                         expectedExternalPartyResponses.Select((y, i) => (y, i)))
                {
                    var actualExternalPartyResponse = budgetDbContext.ExternalPartyResponse
                                                      .Where(req => req.OrderId == request.OrderId && req.RequestId == requestIds[i])
                                                      .SingleOrDefault();
                    actualExternalPartyResponse.Should().BeEquivalentTo(
                        expectedExternalPartyResponse,
                        opt => opt
                        .Excluding(res => res.Id)
                        .Excluding(res => res.DateTime)
                        .Excluding(res => res.Response));
                    var expectedRawResponse = JsonConvert.DeserializeObject <WarrantyResponse?>(expectedExternalPartyResponse.Response ?? "");
                    var actualRawResponse   = JsonConvert.DeserializeObject <WarrantyResponse?>(actualExternalPartyResponse.Response ?? "");
                    actualRawResponse.Should().BeEquivalentTo(expectedRawResponse);
                }
            }
        }