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();
        }