prerender-404-500.test.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. import * as assert from 'node:assert/strict';
  2. import { describe, it, before, after } from 'node:test';
  3. import nodejs from '../dist/index.js';
  4. import { loadFixture, waitServerListen } from './test-utils.js';
  5. import * as cheerio from 'cheerio';
  6. /**
  7. * @typedef {import('../../../astro/test/test-utils').Fixture} Fixture
  8. */
  9. async function load() {
  10. const mod = await import(
  11. `./fixtures/prerender-404-500/dist/server/entry.mjs?dropcache=${Date.now()}`
  12. );
  13. return mod;
  14. }
  15. describe('Prerender 404', () => {
  16. /** @type {import('./test-utils').Fixture} */
  17. let fixture;
  18. let server;
  19. describe('With base', async () => {
  20. before(async () => {
  21. process.env.PRERENDER = true;
  22. fixture = await loadFixture({
  23. // inconsequential config that differs between tests
  24. // to bust cache and prevent modules and their state
  25. // from being reused
  26. site: 'https://test.dev/',
  27. base: '/some-base',
  28. root: './fixtures/prerender-404-500/',
  29. output: 'server',
  30. adapter: nodejs({ mode: 'standalone' }),
  31. });
  32. await fixture.build();
  33. const { startServer } = await load();
  34. let res = startServer();
  35. server = res.server;
  36. await waitServerListen(server.server);
  37. });
  38. after(async () => {
  39. await server.stop();
  40. await fixture.clean();
  41. delete process.env.PRERENDER;
  42. });
  43. it('Can render SSR route', async () => {
  44. const res = await fetch(`http://${server.host}:${server.port}/some-base/static`);
  45. const html = await res.text();
  46. const $ = cheerio.load(html);
  47. assert.equal(res.status, 200);
  48. assert.equal($('h1').text(), 'Hello world!');
  49. });
  50. it('Can handle prerendered 404', async () => {
  51. const url = `http://${server.host}:${server.port}/some-base/missing`;
  52. const res1 = await fetch(url);
  53. const res2 = await fetch(url);
  54. const res3 = await fetch(url);
  55. assert.equal(res1.status, 404);
  56. assert.equal(res2.status, 404);
  57. assert.equal(res3.status, 404);
  58. const html1 = await res1.text();
  59. const html2 = await res2.text();
  60. const html3 = await res3.text();
  61. assert.equal(html1, html2);
  62. assert.equal(html2, html3);
  63. const $ = cheerio.load(html1);
  64. assert.equal($('body').text(), 'Page does not exist');
  65. });
  66. it(' Can handle prerendered 500 called indirectly', async () => {
  67. const url = `http://${server.host}:${server.port}/some-base/fivehundred`;
  68. const response1 = await fetch(url);
  69. const response2 = await fetch(url);
  70. const response3 = await fetch(url);
  71. assert.equal(response1.status, 500);
  72. const html1 = await response1.text();
  73. const html2 = await response2.text();
  74. const html3 = await response3.text();
  75. assert.equal(html1.includes('Something went wrong'), true);
  76. assert.equal(html1, html2);
  77. assert.equal(html2, html3);
  78. });
  79. it('prerendered 500 page includes expected styles', async () => {
  80. const response = await fetch(`http://${server.host}:${server.port}/some-base/fivehundred`);
  81. const html = await response.text();
  82. const $ = cheerio.load(html);
  83. // length will be 0 if the stylesheet does not get included
  84. assert.equal($('style').length, 1);
  85. });
  86. });
  87. describe('Without base', async () => {
  88. before(async () => {
  89. process.env.PRERENDER = true;
  90. fixture = await loadFixture({
  91. // inconsequential config that differs between tests
  92. // to bust cache and prevent modules and their state
  93. // from being reused
  94. site: 'https://test.info/',
  95. root: './fixtures/prerender-404-500/',
  96. output: 'server',
  97. adapter: nodejs({ mode: 'standalone' }),
  98. });
  99. await fixture.build();
  100. const { startServer } = await load();
  101. let res = startServer();
  102. server = res.server;
  103. await waitServerListen(server.server);
  104. });
  105. after(async () => {
  106. await server.stop();
  107. await fixture.clean();
  108. delete process.env.PRERENDER;
  109. });
  110. it('Can render SSR route', async () => {
  111. const res = await fetch(`http://${server.host}:${server.port}/static`);
  112. const html = await res.text();
  113. const $ = cheerio.load(html);
  114. assert.equal(res.status, 200);
  115. assert.equal($('h1').text(), 'Hello world!');
  116. });
  117. it('Can handle prerendered 404', async () => {
  118. const url = `http://${server.host}:${server.port}/some-base/missing`;
  119. const res1 = await fetch(url);
  120. const res2 = await fetch(url);
  121. const res3 = await fetch(url);
  122. assert.equal(res1.status, 404);
  123. assert.equal(res2.status, 404);
  124. assert.equal(res3.status, 404);
  125. const html1 = await res1.text();
  126. const html2 = await res2.text();
  127. const html3 = await res3.text();
  128. assert.equal(html1, html2);
  129. assert.equal(html2, html3);
  130. const $ = cheerio.load(html1);
  131. assert.equal($('body').text(), 'Page does not exist');
  132. });
  133. });
  134. });
  135. describe('Hybrid 404', () => {
  136. /** @type {import('./test-utils').Fixture} */
  137. let fixture;
  138. let server;
  139. describe('With base', async () => {
  140. before(async () => {
  141. process.env.PRERENDER = false;
  142. fixture = await loadFixture({
  143. // inconsequential config that differs between tests
  144. // to bust cache and prevent modules and their state
  145. // from being reused
  146. site: 'https://test.com/',
  147. base: '/some-base',
  148. root: './fixtures/prerender-404-500/',
  149. output: 'hybrid',
  150. adapter: nodejs({ mode: 'standalone' }),
  151. });
  152. await fixture.build();
  153. const { startServer } = await load();
  154. let res = startServer();
  155. server = res.server;
  156. await waitServerListen(server.server);
  157. });
  158. after(async () => {
  159. await server.stop();
  160. await fixture.clean();
  161. delete process.env.PRERENDER;
  162. });
  163. it('Can render SSR route', async () => {
  164. const res = await fetch(`http://${server.host}:${server.port}/some-base/static`);
  165. const html = await res.text();
  166. const $ = cheerio.load(html);
  167. assert.equal(res.status, 200);
  168. assert.equal($('h1').text(), 'Hello world!');
  169. });
  170. it('Can handle prerendered 404', async () => {
  171. const url = `http://${server.host}:${server.port}/some-base/missing`;
  172. const res1 = await fetch(url);
  173. const res2 = await fetch(url);
  174. const res3 = await fetch(url);
  175. assert.equal(res1.status, 404);
  176. assert.equal(res2.status, 404);
  177. assert.equal(res3.status, 404);
  178. const html1 = await res1.text();
  179. const html2 = await res2.text();
  180. const html3 = await res3.text();
  181. assert.equal(html1, html2);
  182. assert.equal(html2, html3);
  183. const $ = cheerio.load(html1);
  184. assert.equal($('body').text(), 'Page does not exist');
  185. });
  186. });
  187. describe('Without base', async () => {
  188. before(async () => {
  189. process.env.PRERENDER = false;
  190. fixture = await loadFixture({
  191. // inconsequential config that differs between tests
  192. // to bust cache and prevent modules and their state
  193. // from being reused
  194. site: 'https://test.net/',
  195. root: './fixtures/prerender-404-500/',
  196. output: 'hybrid',
  197. adapter: nodejs({ mode: 'standalone' }),
  198. });
  199. await fixture.build();
  200. const { startServer } = await load();
  201. let res = startServer();
  202. server = res.server;
  203. await waitServerListen(server.server);
  204. });
  205. after(async () => {
  206. await server.stop();
  207. await fixture.clean();
  208. delete process.env.PRERENDER;
  209. });
  210. it('Can render SSR route', async () => {
  211. const res = await fetch(`http://${server.host}:${server.port}/static`);
  212. const html = await res.text();
  213. const $ = cheerio.load(html);
  214. assert.equal(res.status, 200);
  215. assert.equal($('h1').text(), 'Hello world!');
  216. });
  217. it('Can handle prerendered 404', async () => {
  218. const url = `http://${server.host}:${server.port}/missing`;
  219. const res1 = await fetch(url);
  220. const res2 = await fetch(url);
  221. const res3 = await fetch(url);
  222. assert.equal(res1.status, 404);
  223. assert.equal(res2.status, 404);
  224. assert.equal(res3.status, 404);
  225. const html1 = await res1.text();
  226. const html2 = await res2.text();
  227. const html3 = await res3.text();
  228. assert.equal(html1, html2);
  229. assert.equal(html2, html3);
  230. const $ = cheerio.load(html1);
  231. assert.equal($('body').text(), 'Page does not exist');
  232. });
  233. });
  234. });