feat(tstest): Enhance tstest with fluent API, suite grouping, tag filtering, fixture & snapshot testing, and parallel execution improvements
This commit is contained in:
101
test/tapbundle/test.describe.ts
Normal file
101
test/tapbundle/test.describe.ts
Normal file
@@ -0,0 +1,101 @@
|
||||
import { tap, expect } from '../../ts_tapbundle/index.js';
|
||||
|
||||
// Global state for testing lifecycle hooks
|
||||
const lifecycleOrder: string[] = [];
|
||||
|
||||
tap.describe('Test Suite A', () => {
|
||||
tap.beforeEach(async (toolsArg) => {
|
||||
lifecycleOrder.push('Suite A - beforeEach');
|
||||
});
|
||||
|
||||
tap.afterEach(async (toolsArg) => {
|
||||
lifecycleOrder.push('Suite A - afterEach');
|
||||
});
|
||||
|
||||
tap.test('test 1 in suite A', async (toolsArg) => {
|
||||
lifecycleOrder.push('Test 1');
|
||||
expect(true).toBeTrue();
|
||||
});
|
||||
|
||||
tap.test('test 2 in suite A', async (toolsArg) => {
|
||||
lifecycleOrder.push('Test 2');
|
||||
expect(true).toBeTrue();
|
||||
});
|
||||
|
||||
tap.describe('Nested Suite B', () => {
|
||||
tap.beforeEach(async (toolsArg) => {
|
||||
lifecycleOrder.push('Suite B - beforeEach');
|
||||
});
|
||||
|
||||
tap.afterEach(async (toolsArg) => {
|
||||
lifecycleOrder.push('Suite B - afterEach');
|
||||
});
|
||||
|
||||
tap.test('test 1 in nested suite B', async (toolsArg) => {
|
||||
lifecycleOrder.push('Nested Test 1');
|
||||
expect(true).toBeTrue();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Test outside any suite
|
||||
tap.test('test outside suites', async (toolsArg) => {
|
||||
lifecycleOrder.push('Outside Test');
|
||||
expect(true).toBeTrue();
|
||||
});
|
||||
|
||||
tap.describe('Test Suite with errors', () => {
|
||||
tap.beforeEach(async (toolsArg) => {
|
||||
// Setup that might fail
|
||||
const data = await Promise.resolve({ value: 42 });
|
||||
toolsArg.testData = data;
|
||||
});
|
||||
|
||||
tap.test('test with error', async (toolsArg) => {
|
||||
// Verify that data from beforeEach is available
|
||||
expect(toolsArg.testData).toBeDefined();
|
||||
expect(toolsArg.testData.value).toEqual(42);
|
||||
|
||||
// Test that error handling works by catching an error
|
||||
try {
|
||||
throw new Error('Intentional error');
|
||||
} catch (error) {
|
||||
expect(error.message).toEqual('Intentional error');
|
||||
}
|
||||
});
|
||||
|
||||
tap.test('test with skip in suite', async (toolsArg) => {
|
||||
toolsArg.skip('Skipping this test in a suite');
|
||||
expect(false).toBeTrue();
|
||||
});
|
||||
});
|
||||
|
||||
// Verify lifecycle order - this test runs last to check if all hooks were called properly
|
||||
tap.test('verify lifecycle hook order', async (toolsArg) => {
|
||||
// Wait a bit to ensure all tests have completed
|
||||
await new Promise(resolve => setTimeout(resolve, 50));
|
||||
console.log('Lifecycle order:', lifecycleOrder);
|
||||
|
||||
// Check that the tests we expect to have run actually did
|
||||
expect(lifecycleOrder).toContain('Test 1');
|
||||
expect(lifecycleOrder).toContain('Test 2');
|
||||
expect(lifecycleOrder).toContain('Nested Test 1');
|
||||
|
||||
// Check that beforeEach was called before each test in Suite A
|
||||
const test1Index = lifecycleOrder.indexOf('Test 1');
|
||||
expect(test1Index).toBeGreaterThan(-1);
|
||||
const beforeTest1 = lifecycleOrder.slice(0, test1Index);
|
||||
expect(beforeTest1).toContain('Suite A - beforeEach');
|
||||
|
||||
// Check that afterEach was called after test 1
|
||||
const afterTest1 = lifecycleOrder.slice(test1Index + 1);
|
||||
expect(afterTest1).toContain('Suite A - afterEach');
|
||||
|
||||
// Check nested suite lifecycle
|
||||
const nestedTest1Index = lifecycleOrder.indexOf('Nested Test 1');
|
||||
expect(nestedTest1Index).toBeGreaterThan(-1);
|
||||
const beforeNestedTest1 = lifecycleOrder.slice(0, nestedTest1Index);
|
||||
expect(beforeNestedTest1).toContain('Suite B - beforeEach');
|
||||
});
|
||||
|
||||
tap.start();
|
Reference in New Issue
Block a user