summaryrefslogtreecommitdiff
path: root/test/snowpack-integration.test.js
blob: d48aa1a1fa49cc6b9424f197ebd1773ab9102800 (plain) (blame)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import { fileURLToPath } from 'url';
import { suite } from 'uvu';
import * as assert from 'uvu/assert';
import { createRuntime } from '../lib/runtime.js';
import { loadConfig } from '../lib/config.js';
import { promises as fsPromises } from 'fs';
import { relative as pathRelative } from 'path';

const { readdir, stat } = fsPromises;

const SnowpackDev = suite('snowpack.dev');

let runtime, cwd, setupError;

SnowpackDev.before(async () => {
  // Bug: Snowpack config is still loaded relative to the current working directory.
  cwd = process.cwd();
  process.chdir(fileURLToPath(new URL('../examples/snowpack/', import.meta.url)));

  const astroConfig = await loadConfig(fileURLToPath(new URL('../examples/snowpack', import.meta.url)));

  const logging = {
    level: 'error',
    dest: process.stderr,
  };

  try {
    runtime = await createRuntime(astroConfig, { logging });
  } catch (err) {
    // eslint-disable-next-line no-console
    console.error(err);
    setupError = err;
  }
});

SnowpackDev.after(async () => {
  process.chdir(cwd);
  (await runtime) && runtime.shutdown();
});
/** create an iterator for all page files */
async function* allPageFiles(root) {
  for (const filename of await readdir(root)) {
    const fullpath = new URL(filename, root);
    const info = await stat(fullpath);

    if (info.isDirectory()) {
      yield* allPageFiles(new URL(fullpath + '/'));
    } else {
      yield fullpath;
    }
  }
}
/** create an iterator for all pages and yield the relative paths */
async function* allPages(root) {
  for await (let fileURL of allPageFiles(root)) {
    let bare = fileURLToPath(fileURL)
      .replace(/\.(astro|md)$/, '')
      .replace(/index$/, '');

    yield '/' + pathRelative(fileURLToPath(root), bare);
  }
}

SnowpackDev('No error creating the runtime', () => {
  assert.equal(setupError, undefined);
});

SnowpackDev('Can load every page', async () => {
  const failed = [];

  const pageRoot = new URL('../examples/snowpack/astro/pages/', import.meta.url);
  for await (let pathname of allPages(pageRoot)) {
    if (pathname.includes('proof-of-concept-dynamic')) {
      continue;
    }
    const result = await runtime.load(pathname);
    if (result.statusCode === 500) {
      failed.push({ ...result, pathname });
      continue;
    }
    assert.equal(result.statusCode, 200, `Loading ${pathname}`);
  }

  if (failed.length > 0) {
    // eslint-disable-next-line no-console
    console.error(failed);
  }
  assert.equal(failed.length, 0, 'Failed pages');
});

SnowpackDev.run();