import { init } from '../context';

it('ignores the autocompletion results if Escape was pressed', async () => {
  const ctx = await init();

  // First request for the local autocomplete index was done
  expect(fetch).toHaveBeenCalledTimes(1);

  await Promise.all([ctx.setInput('mar'), ctx.keyDown('Escape')]);

  // The input must be empty because the user typed `mar` and pressed `Escape` right after that
  ctx.expectUi().toMatchInlineSnapshot(`
    {
      "input": "mar<>",
      "suggestions": [],
    }
  `);

  // No new requests must've been sent because the input was debounced early
  expect(fetch).toHaveBeenCalledTimes(1);

  await ctx.setInput('mar');

  ctx.expectUi().toMatchInlineSnapshot(`
    {
      "input": "mar<>",
      "suggestions": [
        "marvelous → beautiful  30",
        "mare  20",
        "market  10",
      ],
    }
  `);

  // Second request for the server-side suggestions.
  expect(fetch).toHaveBeenCalledTimes(2);

  ctx.setInput('mare');

  // After 300 milliseconds the debounce threshold is over, and the server-side
  // completions request is issued.
  vi.advanceTimersByTime(300);

  await ctx.keyDown('Escape');

  expect(fetch).toHaveBeenCalledTimes(3);

  ctx.expectUi().toMatchInlineSnapshot(`
    {
      "input": "mare<>",
      "suggestions": [],
    }
  `);

  ctx.setInput('mare');

  // Make sure that the user gets the results immediately without any debouncing (0 ms)
  await vi.advanceTimersByTimeAsync(0);

  ctx.expectUi().toMatchInlineSnapshot(`
    {
      "input": "mare<>",
      "suggestions": [
        "mare  20",
      ],
    }
  `);

  // The results must come from the cache, so no new fetch calls must have been made
  expect(fetch).toHaveBeenCalledTimes(3);
});