import assert from 'node:assert/strict';
import { before, describe, it } from 'node:test';
import * as cheerio from 'cheerio';
import nodejs from '../dist/index.js';
import { type Fixture, loadFixture } from './test-utils.ts';

describe('Errors', () => {
	let fixture: Fixture;

	before(async () => {
		fixture = await loadFixture({
			root: './fixtures/errors/',
			output: 'server',
			adapter: nodejs({ mode: 'standalone' }),
		});
		await fixture.build();
	});

	it('rejected promise in template', {
		skip: true,
		todo: 'Review the response from the in-stream',
	}, async () => {
		const res = await fixture.fetch('/in-stream');
		const html = await res.text();
		const $ = cheerio.load(html);

		assert.equal($('p').text().trim(), 'Internal server error');
	});

	it('generator that throws called in template', {
		skip: true,
		todo: 'Review the response from the generator',
	}, async () => {
		const result = ['<!DOCTYPE html><h1>Astro</h1> 1', 'Internal server error'];

		const res: Response = await fixture.fetch('/generator');
		const reader = res.body!.getReader();
		const decoder = new TextDecoder();
		const chunk1 = await reader.read();
		const chunk2 = await reader.read();
		const chunk3 = await reader.read();
		assert.equal(chunk1.done, false);
		if (chunk2.done) {
			assert.equal(decoder.decode(chunk1.value), result.join(''));
		} else if (chunk3.done) {
			assert.equal(decoder.decode(chunk1.value), result[0]);
			assert.equal(decoder.decode(chunk2.value), result[1]);
		} else {
			throw new Error('The response should take at most 2 chunks.');
		}
	});
});