using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Squirrel.Tests.TestHelpers { internal class FakeFixtureRepository : Sources.IFileDownloader { private readonly string _pkgId; private readonly IEnumerable _releases; public FakeFixtureRepository(string pkgId, bool mockLatestFullVer) { _pkgId = pkgId; var releases = ReleaseEntry.BuildReleasesFile(PathHelper.GetFixturesDir(), false) .Where(r => r.OriginalFilename.StartsWith(_pkgId)) .ToList(); if (mockLatestFullVer) { var minFullVer = releases.Where(r => !r.IsDelta).OrderBy(r => r.Version).First(); var maxfullVer = releases.Where(r => !r.IsDelta).OrderByDescending(r => r.Version).First(); var maxDeltaVer = releases.Where(r => r.IsDelta).OrderByDescending(r => r.Version).First(); // our fixtures don't have a full package for the latest version, we expect the tests to generate this file if (maxfullVer.Version < maxDeltaVer.Version) { var name = new ReleaseEntryName(maxfullVer.PackageId, maxDeltaVer.Version, false, maxfullVer.Rid); releases.Add(new ReleaseEntry("0000000000000000000000000000000000000000", name.ToFileName(), maxfullVer.Filesize)); } } _releases = releases; } public Task DownloadBytes(string url, string authorization = null, string accept = null) { if (url.Contains("/RELEASES?")) { MemoryStream ms = new MemoryStream(); ReleaseEntry.WriteReleaseFile(_releases, ms); return Task.FromResult(ms.ToArray()); } var rel = _releases.FirstOrDefault(r => url.EndsWith(r.OriginalFilename)); var filePath = PathHelper.GetFixture(rel.OriginalFilename); if (!File.Exists(filePath)) { throw new NotSupportedException("FakeFixtureRepository doesn't have: " + rel.OriginalFilename); } return Task.FromResult(File.ReadAllBytes(filePath)); } public Task DownloadFile(string url, string targetFile, Action progress, string authorization = null, string accept = null) { var rel = _releases.FirstOrDefault(r => url.EndsWith(r.OriginalFilename)); var filePath = PathHelper.GetFixture(rel.OriginalFilename); if (!File.Exists(filePath)) { throw new NotSupportedException("FakeFixtureRepository doesn't have: " + rel.OriginalFilename); } File.Copy(filePath, targetFile); progress(25); progress(50); progress(75); progress(100); return Task.CompletedTask; } public Task DownloadString(string url, string authorization = null, string accept = null) { if (!url.Contains("/RELEASES?")) { throw new NotImplementedException(); } MemoryStream ms = new MemoryStream(); ReleaseEntry.WriteReleaseFile(_releases, ms); return Task.FromResult(Encoding.UTF8.GetString(ms.ToArray())); } } }