Beispiel #1
0
        public async Task StartDownloadForUnix_2Times()
        {
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { "https://exiftool.org/checksums.txt", new StringContent(ExampleCheckSum) },
                { "https://exiftool.org/Image-ExifTool-11.99.tar.gz", new ByteArrayContent(CreateAnExifToolTarGz.Bytes) }
            });

            _appSettings.Verbose = true;

            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());
            var result           = await new ExifToolDownload(httpClientHelper, _appSettings, new FakeIWebLogger()).StartDownloadForUnix();

            Assert.IsTrue(result);

            // And run again
            // ByteArray content is Disposed afterwards
            var fakeIHttpProvider2 = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { "https://exiftool.org/checksums.txt", new StringContent(ExampleCheckSum) },
                { "https://exiftool.org/Image-ExifTool-11.99.tar.gz", new ByteArrayContent(CreateAnExifToolTarGz.Bytes) }
            });
            var httpClientHelper2 = new HttpClientHelper(fakeIHttpProvider2, _serviceScopeFactory, new FakeIWebLogger());
            var result2           = await new ExifToolDownload(httpClientHelper2, _appSettings, new FakeIWebLogger()).StartDownloadForUnix();

            Assert.IsTrue(result2);

            _hostFileSystem.FolderDelete(ExifToolUnixTempPath);
        }
        public async Task IsUpdateNeeded_CacheIsFilled()
        {
            var provider = new ServiceCollection()
                           .AddMemoryCache()
                           .BuildServiceProvider();
            var memoryCache       = provider.GetService <IMemoryCache>();
            var replace           = ExamplePublicReleases.Replace("vtest__remove_this_version", "v0.9");
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { CheckForUpdates.GithubApi, new StringContent(replace) },
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            await new CheckForUpdates(httpClientHelper,
                                      new AppSettings(), memoryCache).IsUpdateNeeded();

            memoryCache.TryGetValue(CheckForUpdates.QueryCheckForUpdatesCacheName, out var cacheResult);
            var results = ((List <ReleaseModel>)cacheResult);

            Assert.IsNotNull(results);
            Assert.AreEqual("v0.9", results.FirstOrDefault().TagName);
            Assert.AreEqual("v0.4.0-beta.1", results[1].TagName);
            Assert.AreEqual(false, results[0].PreRelease);
            Assert.AreEqual(true, results[1].PreRelease);
        }
Beispiel #3
0
        public async Task GeoCliInput_AbsolutePath_HappyFlow()
        {
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            var storage = new FakeIStorage(new List <string> {
                "/"
            },
                                           new List <string> {
                "/test.jpg"
            },
                                           new List <byte[]> {
                CreateAnImage.Bytes
            });

            var appSettings = new AppSettings {
                Verbose = true
            };
            var geoWrite  = new FakeIGeoLocationWrite();
            var geoLookup = new FakeIGeoReverseLookup();
            var console   = new FakeConsoleWrapper();
            var geoCli    = new GeoCli(geoLookup, geoWrite,
                                       new FakeSelectorStorage(storage), appSettings,
                                       console, new FakeIGeoFileDownload(), new FakeExifToolDownload());
            await geoCli.CommandLineAsync(new List <string> {
                "-p", "/test"
            }.ToArray());

            Assert.AreEqual(appSettings.StorageFolder, "/test" + Path.DirectorySeparatorChar);
            Assert.AreEqual(1, geoLookup.Count);
            Assert.IsTrue(storage.ExistFile("/test.jpg"));
        }
Beispiel #4
0
        public async Task RunChmodOnExifToolUnixExe_TempFolderWithSpace_UnixOnly()
        {
            if (_appSettings.IsWindows)
            {
                Console.WriteLine("This test is for unix only");
                return;
            }

            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { "https://exiftool.org/checksums.txt", new StringContent(ExampleCheckSum) },
                { "https://exiftool.org/exiftool-11.99.zip", new ByteArrayContent(CreateAnExifToolWindows.Bytes) },
                { "https://exiftool.org/Image-ExifTool-11.99.tar.gz", new ByteArrayContent(CreateAnExifToolTarGz.Bytes) },
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());
            var appSettings      = await CreateTempFolderWithExifTool();

            Console.WriteLine(appSettings.TempFolder);
            var exifToolDownload = new ExifToolDownload(httpClientHelper, appSettings, new FakeIWebLogger());
            var result           = await exifToolDownload.RunChmodOnExifToolUnixExe();

            Assert.IsTrue(result);

            var lsLah = await Command.Run("ls", "-lah",
                                          Path.Combine(appSettings.TempFolder, "exiftool-unix", "exiftool")).Task;

            Console.WriteLine(lsLah.StandardOutput);

            Assert.IsTrue(lsLah.StandardOutput.StartsWith("-rwxr-xr-x"));
            Directory.Delete(appSettings.TempFolder, true);
        }
Beispiel #5
0
        public async Task RunChmodOnExifToolUnixExe_Chmod644_UnixOnly()
        {
            if (_appSettings.IsWindows)
            {
                Console.WriteLine("This test is for unix only");
                return;
            }

            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { "https://exiftool.org/checksums.txt", new StringContent(ExampleCheckSum) },
                { "https://exiftool.org/exiftool-11.99.zip", new ByteArrayContent(CreateAnExifToolWindows.Bytes) },
                { "https://exiftool.org/Image-ExifTool-11.99.tar.gz", new ByteArrayContent(CreateAnExifToolTarGz.Bytes) },
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            await CreateTempFolderWithExifTool("temp");

            // make NOT executable 644
            await Command.Run("chmod", "644",
                              Path.Combine(_appSettings.TempFolder, "exiftool-unix", "exiftool")).Task;

            var exifToolDownload = new ExifToolDownload(httpClientHelper, _appSettings, new FakeIWebLogger());
            var result           = await exifToolDownload.RunChmodOnExifToolUnixExe();

            Assert.IsTrue(result);


            Directory.Delete(_appSettings.TempFolder, true);
        }
Beispiel #6
0
        public void GetSystemDataTest()
        {
            var httpProvider     = new FakeIHttpProvider();
            var appSettings      = new AppSettings();
            var httpClientHelper = new HttpClientHelper(httpProvider, null !, new FakeIWebLogger());
            var packageTelemetry = new PackageTelemetry(httpClientHelper, new AppSettings(), new FakeIWebLogger(), new FakeIQuery());

            var systemData = packageTelemetry.GetSystemData();

            Assert.IsTrue(systemData.Any(p => p.Key == "AppVersion"));
            Assert.AreEqual(systemData.FirstOrDefault(p => p.Key == "AppVersion").Value,
                            appSettings.AppVersion);
            Assert.IsTrue(systemData.Any(p => p.Key == "NetVersion"));
            Assert.AreEqual(systemData.FirstOrDefault(p => p.Key == "NetVersion").Value,
                            RuntimeInformation.FrameworkDescription);
            Assert.IsTrue(systemData.Any(p => p.Key == "OSArchitecture"));
            Assert.AreEqual(systemData.FirstOrDefault(p => p.Key == "OSArchitecture").Value,
                            RuntimeInformation.OSArchitecture.ToString());
            Assert.IsTrue(systemData.Any(p => p.Key == "OSVersion"));
            Assert.IsTrue(systemData.Any(p => p.Key == "OSDescriptionLong"));
            Assert.IsTrue(systemData.Any(p => p.Key == "OSPlatform"));
            Assert.IsTrue(systemData.Any(p => p.Key == "DockerContainer"));
            Assert.IsTrue(systemData.Any(p => p.Key == "CurrentCulture"));
            Assert.IsTrue(systemData.Any(p => p.Key == "AspNetCoreEnvironment"));
        }
Beispiel #7
0
        public async Task GeoCliInput_Default_HappyFlow()
        {
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            var storage = new FakeIStorage(new List <string> {
                "/"
            },
                                           new List <string> {
                "/test.jpg"
            },
                                           new List <byte[]> {
                CreateAnImage.Bytes
            });
            var hash = (await new FileHash(storage).GetHashCodeAsync("/test.jpg")).Key;

            storage.FileCopy("/test.jpg", $"/{hash}.jpg");

            var geoWrite  = new FakeIGeoLocationWrite();
            var geoLookup = new FakeIGeoReverseLookup();
            var console   = new FakeConsoleWrapper();
            var geoCli    = new GeoCli(geoLookup, geoWrite,
                                       new FakeSelectorStorage(storage), new AppSettings(),
                                       console, new FakeIGeoFileDownload(), new FakeExifToolDownload());
            await geoCli.CommandLineAsync(new List <string> {
                "-p",
            }.ToArray());

            Assert.AreEqual(1, geoLookup.Count);
            Assert.IsTrue(storage.ExistFile($"/{hash}.jpg"));
            Assert.IsTrue(storage.ExistFile("/test.jpg"));
        }
        public async Task QueryIsUpdateNeeded_NotFound()
        {
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>());
            var httpClientHelper  = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            var results = await new CheckForUpdates(httpClientHelper,
                                                    new AppSettings(), null).QueryIsUpdateNeededAsync();

            Assert.AreEqual(0, results.Count);
        }
Beispiel #9
0
        public void AddAppSettingsData()
        {
            var httpProvider     = new FakeIHttpProvider();
            var appSettings      = new AppSettings();
            var httpClientHelper = new HttpClientHelper(httpProvider, null !, new FakeIWebLogger());
            var packageTelemetry = new PackageTelemetry(httpClientHelper, appSettings, new FakeIWebLogger(), new FakeIQuery());
            var result           = packageTelemetry.AddAppSettingsData(new List <KeyValuePair <string, string> >());

            Assert.IsTrue(result.Any(p => p.Key == "AppSettingsName"));
        }
Beispiel #10
0
        public async Task PackageTelemetrySend_Disabled()
        {
            var httpProvider = new FakeIHttpProvider();
            var appSettings  = new AppSettings {
                EnablePackageTelemetry = false
            };
            var httpClientHelper = new HttpClientHelper(httpProvider, null !, new FakeIWebLogger());
            var packageTelemetry = new PackageTelemetry(httpClientHelper, appSettings, new FakeIWebLogger(), new FakeIQuery());
            var result           = await packageTelemetry.PackageTelemetrySend();

            Assert.IsNull(result);
        }
Beispiel #11
0
        public async Task StartDownloadForUnix_Fail()
        {
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { "https://exiftool.org/checksums.txt", new StringContent(ExampleCheckSum) },
            });

            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            await new ExifToolDownload(httpClientHelper, _appSettings, new FakeIWebLogger()).
            StartDownloadForUnix();
        }
Beispiel #12
0
        public async Task DownloadCheckSums_BothServicesAreDown()
        {
            // Main & Mirror source are down
            var fakeIHttpProvider = new FakeIHttpProvider();
            var httpClientHelper  = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            // Main & Mirror source are down
            var result = await new ExifToolDownload(httpClientHelper, _appSettings, new FakeIWebLogger())
                         .DownloadCheckSums();

            Assert.AreEqual(null, result);
        }
Beispiel #13
0
        public async Task StartDownloadForUnix_WrongHash()
        {
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { "https://exiftool.org/checksums.txt", new StringContent(ExampleCheckSum) },
                { "https://exiftool.org/Image-ExifTool-11.99.tar.gz", new StringContent("FAIL") }
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());
            var result           = await new ExifToolDownload(httpClientHelper, _appSettings, new FakeIWebLogger()).StartDownloadForUnix();

            Assert.IsFalse(result);
        }
Beispiel #14
0
        public async Task PackageTelemetrySend_False_EnablePackageTelemetryDebug()
        {
            var httpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { "https://" + PackageTelemetry.PackageTelemetryUrl, new StringContent(string.Empty) }
            });
            var appSettings = new AppSettings {
                EnablePackageTelemetry = true, EnablePackageTelemetryDebug = true
            };
            var httpClientHelper = new HttpClientHelper(httpProvider, null !, new FakeIWebLogger());
            var packageTelemetry = new PackageTelemetry(httpClientHelper, appSettings, new FakeIWebLogger(), new FakeIQuery());
            var result           = await packageTelemetry.PackageTelemetrySend();

            Assert.IsNull(result);
        }
Beispiel #15
0
        public async Task DownloadCheckSums_BaseChecksumDoesExist()
        {
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { "https://exiftool.org/checksums.txt", new StringContent(ExampleCheckSum) },
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            // Happy flow
            var result = await new ExifToolDownload(httpClientHelper, _appSettings, new FakeIWebLogger())
                         .DownloadCheckSums();

            Assert.AreEqual(ExampleCheckSum, result.Value.Value);
            Assert.AreEqual(true, result.Value.Key);
        }
Beispiel #16
0
        public async Task DownloadCheckSums_BaseChecksumDoesNotExist()
        {
            // Main source is down, but mirror is up
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { "https://qdraw.nl/special/mirror/exiftool/checksums.txt", new StringContent(ExampleCheckSum) },
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            // Main source is down, but mirror is up
            var result = await new ExifToolDownload(httpClientHelper, _appSettings, new FakeIWebLogger())
                         .DownloadCheckSums();

            Assert.AreEqual(ExampleCheckSum, result.Value.Value);
            Assert.AreEqual(false, result.Value.Key);
        }
        public async Task IsUpdateNeeded_CacheIsNull()
        {
            var replace           = ExamplePublicReleases.Replace("vtest__remove_this_version", "test");
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { CheckForUpdates.GithubApi, new StringContent(replace) },
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            var results = await new CheckForUpdates(httpClientHelper,
                                                    new AppSettings {
                AddMemoryCache = true
            }, null).IsUpdateNeeded();

            Assert.IsNotNull(results);
            Assert.AreEqual(UpdateStatus.NoReleasesFound, results.Key);
        }
Beispiel #18
0
        public async Task GeoCliInput_Notfound()
        {
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            var console = new FakeConsoleWrapper();
            var geoCli  = new GeoCli(new FakeIGeoReverseLookup(), new FakeIGeoLocationWrite(),
                                     new FakeSelectorStorage(new FakeIStorage(new List <string> {
            })), new AppSettings(),
                                     console, new FakeIGeoFileDownload(), new FakeExifToolDownload());
            await geoCli.CommandLineAsync(new List <string> {
                "-p",
            }.ToArray());

            Assert.IsTrue(console.WrittenLines.LastOrDefault().Contains("not found"));
        }
        public async Task QueryIsUpdateNeeded()
        {
            var replace           = ExamplePublicReleases.Replace("vtest__remove_this_version", "v0.9");
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { CheckForUpdates.GithubApi, new StringContent(replace) },
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            var results = await new CheckForUpdates(httpClientHelper,
                                                    new AppSettings(), null).QueryIsUpdateNeededAsync();

            Assert.AreEqual("v0.9", results.FirstOrDefault().TagName);
            Assert.AreEqual("v0.4.0-beta.1", results[1].TagName);
            Assert.AreEqual(false, results[0].PreRelease);
            Assert.AreEqual(true, results[1].PreRelease);

            Assert.AreEqual(2, results.Count);
        }
Beispiel #20
0
        public void GetChecksumsFromTextFile_Good()
        {
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>());

            var example =
                "SHA1(Image-ExifTool-12.40.tar.gz)= 09f3bee6491251390028580eb8af990e79674ada\n" +
                "SHA1(exiftool-12.40.zip)= 9428bb167512a8eec5891d3b8d2341427688f2f8\n" +
                "SHA1(ExifTool-12.40.dmg)= e20ed19da096807774b68cf8c15e29f1903ca641\n" +
                "MD5 (Image-ExifTool-12.40.tar.gz) = 72b40d69cf518edebbf5b661465950e7\n" +
                "MD5 (exiftool-12.40.zip) = fc834fd43d79da19fcb6461fb791b275\n" +
                "MD5 (ExifTool-12.40.dmg) = b30e391a4b53564de60a72f4347cade4\n";

            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            var exifToolDownload = new ExifToolDownload(httpClientHelper, new AppSettings(),
                                                        new FakeIWebLogger(), new FakeIStorage());
            var result = exifToolDownload.GetChecksumsFromTextFile(example);

            Assert.AreEqual(3, result.Length);
        }
        public async Task IsUpdateNeeded_CacheExistButDisableInSettings()
        {
            var provider = new ServiceCollection()
                           .AddMemoryCache()
                           .BuildServiceProvider();
            var memoryCache = provider.GetService <IMemoryCache>();

            var replace           = ExamplePublicReleases.Replace("vtest__remove_this_version", "test");
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { CheckForUpdates.GithubApi, new StringContent(replace) },
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            var results = await new CheckForUpdates(httpClientHelper,
                                                    new AppSettings {
                AddMemoryCache = false
            }, memoryCache).IsUpdateNeeded();

            Assert.IsNotNull(results);
            Assert.AreEqual(UpdateStatus.NoReleasesFound, results.Key);
        }
Beispiel #22
0
        public void GetSystemDataTestDocker()
        {
            var httpProvider     = new FakeIHttpProvider();
            var httpClientHelper = new HttpClientHelper(httpProvider, null !, new FakeIWebLogger());
            var packageTelemetry = new PackageTelemetry(httpClientHelper, new AppSettings(), new FakeIWebLogger(), new FakeIQuery());

            var sourceValue = Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER");

            Environment.SetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER", "true");

            var systemData = packageTelemetry.GetSystemData(OSPlatform.Linux);

            Assert.AreEqual("True", systemData.FirstOrDefault(p => p.Key == "DockerContainer").Value);

            Environment.SetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER", "false");

            var systemDataFalse = packageTelemetry.GetSystemData(OSPlatform.Linux);

            Assert.AreEqual("False", systemDataFalse.FirstOrDefault(p => p.Key == "DockerContainer").Value);

            Environment.SetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER", sourceValue);
        }
Beispiel #23
0
        public async Task GetExifToolByOs()
        {
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { "https://exiftool.org/checksums.txt", new StringContent(ExampleCheckSum) },
                { "https://exiftool.org/exiftool-11.99.zip", new ByteArrayContent(CreateAnExifToolWindows.Bytes) },
                { "https://exiftool.org/Image-ExifTool-11.99.tar.gz", new ByteArrayContent(CreateAnExifToolTarGz.Bytes) },
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            var result = await new ExifToolDownload(httpClientHelper, _appSettings, new FakeIWebLogger()).DownloadExifTool(_appSettings.IsWindows);

            Assert.IsTrue(result);

            if (_hostFileSystem.ExistFolder(ExifToolWindowsTempPath))
            {
                _hostFileSystem.FolderDelete(ExifToolWindowsTempPath);
            }
            if (_hostFileSystem.ExistFolder(ExifToolUnixTempPath))
            {
                _hostFileSystem.FolderDelete(ExifToolUnixTempPath);
            }
        }
Beispiel #24
0
        public async Task DownloadForWindows_FromMirrorInsteadOfMainSource()
        {
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
                { "https://qdraw.nl/special/mirror/exiftool/exiftool-11.99.zip", new StringContent("FAIL") },
                { "https://qdraw.nl/special/mirror/exiftool/Image-ExifTool-11.99.tar.gz", new StringContent("FAIL") }
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            try
            {
                await new ExifToolDownload(httpClientHelper, _appSettings, new FakeIWebLogger())
                .DownloadForWindows("exiftool-11.99.zip", new List <string>().ToArray(), true);
            }
            catch (HttpRequestException httpRequestException)
            {
                // Expected:<checksum for ---/Debug/netcoreapp3.1/temp/exiftool.tar.gz is not valid
                Assert.IsTrue(httpRequestException.Message.Contains("checksum for "));
                Assert.IsTrue(httpRequestException.Message.Contains("is not valid"));
                return;
            }
            throw new HttpRequestException("This test should hit the catch");
        }
Beispiel #25
0
        public async Task GeoCliInput_RelativeUrl_HappyFlow()
        {
            var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary <string, HttpContent>
            {
            });
            var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger());

            var relativeParentFolder = new AppSettings().DatabasePathToFilePath(
                new StructureService(new FakeIStorage(), new AppSettings().Structure)
                .ParseSubfolders(0), false);

            var storage = new FakeIStorage(new List <string> {
                "/"
            },
                                           new List <string> {
                "/test.jpg"
            },
                                           new List <byte[]> {
                CreateAnImage.Bytes
            });

            var appSettings = new AppSettings();
            var geoWrite    = new FakeIGeoLocationWrite();
            var geoLookup   = new FakeIGeoReverseLookup();
            var console     = new FakeConsoleWrapper();
            var geoCli      = new GeoCli(geoLookup, geoWrite,
                                         new FakeSelectorStorage(storage), appSettings,
                                         console, new FakeIGeoFileDownload(), new FakeExifToolDownload());
            await geoCli.CommandLineAsync(new List <string> {
                "-g", "0"
            }.ToArray());

            Assert.AreEqual(appSettings.StorageFolder, relativeParentFolder + Path.DirectorySeparatorChar);
            Assert.AreEqual(1, geoLookup.Count);
            Assert.IsTrue(storage.ExistFile("/test.jpg"));
        }