summaryrefslogtreecommitdiff
path: root/cli/js/tests/fs_events_test.ts
blob: ad8ba8502c6b23a2bd8a7ce9ebf6fef01c31f778 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import { unitTest, assert } from "./test_util.ts";

// TODO(ry) Add more tests to specify format.

unitTest({ perms: { read: false } }, function watchFsPermissions() {
  let thrown = false;
  try {
    Deno.watchFs(".");
  } catch (err) {
    assert(err instanceof Deno.errors.PermissionDenied);
    thrown = true;
  }
  assert(thrown);
});

unitTest({ perms: { read: true } }, function watchFsInvalidPath() {
  let thrown = false;
  try {
    Deno.watchFs("non-existant.file");
  } catch (err) {
    console.error(err);
    if (Deno.build.os === "windows") {
      assert(
        err.message.includes(
          "Input watch path is neither a file nor a directory"
        )
      );
    } else {
      assert(err instanceof Deno.errors.NotFound);
    }
    thrown = true;
  }
  assert(thrown);
});

async function getTwoEvents(
  iter: AsyncIterableIterator<Deno.FsEvent>
): Promise<Deno.FsEvent[]> {
  const events = [];
  for await (const event of iter) {
    events.push(event);
    if (events.length > 2) break;
  }
  return events;
}

unitTest(
  { perms: { read: true, write: true } },
  async function watchFsBasic(): Promise<void> {
    const testDir = await Deno.makeTempDir();
    const iter = Deno.watchFs(testDir);

    // Asynchornously capture two fs events.
    const eventsPromise = getTwoEvents(iter);

    // Make some random file system activity.
    const file1 = testDir + "/file1.txt";
    const file2 = testDir + "/file2.txt";
    Deno.writeFileSync(file1, new Uint8Array([0, 1, 2]));
    Deno.writeFileSync(file2, new Uint8Array([0, 1, 2]));

    // We should have gotten two fs events.
    const events = await eventsPromise;
    assert(events.length >= 2);
    assert(events[0].kind == "create");
    assert(events[0].paths[0].includes(testDir));
    assert(events[1].kind == "create" || events[1].kind == "modify");
    assert(events[1].paths[0].includes(testDir));
  }
);