text: import {EventStatus} from "../../src/matrix";
  import {MatrixScheduler} from "../../src/scheduler";
  import {Room} from "../../src/models/room";
  import {TestClient} from "../TestClient";
  
  describe("MatrixClient retrying", function() {
      let client = null;
      let httpBackend = null;
      let scheduler;
      const userId = "@alice:localhost";
      const accessToken = "aseukfgwef";
      const roomId = "!room:here";
      let room;
  
      beforeEach(function() {
          scheduler = new MatrixScheduler();
          const testClient = new TestClient(
              userId,
              "DEVICE",
              accessToken,
              undefined,
              {scheduler},
          );
          httpBackend = testClient.httpBackend;
          client = testClient.client;
          room = new Room(roomId);
          client.store.storeRoom(room);
      });
  
      afterEach(function() {
          httpBackend.verifyNoOutstandingExpectation();
          return httpBackend.stop();
      });
  
      xit("should retry according to MatrixScheduler.retryFn", function() {
  
      });
  
      xit("should queue according to MatrixScheduler.queueFn", function() {
  
      });
  
      xit("should mark events as EventStatus.NOT_SENT when giving up", function() {
  
      });
  
      xit("should mark events as EventStatus.QUEUED when queued", function() {
  
      });
  
      it("should mark events as EventStatus.CANCELLED when cancelled", function() {
          // send a couple of events; the second will be queued
          const p1 = client.sendMessage(roomId, "m1").then(function(ev) {
              // we expect the first message to fail
              throw new Error('Message 1 unexpectedly sent successfully');
          }, (e) => {
              // this is expected
          });
  
          // XXX: it turns out that the promise returned by this message
          // never gets resolved.
          // https://github.com/matrix-org/matrix-js-sdk/issues/496
          client.sendMessage(roomId, "m2");
  
          // both events should be in the timeline at this point
          const tl = room.getLiveTimeline().getEvents();
          expect(tl.length).toEqual(2);
          const ev1 = tl[0];
          const ev2 = tl[1];
  
          expect(ev1.status).toEqual(EventStatus.SENDING);
          expect(ev2.status).toEqual(EventStatus.SENDING);
  
          // the first message should get sent, and the second should get queued
          httpBackend.when("PUT", "/send/m.room.message/").check(function(rq) {
              // ev2 should now have been queued
              expect(ev2.status).toEqual(EventStatus.QUEUED);
  
              // now we can cancel the second and check everything looks sane
              client.cancelPendingEvent(ev2);
              expect(ev2.status).toEqual(EventStatus.CANCELLED);
              expect(tl.length).toEqual(1);
  
              // shouldn't be able to cancel the first message yet
              expect(function() {
                  client.cancelPendingEvent(ev1);
              }).toThrow();
          }).respond(400); // fail the first message
  
          // wait for the localecho of ev1 to be updated
          const p3 = new Promise((resolve, reject) => {
              room.on("Room.localEchoUpdated", (ev0) => {
                  if (ev0 === ev1) {
                      resolve();
                  }
              });
          }).then(function() {
              expect(ev1.status).toEqual(EventStatus.NOT_SENT);
              expect(tl.length).toEqual(1);
  
              // cancel the first message
              client.cancelPendingEvent(ev1);
              expect(ev1.status).toEqual(EventStatus.CANCELLED);
              expect(tl.length).toEqual(0);
          });
  
          return Promise.all([
              p1,
              p3,
              httpBackend.flushAllExpected(),
          ]);
      });
  
      describe("resending", function() {
          xit("should be able to resend a NOT_SENT event", function() {
  
          });
          xit("should be able to resend a sent event", function() {
  
          });
      });
  });
  