public async Task DownloadImagesAsync_UnexistingImage_DownloadsAndSaves() { // Arrange var metadata = new BingArchiveDto { Images = new [] { new BingImagesArchiveDto { Url = "/th?id=myImage001.jpg" } } }; string folderPath = "c:\\"; var streamMock = new Mock <Stream>(); _mocker.GetMock <IHttpAdapter>() .Setup(x => x.GetStreamAsync(new Uri("https://www.bing.com/th?id=myImage001.jpg", UriKind.Absolute), It.IsAny <CancellationToken>())) .Returns(Task.FromResult(streamMock.Object)); _mocker.GetMock <IFileStreamAdapter>() .Setup(x => x.SaveAsync(streamMock.Object, "c:\\myImage001.jpg", It.IsAny <CancellationToken>())) .Returns(Task.CompletedTask); // Act var images = (await _service.DownloadImagesAsync(metadata, folderPath)).ToList(); // Assert Assert.Single(images); Assert.Contains("c:\\myImage001.jpg", images); }
public async Task DownloadImagesAsync_ExistingImage_DownloadsAndSaves() { // Arrange string filePath = _temporalFiles.CreateTempFile(); string fileName = Path.GetFileName(filePath); var metadata = new BingArchiveDto { Images = new[] { new BingImagesArchiveDto { Url = Invariant(@$ "/th?id={fileName}") } } }; string folderPath = Path.GetTempPath(); var streamMock = new Mock <Stream>(); _mocker.GetMock <IHttpAdapter>() .Setup(x => x.GetStreamAsync(new Uri("https://www.bing.com/th?id=myImage001.jpg", UriKind.Absolute), It.IsAny <CancellationToken>())) .Returns(Task.FromResult(streamMock.Object)); // Act var images = (await _service.DownloadImagesAsync(metadata, folderPath)).ToList(); // Assert Assert.Empty(images); }
public async Task DownloadMetadataAsync_ExistingId_GetsFromAdapter() { // Arrange const int idx = 0; _mocker.GetMock <IHttpAdapter>() .Setup(x => x.GetFromJsonAsync <BingArchiveDto>("https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=10&mkt=en-US")) .Returns(Task.FromResult(new BingArchiveDto())); // Act BingArchiveDto actual = await _service.DownloadMetadataAsync(idx); // Assert Assert.NotNull(actual); }
public async Task <IEnumerable <string> > DownloadImagesAsync(BingArchiveDto metadata, string folderPath) { var cancellationTokenSource = new CancellationTokenSource(); var images = GetDownloadInfo(metadata, folderPath).ToList(); foreach ((Uri absoluteUri, string outputPath) in images) { try { var imageStream = await _httpAdapter.GetStreamAsync(absoluteUri, cancellationTokenSource.Token); await _streamAdapter.SaveAsync(imageStream, outputPath, cancellationTokenSource.Token); } catch (Exception) { cancellationTokenSource.Cancel(); throw; } } return(images.Select(x => x.OutputPath).ToList()); }
private static IEnumerable <(Uri AbsoluteUri, string OutputPath)> GetDownloadInfo(BingArchiveDto metadata, string folderPath) { const string FileNameKey = "id"; var baseUri = new Uri(BingBaseUrl, UriKind.Absolute); return(metadata.Images.Select(x => new { AbsoluteUri = new Uri(baseUri, x.Url), FileName = QueryStringParser.Parse(x.Url).TryGetValue(FileNameKey, out string id) ? id : null })