public void ExportManager_chains_exporter_to_packager() { // Arrange XUri dekiApiUri = new XUri("http://mock/@api/deki"); XDoc exportDocument = new XDoc("export"); XUri item1Uri = dekiApiUri.At("foo", "bar", "abc"); XDoc item1Doc = new XDoc("item1"); XUri item2Uri = dekiApiUri.At("foo", "bar", "def"); XDoc item2Doc = new XDoc("item2"); XDoc exportResponse = new XDoc("export") .Start("requests") .Start("request") .Attr("method", "GET") .Attr("dataid", "abc") .Attr("href", item1Uri) .Start("header").Attr("name", "h_1").Attr("value", "v_1").End() .Start("header").Attr("name", "h_2").Attr("value", "v_2").End() .End() .Start("request") .Attr("method", "GET") .Attr("dataid", "def") .Attr("href", item2Uri) .End() .End() .Start("manifest") .Start("foo").Attr("dataid", "abc").End() .Start("bar").Attr("dataid", "def").End() .End(); AutoMockPlug mock = MockPlug.Register(dekiApiUri); mock.Expect().Verb("POST").Uri(dekiApiUri.At("site", "export").With("relto", "0")).RequestDocument(exportDocument).Response(DreamMessage.Ok(exportResponse)); mock.Expect().Verb("GET").Uri(item1Uri).RequestHeader("h_1", "v_1").RequestHeader("h_2", "v_2").Response(DreamMessage.Ok(item1Doc)); mock.Expect().Verb("GET").Uri(item2Uri).Response(DreamMessage.Ok(item2Doc)); var writes = new List <string>(); var mockPackageWriter = new Mock <IPackageWriter>(); mockPackageWriter.Setup(x => x.WriteDataAsync(It.IsAny <ExportItem>(), It.IsAny <Result>())) .Returns(() => new Result().WithReturn()) .Callback((ExportItem item, Result result) => writes.Add(item.DataId)) .AtMost(2) .Verifiable(); mockPackageWriter.Setup(x => x.WriteManifest(It.IsAny <XDoc>(), It.IsAny <Result>())) .Returns(() => new Result().WithReturn()) .AtMostOnce() .Verifiable(); // Act ExportManager manager = ExportManager.CreateAsync(Plug.New(dekiApiUri), exportDocument, 0, mockPackageWriter.Object, new Result <ExportManager>()).Wait(); manager.ExportAsync(new Result()).Wait(); // Assert Assert.IsTrue(mock.WaitAndVerify(TimeSpan.FromSeconds(1)), mock.VerificationFailure); Assert.AreEqual(2, manager.TotalItems); Assert.AreEqual(2, manager.CompletedItems); Assert.AreEqual(new[] { "abc", "def" }, writes.ToArray()); mockPackageWriter.Verify(x => x.Dispose(), Times.Once()); mockPackageWriter.VerifyAll(); }
/// <summary> /// CreateZipArchive data /// </summary> /// <returns></returns> public async Task <IActionResult> Export() { var(stream, contentType, name) = await ExportManager.ExportAsync(); return(File(stream, contentType, name)); }
private static void Export(Opts opts) { Result <ExportManager> managerResult; if (opts.Archive) { if (opts.Test) { return; } managerResult = opts.ExportRelto.HasValue ? ExportManager.CreateArchiveExportManagerAsync(opts.DekiApi, opts.ExportDocument, opts.ExportRelto.Value, opts.FilePath, new Result <ExportManager>()) : ExportManager.CreateArchiveExportManagerAsync(opts.DekiApi, opts.ExportDocument, opts.ExportReltoPath, opts.FilePath, new Result <ExportManager>()); } else { if (!Directory.Exists(opts.FilePath)) { try { Directory.CreateDirectory(opts.FilePath); } catch (Exception e) { throw new ConfigurationException(string.Format("Unable to create '{0}': {1}", opts.FilePath, e.Message), e); } } if (opts.Test) { return; } managerResult = opts.ExportRelto.HasValue ? ExportManager.CreateFileExportManagerAsync(opts.DekiApi, opts.ExportDocument, opts.ExportRelto.Value, opts.FilePath, new Result <ExportManager>()) : ExportManager.CreateFileExportManagerAsync(opts.DekiApi, opts.ExportDocument, opts.ExportReltoPath, opts.FilePath, new Result <ExportManager>()); } managerResult.Block(); if (managerResult.HasException) { throw new Exception(string.Format("Export failed: {0}", managerResult.Exception.Message), managerResult.Exception); } ExportManager manager = managerResult.Value; manager.MaxRetries = opts.Retries; Result result = manager.ExportAsync(manifest => FixupManifest(manifest, opts), new Result()); int completed = 0; Console.WriteLine("Exporting: {0}", opts.FilePath); if (manager.TotalItems == 0) { throw new Exception("nothing to export"); } while (!result.HasFinished) { Thread.Sleep(200); if (manager.CompletedItems <= completed) { continue; } if (SysUtil.IsUnix) { Console.WriteLine(" {0} of {1} files ({2:0}%)", manager.CompletedItems, manager.TotalItems, 100.0 * manager.CompletedItems / manager.TotalItems); } else { Console.Write(" {0} of {1} files ({2:0}%) \r", manager.CompletedItems, manager.TotalItems, 100.0 * manager.CompletedItems / manager.TotalItems); } completed = manager.CompletedItems; } if (!SysUtil.IsUnix) { Console.WriteLine(); } if (result.HasException) { ExportException exportException = result.Exception as ExportException; if (exportException != null) { Console.WriteLine("Export failed on Item:\r\n{0}", exportException.ManifestItem.ToPrettyString()); } throw new Exception(string.Format("Export failed: {0}", result.Exception.Message), result.Exception); } }