public void GetAll_HaveData_ShouldReturnCorrectNumberOfRecord()
        {
            var expectKeys = 4;
            var data       = CreateMockedListExposureKeys(DateTime.UtcNow, expectKeys, true);

            using (var context = new DigNDB_SmittestopContext(_options))
            {
                context.Database.EnsureDeleted();
                //add data to context
                context.TemporaryExposureKey.AddRange(data);
                context.SaveChanges();
                _repo = new TemporaryExposureKeyRepository(context, _countryRepository.Object);
                var keys = _repo.GetAll().Result;
                Assert.AreEqual(expectKeys, keys.Count);
            }
        }
Example #2
0
        public void DownloadKeysFromMultipleCountries_ShouldSaveOnlyValidKeysFromEnabledOrigins()
        {
            int maximumNumberOfDaysBack = 3;

            var today       = DateTime.UtcNow.Date;
            var day1DateStr = today.AddDays(-2).ToString(DateFormat);
            var day2DateStr = today.AddDays(-1).ToString(DateFormat);
            var day3DateStr = today.ToString(DateFormat);

            var germanDefaultBuilder = TestTemporaryExposureKeyBuilder.CreateDefault(_germany)
                                       .SetReportType(ReportType.CONFIRMED_TEST)
                                       .SetKeySource(KeySource.Gateway);

            // has DK in VisitedCountries - should be accepted
            var germanValidKeysBuilder1 = germanDefaultBuilder.Copy().SetVisitedCountries(new[] { _poland, _denmark });
            // has empty VisitedCountries = no filtering. Should be accepted
            var germanValidKeysBuilder2 = germanDefaultBuilder.Copy().SetVisitedCountries(new Country[] { });
            // doesn't have DK in VisitedCountries - should be accepted because of one world policy
            var germanValidKeysBuilder3 = germanDefaultBuilder.Copy().SetVisitedCountries(new Country[] { _poland });
            // invalid RollingStartNumber - should be rejected
            var germanInvalidKeysBuilder1 = germanDefaultBuilder.Copy()
                                            .SetVisitedCountries(new Country[] { _denmark })
                                            .SetRollingStartNumber(DateTime.UnixEpoch);
            // pulling from Latvia is disabled - should be rejected
            var latviaKeysBuilder = TestTemporaryExposureKeyBuilder.CreateDefault(_latviaDisabledDownload)
                                    .SetKeySource(KeySource.Gateway);

            // BE AWARE THAT KeyData CANNOT BE LONGER THAN 16 BYTES - longer keys will be rejected by GatewayService
            // day 1 - batch 1
            var daysOneBatchTag1      = day1DateStr;
            var dayOneValidKeysBatch1 = new List <TemporaryExposureKey>()
                                        .Concat(germanValidKeysBuilder1.BuildNormalized(new[] { "DE1.1_V1", "DE1_V2", "DE1.1_V3" }))
                                        .Concat(germanValidKeysBuilder2.BuildNormalized(new[] { "DE1.1_V4", "DE1.1_V5", "DE1.1_V6" }));
            var dayOneValidKeysBatch4 = new List <TemporaryExposureKey>()
                                        .Concat(germanValidKeysBuilder3.BuildNormalized(new[] { "DE1.1_INV1", "DE1.1_INV2" }));
            // day #1 - batch 2
            var daysOneBatchTag2      = day1DateStr + "-2";
            var dayOneValidKeysBatch2 = new List <TemporaryExposureKey>()
                                        .Concat(germanValidKeysBuilder1.BuildNormalized(new[] { "DE1.2_V1", "DE1.2_V2", "DE1.2_V3" }));
            var dayOneInvalidKeysBatch2 = new List <TemporaryExposureKey>()
                                          .Concat(latviaKeysBuilder.BuildNormalized(new[] { "LT1.2_INV1", "LT1.2_INV2" }));
            // day #1 - batch 3
            var daysOneBatchTag3      = day1DateStr + "-3";
            var dayOneValidKeysBatch3 = new List <TemporaryExposureKey>()
                                        .Concat(germanValidKeysBuilder1.BuildNormalized(new[] { "DE1.3_V1", "DE1.3_V2", "DE1.3_V3" }));
            // day #2 - batch 1
            var dayTwoBatchTag1         = day2DateStr;
            var dayTwoInvalidKeysBatch1 = new List <TemporaryExposureKey>()
                                          .Concat(latviaKeysBuilder.BuildNormalized(new[] { "LT2.1_INV1", "LT2.1_INV2" }));
            // day #2 - batch 2
            var dayTwoBatchTag2         = day2DateStr + "-2";
            var dayTwoInvalidKeysBatch2 = new List <TemporaryExposureKey>()
                                          .Concat(latviaKeysBuilder.BuildNormalized(new[] { "LT2.2_INV1", "LT2.2_INV2" }))
                                          .Concat(germanInvalidKeysBuilder1.BuildNormalized(new[] { "DE2.2_INV3" }));
            // day #3 - batch 1
            var dayThreeBatchTag1       = day3DateStr;
            var dayThreeValidKeysBatch1 = new List <TemporaryExposureKey>()
                                          .Concat(germanValidKeysBuilder1.BuildNormalized(new[] { "DE3.1_V1", "DE3_V2", "DE3.1_V3" }))
                                          .Concat(germanValidKeysBuilder2.BuildNormalized(new[] { "DE3.1_V4", "DE3.1_V5", "DE3.1_V6" }));

            var keyBatchesDict = new Dictionary <string, IEnumerable <TemporaryExposureKey> >();

            keyBatchesDict.Add(key: daysOneBatchTag1, value: dayOneValidKeysBatch1.Concat(dayOneValidKeysBatch4));
            keyBatchesDict.Add(key: daysOneBatchTag2, value: dayOneValidKeysBatch2.Concat(dayOneInvalidKeysBatch2));
            keyBatchesDict.Add(key: daysOneBatchTag3, value: dayOneValidKeysBatch3);

            keyBatchesDict.Add(key: dayTwoBatchTag1, value: dayTwoInvalidKeysBatch1);
            keyBatchesDict.Add(key: dayTwoBatchTag2, value: dayTwoInvalidKeysBatch2);

            keyBatchesDict.Add(key: dayThreeBatchTag1, value: dayThreeValidKeysBatch1);

            // setup mock
            var gatewayHttpClientMock = new Mock <IGatewayHttpClient>(MockBehavior.Strict);

            gatewayHttpClientMock
            .Setup(client => client.SendAsync(It.IsAny <HttpRequestMessage>()))
            .ReturnsAsync((HttpRequestMessage request) =>
            {
                string dictKey;
                // request for the first batch doesn't contain BatchTag header
                if (!request.Headers.Contains(BatchTagHeaderName))
                {
                    dictKey = ExtractDateFromUrl(request.RequestUri.ToString());
                }
                else
                {
                    dictKey = request.Headers.GetValues(BatchTagHeaderName).First();
                }

                if (keyBatchesDict.ContainsKey(dictKey))
                {
                    return(CreateGatewayResponseFromBatch(keyBatchesDict[dictKey]));
                }
                else
                {
                    throw new InvalidOperationException($"Invalid batchTag has been requested: {dictKey}");
                }
            });
            var service = CreateGatewayServiceAndDependencies(gatewayHttpClientMock.Object);

            // Act
            service.DownloadKeysFromGateway(maximumNumberOfDaysBack);

            // .: Verify
            // get data
            var allSavedKeys = _keysRepository.GetAll().Result;

            // assert
            var allValidKeys = new List <TemporaryExposureKey>()
                               .Concat(dayOneValidKeysBatch1)
                               .Concat(dayOneValidKeysBatch2)
                               .Concat(dayOneValidKeysBatch3)
                               .Concat(dayOneValidKeysBatch4)
                               .Concat(dayThreeValidKeysBatch1)
                               .ToList();

            var allInvalidKeys = new List <TemporaryExposureKey>()
                                 .Concat(dayOneInvalidKeysBatch2)
                                 .Concat(dayOneInvalidKeysBatch2)
                                 .Concat(dayTwoInvalidKeysBatch1)
                                 .Concat(dayTwoInvalidKeysBatch2)
                                 .ToList();

            allSavedKeys.Should()
            .OnlyHaveUniqueItems(key => key.KeyData, because: "Service cannot send duplicates.")
            .And.OnlyContain(key2Check => IsInCollection(key2Check.KeyData, allValidKeys), because: "Only valid keys should be save in the database.");
        }