1'use strict'; 2const common = require('../../../common'); 3const assert = require('assert'); 4const { test, describe, it, before, after, beforeEach, afterEach } = require('node:test'); 5 6before((t) => t.diagnostic('before 1 called')); 7after((t) => t.diagnostic('after 1 called')); 8 9describe('describe hooks', () => { 10 const testArr = []; 11 before(function() { 12 testArr.push('before ' + this.name); 13 }); 14 after(function() { 15 testArr.push('after ' + this.name); 16 assert.deepStrictEqual(testArr, [ 17 'before describe hooks', 18 'beforeEach 1', '1', 'afterEach 1', 19 'beforeEach 2', '2', 'afterEach 2', 20 'before nested', 21 'beforeEach nested 1', '+beforeEach nested 1', 'nested 1', 'afterEach nested 1', '+afterEach nested 1', 22 'beforeEach nested 2', '+beforeEach nested 2', 'nested 2', 'afterEach nested 2', '+afterEach nested 2', 23 'after nested', 24 'after describe hooks', 25 ]); 26 }); 27 beforeEach(function() { 28 testArr.push('beforeEach ' + this.name); 29 }); 30 afterEach(function() { 31 testArr.push('afterEach ' + this.name); 32 }); 33 34 it('1', () => testArr.push('1')); 35 test('2', () => testArr.push('2')); 36 37 describe('nested', () => { 38 before(function() { 39 testArr.push('before ' + this.name); 40 }); 41 after(function() { 42 testArr.push('after ' + this.name); 43 }); 44 beforeEach(function() { 45 testArr.push('+beforeEach ' + this.name); 46 }); 47 afterEach(function() { 48 testArr.push('+afterEach ' + this.name); 49 }); 50 it('nested 1', () => testArr.push('nested 1')); 51 test('nested 2', () => testArr.push('nested 2')); 52 }); 53}); 54 55describe('before throws', () => { 56 before(() => { throw new Error('before'); }); 57 it('1', () => {}); 58 test('2', () => {}); 59}); 60 61describe('after throws', () => { 62 after(() => { throw new Error('after'); }); 63 it('1', () => {}); 64 test('2', () => {}); 65}); 66 67describe('beforeEach throws', () => { 68 beforeEach(() => { throw new Error('beforeEach'); }); 69 it('1', () => {}); 70 test('2', () => {}); 71}); 72 73describe('afterEach throws', () => { 74 afterEach(() => { throw new Error('afterEach'); }); 75 it('1', () => {}); 76 test('2', () => {}); 77}); 78 79describe('afterEach when test fails', () => { 80 afterEach(common.mustCall(2)); 81 it('1', () => { throw new Error('test'); }); 82 test('2', () => {}); 83}); 84 85describe('afterEach throws and test fails', () => { 86 afterEach(() => { throw new Error('afterEach'); }); 87 it('1', () => { throw new Error('test'); }); 88 test('2', () => {}); 89}); 90 91test('test hooks', async (t) => { 92 const testArr = []; 93 94 t.before((t) => testArr.push('before ' + t.name)); 95 t.after(common.mustCall((t) => testArr.push('after ' + t.name))); 96 t.beforeEach((t) => testArr.push('beforeEach ' + t.name)); 97 t.afterEach((t) => testArr.push('afterEach ' + t.name)); 98 await t.test('1', () => testArr.push('1')); 99 await t.test('2', () => testArr.push('2')); 100 101 await t.test('nested', async (t) => { 102 t.before((t) => testArr.push('nested before ' + t.name)); 103 t.after((t) => testArr.push('nested after ' + t.name)); 104 t.beforeEach((t) => testArr.push('nested beforeEach ' + t.name)); 105 t.afterEach((t) => testArr.push('nested afterEach ' + t.name)); 106 await t.test('nested 1', () => testArr.push('nested1')); 107 await t.test('nested 2', () => testArr.push('nested 2')); 108 }); 109 110 t.after(common.mustCall(() => { 111 assert.deepStrictEqual(testArr, [ 112 'before test hooks', 113 'beforeEach 1', '1', 'afterEach 1', 114 'beforeEach 2', '2', 'afterEach 2', 115 'beforeEach nested', 116 'nested before nested', 117 'beforeEach nested 1', 'nested beforeEach nested 1', 'nested1', 'afterEach nested 1', 'nested afterEach nested 1', 118 'beforeEach nested 2', 'nested beforeEach nested 2', 'nested 2', 'afterEach nested 2', 'nested afterEach nested 2', 119 'afterEach nested', 120 'nested after nested', 121 'after test hooks', 122 ]); 123 })); 124}); 125 126test('t.before throws', async (t) => { 127 t.after(common.mustCall()); 128 t.before(() => { throw new Error('before'); }); 129 await t.test('1', () => {}); 130 await t.test('2', () => {}); 131}); 132 133test('t.beforeEach throws', async (t) => { 134 t.after(common.mustCall()); 135 t.beforeEach(() => { throw new Error('beforeEach'); }); 136 await t.test('1', () => {}); 137 await t.test('2', () => {}); 138}); 139 140test('t.afterEach throws', async (t) => { 141 t.after(common.mustCall()); 142 t.afterEach(() => { throw new Error('afterEach'); }); 143 await t.test('1', () => {}); 144 await t.test('2', () => {}); 145}); 146 147 148test('afterEach when test fails', async (t) => { 149 t.after(common.mustCall()); 150 t.afterEach(common.mustCall(2)); 151 await t.test('1', () => { throw new Error('test'); }); 152 await t.test('2', () => {}); 153}); 154 155test('afterEach throws and test fails', async (t) => { 156 t.after(common.mustCall()); 157 t.afterEach(() => { throw new Error('afterEach'); }); 158 await t.test('1', () => { throw new Error('test'); }); 159 await t.test('2', () => {}); 160}); 161 162test('t.after() is called if test body throws', (t) => { 163 t.after(() => { 164 t.diagnostic('- after() called'); 165 }); 166 throw new Error('bye'); 167}); 168 169before((t) => t.diagnostic('before 2 called')); 170after((t) => t.diagnostic('after 2 called')); 171