mercredi 19 août 2020

Use jest for testing timeouts calling recursive function

I want to test the following code:

const poll = (maxTries, interval, channel, stopTime) => {
    let reached = 1;
    const someInformation = someGetter();
    const fetchData = async (resolve, reject) => {
        const data = await networkClass.someApiCall();
        if (data.stopTime === 1581516005) {
            console.log("cond true");
            someInformation.meta1 = transFormer(someInformation);
            someInformation.meta2 = transFormer(someInformation);
            someInformation.meta3 = {
                ...someInformation.meta1,
                data,
            };

            resolve(someInformation);
        } else if (reached < maxTries) {
            reached += 1;
            console.log("do it again");
            setTimeout(fetchData, interval, resolve, reject);
        } else {
            reject(new Error('max retries reached'));
        }
    };

    return new Promise(fetchData);
};

const checkForUpdates = () => {
    setTimeout(() => {
        poll(/* max retries */ 10, /* polling interval */ 1000, channel, stopTime)
            .then((res) => {
                setData(res);
                console.log({ res: res.meta3.data });
            })
            .catch((e) => console.log({ e }));
    }, 20000);
};

The test looks like that:

 it(`should do stuff`, () => {
      jest.spyOn(networkClass, 'someApiCall')
          .mockResolvedValueOnce({ stopTime })
          .mockResolvedValueOnce({ stopTime })
          .mockResolvedValueOnce({ stopTime: 1581516005 });

      checkForUpdates();
      jest.advanceTimersByTime(40000);

      expect(setDataMock).toHaveBeenCalled();
});

That console.log (console.log("do it again");) is only printed once, as if the test would not be able to call a setTimeout within a setTimeout. Do you have any ideas what might help?

Aucun commentaire:

Enregistrer un commentaire