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); } }
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."); }