Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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());
        }
Exemplo n.º 5
0
        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
            })